Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 在这种环境下,我如何正确地进行语音合成?_Lua_Text To Speech_Roblox - Fatal编程技术网

Lua 在这种环境下,我如何正确地进行语音合成?

Lua 在这种环境下,我如何正确地进行语音合成?,lua,text-to-speech,roblox,Lua,Text To Speech,Roblox,我正在尝试使用基于CMU字典的lua和预录音素制作一个像样的语音合成/文本到语音系统: 到目前为止,我所做的是,一旦玩家输入文本,它就会遍历每个单词并从这里获取他们的音素集: 然后,它一次播放每个单词的每个音素集,在播放下一个音素之前有一个固定的时间偏移量 i、 e 音素是音素对应的声音对象(我用麦克风录制了39个音素,并将声音对象链接到相应的文件),\u end是声音文件长度,\u start当然是0 结果如下: 虽然这并不完全可怕,但听起来仍然很糟糕,我想知道我还能做些什么来让这一切变

我正在尝试使用基于CMU字典的lua和预录音素制作一个像样的语音合成/文本到语音系统:

到目前为止,我所做的是,一旦玩家输入文本,它就会遍历每个单词并从这里获取他们的音素集:

然后,它一次播放每个单词的每个音素集,在播放下一个音素之前有一个固定的时间偏移量

i、 e

音素是音素对应的声音对象(我用麦克风录制了39个音素,并将声音对象链接到相应的文件),
\u end
是声音文件长度,
\u start
当然是0

结果如下:

虽然这并不完全可怕,但听起来仍然很糟糕,我想知道我还能做些什么来让这一切变得更好。我读到微软TTS也使用人类说出音素的录音来输出声音。听起来很棒


我能做什么?我错过了什么?这是我能做的最好的限制吗?实际上,我不能在roblox中进行任何实时声音处理,也不能创建声音/写入波形或其他任何东西,我只能播放链接到声音文件的声音对象(尽管我可以调整音高、音量,并应用回声节拍等效果)。

正如Nikolay Shmyrev在你的帖子评论中提到的那样,更好的选择是使用双音,但这也意味着您需要1521个样本。所以你通常要做的是记录一个包含所有双音的句子语料库,然后自动(或手动)分割并标记这些句子,将它们存储为单个波文件

也就是说,双酮合成[1]不再被广泛使用。大多数较旧的Microsoft TTS语音可能使用更复杂的单元选择合成系统[2]。这意味着您可以根据一个指标从记录的语料库中选择不同大小的单位(例如电话、双音等,最多可选择单词和完整句子),该指标可以优化样本与您想要生成的内容的匹配程度以及向其他样本的转换程度。信号处理方法通常叠加以平滑过渡(或产生其他效果)

在撰写本文时,大多数现代TTS系统采用深度学习,如Siri[3]中的单元选择(“混合合成”)或直接建模波形,如Google/Deepmind Wavenet[4]。声码器[5]通常用于直接根据声学特征产生波形,或用于调节WaveNet等模型

回到你的限制。 如果您是游戏本身的开发人员,应该可以集成一些现有的TTS库,这可能是最好的解决方案。 如果你唯一的选择是玩波形文件,我认为你的选择只限于某种双音/单位选择系统,还有一些技巧。但即便如此,你也可能需要付出相当多的努力才能找到合理的答案(我从事语音合成工作已经6年多了——这是一个比大多数人一开始想象的要复杂得多的话题)

[1]

[2]

[3]

[4]


[5]

你最好粘上二元音,而不是音素,这样会让你的过渡更加流畅。你可以在网站上得到一些介绍。
if Phoneme.TimePosition>=_end-(_end-_start)*0.4 then