我是roblox的游戏开发人员,我正在尝试使用基于CMU词典的lua和预先录制的音素制作一个体面的语音合成/文本到语音系统:
http://www.speech.cs.cmu.edu/cgi-bin/cmudict
我以前从未做过文字转言或类似的事情,所以请耐心等待。
到目前为止我是如何做到的,一旦玩家输入文字,它会遍历每个单词并从此处设置音素:
http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/cmudict-0.7b
然后,它会逐个播放每个单词的每个音素集,并在播放下一个音素之前以恒定的时间偏移。即,
if Phoneme.TimePosition>=_end-(_end-_start)*0.4 then
音素是与音素对应的声音对象(我用麦克风录制了39个音素并将声音对象链接到相应的文件),_end
是声音文件长度,_start
是0 ,当然
结果如下:
虽然它并不完全可怕,但仍然听起来很糟糕,我想知道还能做些什么才能让它变得更好。我读到微软TTS还使用人类录音来说出输出声音的音素。这听起来很棒。
我该怎么办?我错过了什么?这是我能做的最好的限制吗?我实际上无法在roblox中进行任何实时声音处理,或创建声音/写入波形或任何东西,我只能播放链接到声音文件的声音对象(虽然我可以调整音高,音量和应用效果,如echo tempo EQ等)
答案 0 :(得分:0)
正如Nikolay Shmyrev在对你的帖子的评论中提到的,更好的选择是使用双音素,但这也意味着你需要1521个样本。所以你通常要做的就是记录一个包含所有双音素的句子语料库,然后自动(或手动一次)对它们进行分段和标记,将它们存储为单个波形文件。
话虽如此,Diphone Synthesis [1]已经不再使用了很多。大多数旧的Microsoft TTS语音可能使用更复杂的单元选择合成系统[2]。这意味着您可以根据一个指标从记录的语料库中选择不同大小的单位(如电话,双音素等,直至单词和完整句子),该指标可以优化样本与您想要生成的内容的匹配程度以及向其他内容过渡的程度。样品会。通常叠加信号处理方法以平滑过渡(或产生其他效果)。
在撰写本文时,大多数现代TTS系统采用深度学习,结合单位选择("混合合成")和Siri [3]或直接建模像Google / Deepmind Wavenet这样的波形[4]。 Vocoders [5]通常用于直接从声学特征生成波形或调整WaveNet等模型。
回到你的约束。 如果您是游戏本身的开发人员,应该可以集成一些现有的TTS库,这可能是最好的解决方案。 如果您唯一的选择是真正玩wavefiles,我认为您的选择实际上仅限于某种双音素/单位选择系统,并带有几个技巧。但是即使这样,你也可能需要付出相当大的努力来获得合理的东西(我现在已经在语音合成方面工作了6年多了 - 它比大多数人最初想象的要复杂得多;) )。
[1] https://en.wikipedia.org/wiki/Speech_synthesis#Diphone_synthesis
[2] https://en.wikipedia.org/wiki/Speech_synthesis#Unit_selection_synthesis
[3] https://machinelearning.apple.com/2017/08/06/siri-voices.html
[4] https://deepmind.com/blog/wavenet-generative-model-raw-audio/