rainit2006 / Artificial-Intelligence

1 stars 0 forks source link

TTS #14

Open rainit2006 opened 5 years ago

rainit2006 commented 5 years ago

rainit2006 commented 5 years ago

说明一 Text-to-speech一般分为两个步骤: 1) 文本处理。这一步做的事情是把文本转化成音素序列,并标出每个音素的起止时间、频率变化等信息。作为一个预处理步骤,它的重要性经常被忽视,但是它涉及到很多值得研究的问题,比如拼写相同但读音不同的词的区分、缩写的处理、停顿位置的确定,等等。 2) 语音合成。狭义上这一步专指根据音素序列(以及标注好的起止时间、频率变化等信息)生成语音,广义上它也可以包括文本处理的步骤。 这一步主要有三类方法: a) 拼接法,即从事先录制的大量语音中,选择所需的基本单位拼接而成。这样的单位可以是音节、音素等等;为了追求合成语音的连贯性,也常常用使用双音子(从一个音素的中央到下一个音素的中央)作为单位。拼接法合成的语音质量较高,但它需要录制大量语音以保证覆盖率。 b) 参数法,即根据统计模型来产生每时每刻的语音参数(包括基频、共振峰频率等),然后把这些参数转化为波形。参数法也需要事先录制语音进行训练,但它并不需要100%的覆盖率。参数法合成出的语音质量比拼接法差一些。 c) 声道模拟法。参数法利用的参数是语音信号的性质,它并不关注语音的产生过程。与此相反,声道模拟法则是建立声道的物理模型,通过这个物理模型产生波形。这种方法的理论看起来很优美,但由于语音的产生过程实在是太复杂,所以实用价值并不高。

说明二:

  1. 从文本中攫取足量信息 需要一套语言学标注系统,先给文本分词,再把文本转换成只有单词串起来的句子(例如把 1989 转成 nineteen eighty nine)后,再给这句话标注音素级别(上一个音素/下一个音素)、音节级别(单词的第几个音节)、单词级别(词性/在句子中的位置)等对语音合成有帮助的信息。

  2. 生成波形 两种思路: 一种思路是,既然我们要生成语音,我们做个语音库,从库里面找找有没有合适的 speech unit,拼起来就好了呗。 第二种思路是,我们做个语音库,用统计模型学习到每个音到底怎么发的,再根据学出来的特征,复原出来,不就好了呗。

第一种思路,基于拼接的语音合成系统。我们用同样的语言学标注系统跑一遍输入文本,得到了一串语言学标注。然后,接下来就该从库里面找,有没有不仅在语言学特征上,还在声学特征上也是类似的音素 waveform。找到了,拼起来,找不到,看看退而求其次的音素,就这样,合成一句句子。缺点是,如果库里的音素切分出错、语言学标注出错,那显然它最后会找错。优点是,听起来的确很自然,毕竟是真人的声音。 第二种思路,基于参数的语音合成系统。它其实是一个文本抽象成语音学特征,再用统计学模型学习出来语音学特征和其声学特征的对应关系后,再从预测出来的声学特征还原成 waveform 的过程。核心是个预测问题,有若干统计模型可以解决,目前主流是用神经网络用来预测。然后用声码器 (vocoder) 生成波形,实现特征到 waveform 这最后一步。这种思路缺点是,听起来不自然,因为最后输出的是用声码器合成的声音,毕竟有损失。优点是,对于语音库里的标注错误不敏感,因为预测时候是学的是一个统计模型嘛。最后呢,还有取两种思路的优点,混合的语音合成解决方案。用基于参数的语音合成系统预测声学上最匹配的音素后,再从库里把它找出来。业界基本上是用这种,合成效果融合两种思路的长处,效果最优。另外,其实还有第三种思路。用神经网络直接学习文本端到声学特征这一端的对应关系,这就直接省去了第一步,不再需要语言学标注系统标注文本了。这就是 Google 的 Tacotron。不过最后还是要需要声码器。再或者,用神经网络直接学习语言学标注端到帧级别的 waveform 端的对应关系,这就直接省去了最后一步,不再需要声码器了。这就是 DeepMind 的 WaveNet。不过第一步还是需要语言学标注系统。