GPT-SoVITS
GPT-SoVITS copied to clipboard
建议增加对日语韵律音高信息的支持以提高语音合成质量
目前项目的日语语音合成前端直接使用pyopenjtalk的g2p函数来获取分词结果,然后将其直接输入模型。惊人的是,当前GPT模型已经在没有音高标注的情况下,通过自身的学习能力,实现了对音高的建模,取得了令人满意的韵律效果。
然而,日语语音合成在许多情况下需要准确的音高信息以实现更精准的语音控制。这一点在处理特殊词汇和人名时尤其重要,因为pyopenjtalk和GPT模型都可能无法准确标注这些词汇的正确音调需要手动标注。这些音高信息可以直接从pyopenjtalk的extract_fullcontext函数中获取。
相关的解析代码可以参考espnet(Apache-2.0 license)的pyopenjtalk_g2p_prosody(text: str, drop_unvoiced_vowels: bool = True)
其解析结果如下:
pyopenjtalk.extract_fullcontext("たくさんの期待に全部応えて、私だけの走りを見せたい。 ――マックイーンさんみたいに!")
output = ['^', 't', 'a', '[', 'k', 'u', 's', 'a', 'N', 'n', 'o', '#', 'k', 'i', '[', 't', 'a', 'i', 'n', 'i', '#', 'z', 'e', ']', 'N', 'b', 'u', '#', 'k', 'o', '[', 't', 'a', ']', 'e', 't', 'e', '_', 'w', 'a', '[', 't', 'a', 'sh', 'i', 'd', 'a', 'k', 'e', 'n', 'o', '#', 'h', 'a', '[', 'sh', 'i', 'r', 'i', ']', 'o', '#', 'm', 'i', '[', 's', 'e', 't', 'a', ']', 'i', '_', 'm', 'a', '[', 'cl', 'k', 'u', 'i', ']', 'i', 'N', 's', 'a', 'N', '#', 'm', 'i', ']', 't', 'a', 'i', 'n', 'i', '$']
该解析结果与直接调用调用pyopenjtalk.g2p相比,引入了韵律指示符号。
我们可以利用[、]这类符号(^ #和$似乎在很多项目中都没有引用)来指导音高,或者根据这些符号对每个音素标注高(H)或低(L)以表示音高。 这意味着在后续出现音高错误时,我们可以通过手动控制音高标注以修正错误,达到更好的合成效果。
值得注意的是,由于这些符号原本并不包含在现有的符号集内,整合这一改进可能需要修改符号集并对模型进行一定的微调。
@Akito-UzukiP 你是否愿意pr来帮助gpt-sovits进行日文合成的改进?欢迎你的贡献!
更换日文的文本前端后,我会对模型重新训练。
当然可以!我正在尝试更改,完成之后我会提出pr,感谢!
当然可以!我正在尝试更改,完成之后我会提出pr,感谢!
对了,你修改后,是要重新训练模型,所以我在新模型出来前先不要合并,影响老模型推理,是吗?
但是我有个问题,这样会不会失去一些人物的说话特征,比如一些名人本身就有口音或者自己的发音特征?
但是我有个问题,这样会不会失去一些人物的说话特征,比如一些名人本身就有口音或者自己的发音特征?
这的确是一个很大的问题...还有东京方言和各个地方方言的差别,以及openjtalk本身注音准确率并不完美的问题 目前我提的pr里加入了相关的代码,但是都注释掉了,我正在进行加符号微调的尝试,看看具体的情况
我觉得吧,你给自己上工作量之前先把具体问题和困境罗列出来交给AI参谋们,如果chatgpt和bard可以设计一个很好的思路再开始动手省的劳心劳力最后发现自己试了个错,这太打击人了- -#
我觉得吧,你给自己上工作量之前先把具体问题和困境罗列出来交给AI参谋们,如果chatgpt和bard可以设计一个很好的思路再开始动手省的劳心劳力最后发现自己试了个错,这太打击人了- -#
加上 [ ] symbol之后在100h数据集上微调了4epoch(约3h 4080laptop) AR模型能学到从[ ]提取音高信息 甚至能一定程度上纠正openjtalk前端的注音badcase 而对于openjtalk正确标注而AR模型”一意孤行“的badcase,也能通过手动增加] ] ] 的phone token来强制纠正。
有时间了我会放个demo看看
逻辑上应该是openjtalk--->extract_fullcontext--->gpt模型,所以最后还是会复合训练目标的口癖,只是基准更加准确了吧?
逻辑上应该是openjtalk--->extract_fullcontext--->gpt模型,所以最后还是会复合训练目标的口癖,只是基准更加准确了吧?
对 只是引入了2个额外的音高指示符号,如果GPT想的话可以从这里学习和利用音高信息,而很多情况它也会选择忽视这个符号(就像它经常做的那样)去用自己的经验发音 关西方言还没做过实验,不知道会是什么情况(不过好像原来就不是很好的样子...)