1. c++编译并使用.so
g++ demo.cpp CrystalDll.so -o main
export LD_LIBRARY_PATH="./"
./main
2. 对接CrystalTTS的边界情况和标贝数据的边界情况以及声韵母统一.
CrystalTTS:
这是个测试,有没有装你好啊汪仔。
zh-e4|sh-iy4|g-e5|@c-e4|sh-iy4|@。iou3|m-ei2|iou3|@zh-uang1|n-i6|h-ao3|a5|@uang1|z-ix1|@。
标贝:
中文韵律结构标注包含韵律词(#1)、韵律短语(#2)、语调短语(#3)、句末(#4)四个层级的标注。
该公司#1 当时#1 表示#3,将于#1 本周一#2 公布#1 正式#1 消息#4。
gai1 gong1 si1 dang1 shi2 biao3 shi4 jiang1 yu2 ben3 zhou1 yi1 gong1 bu4 zheng4 shi4 xiao1 xi5
后来预处理的是静北师兄的G2P:
所以对比起来, https://blog.csdn.net/brandon2015/article/details/50218777和标贝的实际上不好区分, 而Crystal明显最小单位是韵律短语#2, 而#1的停顿太小, 忽略掉, 去尝试.
目前是加成#2, 然后中间多些标点, 能够弥补语调短语.
声韵母类别是统一的, 静北师兄的G2P和Crystal是一个库, 但是有些结尾的转换是不同的, 上下文和算法的不同所导致, 都是正确的, 对于合成也没有影响. 但是下一版自己数据的设定需要统一.
3. python调用C++的.so库, 并且修正handle指针的4字节和8字节
https://www.douban.com/note/133696430/
https://bbs.csdn.net/topics/392194401
def __init__(self, dllpath = u'./CrystalDll.so'):
self._dllpath = dllpath
print(os.path.abspath(dllpath))
self._libc = ctypes.cdll.LoadLibrary(self._dllpath)
print('load ok')
self._tts = None
#def initialize(self, textpath = u'CrystalTTS/data/putonghua/text'):
def initialize(self, textpath = u'../data/putonghua/text'):
langtag = c_wchar_p(u"zh-cmn")
dirtext = c_wchar_p(textpath)
dirvoice= c_wchar_p(u"")
class handle_t(Structure):
pass
self._libc.ttsInitialize.restype = POINTER(handle_t)
self._tts = self._libc.ttsInitialize(langtag, dirtext, dirvoice)
综合起来, 使用如下(注意路径):
# Crasytal TTS./home/ec2-user/Tmp_why_interface_for_Demo_child0.2/tmp_tacotron_why_child0.2/CrystalTTS/demo
sys.path.append('/home/ec2-user/Tmp_why_interface_for_Demo_child0.2/tmp_tacotron_why_child0.2/CrystalTTS/demo')
from CrystalTTS import CrystalTTS
CTOP = CrystalTTS(dllpath = u'/home/ec2-user/Tmp_why_interface_for_Demo_child0.2/tmp_tacotron_why_child0.2/CrystalTTS/demo/CrystalDll.so')
CTOP.initialize(textpath = u'/home/ec2-user/Tmp_why_interface_for_Demo_child0.2/tmp_tacotron_why_child0.2/CrystalTTS/data/putonghua/text')
c2p = settings.CTOP
text = str
print(text)
Crystal_file_name = 'child0.2_' +time.strftime('%Y-%m-%d%H-%M-%S_', time.localtime(time.time())) + change_int2str(random.randint(100000, 999999)) + '.txt'
tag_ans = c2p.textAnalyze(text, Crystal_file_name)
if tag_ans != 1:
return HttpResponse('CtystalTTS is wrong, try again~')
with open(Crystal_file_name, 'r', encoding='utf-8-sig') as f:
raw_phoneme = f.read().strip()
print(raw_phoneme)
phoneme = raw_phoneme.replace('-', '_').replace('|', '_ _').replace('@', '/_2_ _').replace('。', '。_ _').replace('1', '_1').replace('2', '_2').replace('3', '_3').replace('4', '_4').replace('5', '_5').replace('6', '_6')
4. 综合搭建
[hujk17@mjrc-server10 Tmp_why_interface_for_DemoAndIterate]$ scp -r CrystalTTS 54.175.104.170@ec2-user:/home/ec2-user/Tmp_why_interface_for_Demo_child0.2/tmp_tacotron_why_child0.2/
ssh: Could not resolve hostname ec2-user: Name or service not known
lost connection
标点符号不能出现在url中, 是个问题.如何解决?
韵律边界当做#2, 会有些不舒服,
所以重新训练模型, 使用Crystal前端处理. 查看效果.
Crystal retrain child0.2 效果
1.7w的效果就很好, 只是好像又把标点符号弄没了. 在训练。
解决标点符号:
https://docs.djangoproject.com/en/1.9/topics/http/urls/
测试它:
合并实验:
1.7w步的实验还挺好, 为了对接, 直接迁入到测试过的网站中.
Tensorflow 同时加载多个模型,以及与keras模型混用:
https://blog.csdn.net/googler_offer/article/details/91416521
但是现在先不用, 浪费时间, 采取多个端口开django的方法.
但是科研的时候, 仍使用: 训练语料都有标注好的韵律边界信息.
注意utf-8-sig的使用, 测一下第一个文本的发音. UTF-8文件的boom问题. *********以前的实验都有点漏掉这个!
声调中有6?这是怎么回事?
python的replace太难受了. 只能一连串的用.
直观上, teacherForce的结果更有韵律, 所以思考如何接近, 或者启用那个rate.