如何在这个环境中正确实现语音合成?

我正在尝试使用lua和基于CMU词典的预先录制的音素制作一个体面的语音合成/文本到语音系统,链接如下:

http://www.speech.cs.cmu.edu/cgi-bin/cmudict

我到目前为止所做的是,一旦玩家输入文本,系统会通过该链接获取每个单词的音素集合,并逐个播放每个单词的音素集合,每个音素集合之间保持一个恒定的时间偏移。

if Phoneme.TimePosition>=_end-(_end-_start)*0.4 then

Phoneme是音素对应的声音对象,我用麦克风录制了39个音素,并将声音对象与相应的文件链接起来,_end是声音文件的长度,_start当然是0

以下是结果链接:

https://streamable.com/8iwnu

虽然还不算太糟糕,但声音仍然很差,我想知道我还能做什么来改进它。我读过微软TTS也使用人类对音素的录音来输出声音,声音很好。

我该怎么办?我错过了什么?这是我在限制条件下做到的最好的吗?我实际上无法在roblox中进行任何实时音频处理,或创建声音/写入波形等,我只能播放链接到声音文件的音频对象(虽然我可以调节音高,音量,并应用回声节奏等效果)

点赞
用户3990283
用户3990283

如 Nikolay Shmyrev 在您的文章评论中提到的,一个更好的选择是使用二音段技术,但是这也意味着您需要1521个采样数据。因此,您通常会记录一个包含所有二音段的语料库,然后自动(或手动完成一次)进行分割和标记,并将它们存储为单个wave文件。

话虽如此,双音段合成[1]现在并不常用。大多数旧的Microsoft TTS语音可能使用更复杂的单元选择合成系统[2]。这意味着您可以从一个已记录的语料库中按照度量标准选择不同大小的单元(如音素、二音段等,直到单词和完整的句子),这个度量标准优化的是样本在您要生成的东西上的拟合度以及向其他样本的过渡。信号处理方法通常被叠加以平滑转换(或产生其他效果)。

在撰写本文时,大多数现代TTS系统使用深度学习,既可以与单元选择相结合(“混合合成”),如Siri[3],也可以直接对波形进行建模,如Google/Deepmind Wavenet[4]。音码器[5]经常用于直接从声学特征产生波形,或者为WaveNet这样的模型提供条件。

回到您的限制条件。如果您是游戏本身的开发人员,应该可以集成一些现有的TTS库,这可能是最好的解决方案。如果您唯一的选择确实是播放wave文件,我认为您的选择非常有限,只能使用某种形式的二音段/单元选择系统以及一些技巧。但即便如此,您可能需要花费相当大的努力才能得到一些合理的结果(我已经在语音合成领域工作了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

2018-04-26 09:50:31