前段时间做了一些TTS相关的工作,这里分几篇来总结梳理一下。因为是刚接触,所以不免有些理解有偏差,欢迎指正~
-
整个TTS流程: 一般来说,整个TTS过程分为以下三个部分,前端、TTS、声码器(vocoder);
TTS流程- 前端:一般来说,需要将文本转化为音素。此外根据TTS模型的需要,提取文本特征
- TTS:将音素序列、文本序列等,翻译成该序列对应语音的声学特征,比如声频谱(mel),MFCC等
- vocoder:依据声学特征生成波形采样点,从而能够播放
- 语音基本知识:
-
物理语音模型:空气震动产生声波,人说话时,靠的是发生器官震动,比如肺和声带。震动带动空气中形成驻波,其中最小的频率称为基频,影响到说话者的音色。声波之后会经过声道(口腔、鼻腔),波形会被调制,调制后的频谱包络携带者说话者要表达的信息(文本发音)
物理语音模型 - 音频的基本特征主要有:
- : 基频
- :语音分帧,在每一帧上做stft,接着进行mel滤波,得到的能量谱
- : 得到FBANK之后,求倒谱得到,可以解耦包络和精细结构
- 衍生特征: 比如, 的一、二阶导
-
- 基本的TTS方法:
- 拼接法:顾名思议,把总有的声音片段录下来,用的时候进行拼接。该方法需要的录音成本很高。
- 参数法:就像本文开始的图说的,先转化为声学特征,再通过vocoder生成语音。因此可以说除了拼接法,其他的都属于参数法。但是根据所需前端工作的复杂性,以及发展的历程,可分为以下两类:
- 传统参数法:代表工具为HTS和Merlin。HTS和经典的语音识别系统HTS是一家,用HMM-GMM方法建模。Merlin将模型(应该是GMM部分)分为两类:时长模型和声学模型。这两者的前端工作都比较重,比如都需要音素和语音进行对齐(也可以使用HMM里的vertebi算法自动对齐,不过精度不一定够),且需要标注当前和周围音素的影响。
- 端到端方法:
- 传统的方法,没有一定的前端经验是很难做好的。好在随着深度学习技术的深入,端到端方法称为了主流。一是因为效果相比传统方法要好不少(传统方法过于复杂,过多的流程会累积误差,可以看下Merlin工具的流程图),二是因为解放了前端,理论上来说,前端甚至可以不做任何事情,直接把文本扔进去了事。(但一般都会转化为不同层次的音素,且会做一些工作比如韵律,降低网络的负担,获得更稳定的效果)。
- 端到端的开山之作是google的网络, 后边又发布了网络,附加声码器,彻底实现了端到端。之后又催生出很多其他的网络:比如有人将用结构来重构,为,再比如有人觉得TTS速度不快的根本原因是自回归结构,于是又引入了时长模型,发布了结构。再比如百度的等等
- 语音clone:
- 目前用端到端的方法,加上10-20小时的TTS语料,就能很逼近真实的声音了(MOS指标评估)。但在工业界应用时,很难每想合成一个人的声音时,都能获得这么长时间的高质量语料。用比较少的语料合成一个人的声音就称为clone
- clone大概有以下几种方法:
- 在基础模型上用少量样本进行finetune,要求不能和基础模型的音色差太远
- multispeaker方法:在网络里引入embedding 说话人的向量,存储该说话人特有的音色信息,因此网络可以用很多说话人的语料一起训练
- 更接近终极的方法:直接从几秒的样例语音里提取改说话人的音色信息,比如, 目前在英文上效果还可以
- 再谈声码器:
- 传统的声码器是用信号方法进行合成,比如WORLD, 需要 和非周期参数, 效果经常过于平滑
- 现代的声码器是基于自回归结构,直接依次回归出采样点,TTS输出的声学特征被当做来使用,开山之作又是google的,效果比传统的好很多
- 虽然好,但是很慢很慢(自回归),后来主要对效率进行改进,比如使用分段合成, 使用GAN网络, 与信号处理结合等
- voice conversion:
- 还想补充一点:voice conversion(语音转换)是个好玩但是很难的东西,它与TTS还不同,它的输入一个人的语音,输出是另一个人的语音。更复杂些的还有多人之间的转换。基于训练的难易,其方法分为需要平行语料和不需要平行语料的。没什么经验就不多说了。
网友评论