上一篇文章的留言中,薇薇同学提到了语音合成技术,这篇文章尝试对语音合成技术的技术原理进行介绍。
TTS技术(又称文语转换技术)隶属于语音合成,它是将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的口语输出的技术。本文将解释语音合成技术如何将文字一步步转化为输出的语音信号。
步骤1:语素(文本)转音素
【Motivation】
是不是可以直接用拼写作为模型的输入?如果是单词拼写与读音一致的语言(如拉丁语)这是可行的,但可惜大部分语言是不可行的,看下面的例子:
1.though (和 go 里面的 o 类似)
2.through (和 too 里面的 oo 类似)
3.cough (和 offer 里面的 off 类似)
4.rough (和 suffer 里面的的 uff 类似)
即使有相同的拼写,但发音却完全不同。如果TTS系统使用拼写作为其主要输入,会不可避免地会陷入困境。因此,需要使用稍微不同的表达方式,展示出更多的发音信息。
音素正是这样的一样东西,我们发出来的声音由不同音素单位组成,将因素组合在一起,我们几乎可以重复发出任何单词的发音。比如:
· White Room - [ W,AY1, T, ., R, UW1, M,. ]
· Crossroads - [ K,R, AO1, S, R, OW2, D, Z, . ]
上述例子源自于CMU的音素字典,其中,音素旁边的1,2等数字表示应该发重音的位置,句号表示音间停顿。
【ProblemDescription】
因此,语素转音素成为了步骤1的科学问题,具体如下:
· Input -"It was earky spring"
· Output -[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG,. ]
【Solutions】
在大多数情况下,通过查询标准音素字典(比如CMU的音素字典),可以得到与输入文本一一对应的标签。
数据形式如下:
Input(X-逐字的)
[“It”, “was”,“early”, “spring”]
标签(Y)
[[IH1, T, .],[W, AA1, Z, .], [ER1, L, IY0, .], [S, P, R, IH1, NG, .]]
对于音素字典里没有包含的新词,吴恩达在百度带领团队开发的Deep Voice系统,基于神经网络建立了一个回退机制来预测音素。
步骤2:预测持续时间
【Motivation】
有了音素后,还需要估计在说话时,这些音素的发音时间。这也是一个有趣的问题,因为音素应该基于上下文来决定它们或长或短的持续时间。拿下面围绕音素“AH N”的单词举例:
·Unforgettable
· Fun
相比第二个单词,“AH N”显然需要在第一个单词里发更长的发音时间。
【ProblemDescription】
预测持续时间的问题描述如下:
· Input -[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG,.]
· Output -[IH1 (0.1s), T(0.05s),. (0.01s),...]
【Solutions】
可以利用训练系统做到这一点,能够理解每个音素,并预测它们的发音时长。
一种有效的方法是使用分割模型,它将每个音素发声的场景进行匹配,从而获取其对应的音频分割片段和其在音频中的发声位置。
分割模型真正有趣的部分在于其预测的不是每个独立音素的位置,而实际是预测了每组音素对的位置。因为对独立单个的音素而言,给定语音对应某个音素的概率在语音的发声正中最大;而对成对的音素而言,概率最大值出现在两个音素交界点上,可以轻易的检测出两个音素发声的交界点,因此,使用音素对可以更简单地进行定位。
此外,这种模式是无监督的,因为我们事实上无法知道语音片段中语素对应的真正位置的标签信息。分割模型通过CTC loss模型来训练。
数据形式如下:
Input(X)
“It was early spring”的音频剪辑
对应的音素[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG, .]
Outputs(Y)
音素对和它们在音频中的起始时间
[(IH1, T, 0:00), (T, ., 0:01), (., W,0:02), (W, AA1, 0:025), (NG, ., 0:035)]
步骤3:基频预测
【Motivation】
为了让发音尽可能地接近人声,还需要预测出每个音素的音调和语调。这一点从多方面考量,对以汉语为代表的语言尤为重要,因为这些语言中,相同的声音,读出不同的音调和重音具有完全不同的含义。预测每个音素的基频有助于发好每一个音素,因为频率会告诉系统,什么音素该发什么音高和什么音调。
此外,一些音素并不完全都发浊音,这意味着发这些音不需要每次都震动声带。例如,拿发音“ssss”和“zzzz”做例子,注意到前者是清音 (unvoiced),发音时声带没有振动,而后者是浊音 (voiced) ,发音时声带振动了。
【ProblemDescription】
基频预测的问题描述如下:
· Input -[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, ., R, Ih1, NG,.]
· Output -[IH1(140hz),T(142hz),. (Not voiced),...]
【Solutions】
基于步骤2中的分割模型不仅可以得到音素的持续时间数据对,也可以得到音素的基频数据对,将这些数据对作为训练数据,就可以通过模型训练来预测新音素的数据。
训练数据形式如下:
Input(X)
音素:[IH1, T,., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG, .]
标签(Y)
每个音素的持续时间和基频,通过分割模型获取:[(IH, 0.05s, 140 hz), (T, 0.07s, 141 hz), … ]
步骤4:音频合成
【Motivation】
生成语音的最后一步是,合并音素、持续时间和频率,输出声音。
【ProblemDescription】
音频合成的问题描述如下:
·Input -[IH1(140hz,0.5s), T(142hz, 0.1s),. (Not voiced, 0.2s), W(140hz, 0.3s), ...]
·Output -录音
【Solutions】
直观的解决方案就是将之前的预测结果进行组合,合并音素、持续时间和频率,并转化成原始波形,输出声音。
这个过程现在也可以基于训练模型进行训练,以达到高度的声音还原,比如百度的Deep Voice和谷歌的WaveNet。
基于上述方法生成的原始波形,允许生成所有类型的声音,不同的口音、情绪、呼吸和人类语音的其他基本部分都能包含在内,这样的声音和人类的声音区别就非常小了。
【参考文章】
1、论文《Deep Voice:Real-time Neural Text-to-Speech》
2、雷锋网:吴恩达盛赞的Deep Voice详解教程,教你快速理解百度的语音合成原理(上)https://www.leiphone.com/news/201703/P1OEbKjpB0pHvHDA.html
3、雷锋网:吴恩达盛赞的Deep Voice详解教程,教你快速理解百度的语音合成原理(下)https://www.leiphone.com/news/201703/C6AxG3rt4kE9cnQN.html