我正在尝试使用LUA和基于CMU字典的预先录制的音素来制作一个不错的语音综合/文本:
http://www.speech.cs.cmu.edu/cgi-bin/cmudict
到目前为止,我是如何做到的,一旦播放器输入文本,它就会通过每个单词,并从这里设置了他们的音素:
http://svn.code.sf.net/p/cmusphinx/code/code/trunk/cmudict/cmudict-0.7b
然后,它一次播放每个单词的每个音素集,并在播放下一个音素之前持续偏移。
即,
if Phoneme.TimePosition>=_end-(_end-_start)*0.4 then
音素是与音素相对应的声音对象(我用麦克风录制了39个音素,并将声音对象链接到相应的文件(, _end
是声音文件长度, _start
是0,当然是0,当然
这是结果:
https://streamable.com/8iwnu
虽然并不完全可怕,但听起来仍然很糟糕,我想知道我还能做些什么才能使情况变得更好。我读到Microsoft TTS还使用人类的录音来输出声音。听起来很棒。
我该怎么办?我想念什么?这是我限制的最好的方法吗?我实际上不能在Roblox中进行任何实时声音处理,也不能创建声音/写入波形或任何东西,我只能播放链接到声音文件的声音对象(尽管我可以调整音调,音量和应用效果,例如Echo Tempo eq等(
正如Nikolay Shmyrev在对您的帖子的评论中提到的那样,一个更好的选择是使用Diphones,但这也意味着您需要1521个样本。因此,您通常要做的是记录包含所有副指挥的句子的语料库,然后自动(或手动一次(段并标记这些句子,将它们存储为单个波文件。
话虽如此,二键合成[1]不再使用很多了。大多数较旧的Microsoft TTS声音可能使用更复杂的单元选择合成系统[2]。这意味着您会根据录制的语料库从录制的语料库中挑选不同尺寸的单位(因此,手机,副句等单词等单词和完整句子(,该指标优化了样本适合您想要产生的产品的能力以及向其他人的过渡程度样本将是。信号处理方法通常会叠加以平滑过渡(或产生其他效果(。
在撰写时,大多数现代TTS系统都采用了深度学习,要么与Siri [3]一样,要么与单位选择("混合合成"(结合使用,要么用于直接建模Google/DeepMind WaveNet [4]等波形。Vocoders [5]通常用于直接从声学特征产生波形,或者用于条件模型。
。回到您的约束。如果您是游戏本身的开发人员,则应该可以整合一些现有的TTS库,这可能是最好的解决方案。如果您唯一的选择是真正玩波文件,我认为您的选择确实仅限于某种带有几个技巧的副指控/单位选择系统。但是即使那样,您也可能需要花费很多努力才能获得合理的东西(我已经从事语音综合工作已有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/
[5] https://en.wikipedia.org/wiki/vocoder