语音合成综述
语音相关基础知识点:
- 时域信号:一维原始信号
- 傅里叶变换:得到频域特征
- 短时傅里叶变换:傅里叶变换得到了频域信号,但是丢失了时域信号,所欲通过STFT得到时频信号
- 梅尔频谱倒谱系数:单单频率信号表达不足,为了更加和人的耳朵听觉相符,我们使用了mel窗滤波,得到人耳的频率段幅度系数
- 梅尔声谱:这种声谱是一种基于人类感知的中间媒介,它不仅记录了不同的单词如何发音,而且还记录了预期的音量和语调。
基于深度学习的研究框架:
-
谷歌
-
tacotron 1 【1703 google brain】
tacotron是第一个高质量的端到端语音合成系统。Tacotron 使用精心设计的结构,使得它能直接读取英语字符作为输入,预测更原始的短时傅里叶变化幅度谱,然后利用相位重构算法合成语音。Tacotron的最大的优点是完全的端到端训练,而且使用相对原始的输入输出便能合成高自然度的语音。进一步地,在Tacotron 的基础上,Tacotron 2[130] 使用Wavenet[114]作为神经声码器,可以合成接近自然语音质量的语音
主要原理:直接采用中文带调拼音序或者英文短句列作为输入,生成相应的短时傅里叶变换幅度谱序列,最后使用Griffin-Lim 算法合成语音
版本1:https://github.com/Kyubyong/tacotron 结果:基本能跑通,能听清,但是有杂音、混响。
版本2:https://github.com/keithito/tacotron (版本1优化版-解码部分用dynamic-decode优化)
结果:基本能跑通,能听清,但是有杂音。
版本3:https://github.com/mozilla/TTS -
tacotron 2 【1710】
对tacotron前端进行优化,声码器采用了Wavenet,使得合成的语音效果更佳流畅
版本1:https://github.com/NVIDIA/tacotron2
结果:能跑通,导师无结果,也无合成相关代码
(https://github.com/Rayhane-mamah/Tacotron-2)
版本2:https://github.com/Rayhane-mamah/Tacotron-2
问题所在:tensorflow版本不对应,无法训练,需要使用GPU的cuda9 -
wavenet 【1609 deepmind】
wavenet也可以作为单独的语音合成系统,主要作用是将文本处理的数据转化为语音波形;目前主要的作用是作为tacotron的声码器部分,用来直接将语谱图合称为波形信号。 -
Parallel WaveNet-【后端-1807】
Parallel WaveNet 通过使用神经网络提炼技术,将已训练好的Wavenet(作为Teacher)中的知识提炼到一个完全可并行推理的逆自回归流(Inverse Autoregressive Flow, IAF)[177]模型(作为Sdudent),最后所得IAF模型可完全实现实时合成,而且保证了近乎自然语音的音质。
* 概率分布蒸馏(probability density distillation)
对比 DeepMind 稍早提出的 Parallel WaveNet,ClariNet 中的概率分布蒸馏(probability density distillation)
过程更加简单优美,直接闭式地(closed-form)来计算训练目标函数 KL 散度(KL divergence),大大简化了训练算法,
并且使得蒸馏过程效率极高——通常 5 万次迭代后,就可以得到很好的结果。同时作者还提出了正则化 KL 散度的办法,
大大提高了训练过程的数值稳定性,使得结果简单易训练(注:Clari 在拉丁语中是 clear, bright 的意思)。
而 Parallel WaveNet 由于需要蒙特卡洛采样来近似 KL 散度,使得梯度估计的噪音很大,
训练过程很不稳定,外界极难重现 DeepMind 的实验结果。通过反向传播来对学生网络进行调参的过程,让学生网络学会自己该生成什么样的声音。 话句话说,就是教师和学生网络都为每个声音样本的值输出一个可能的概率分布,而训练的目标是最小化二者之间的KL散度(KL divergence) 比较:这种训练方法和生成对抗网络(GAN)的设计可以平行比较,学生的角色就相当于GAN里的生成器,而教师相当于鉴别器。 与GAN不同的是,学生的目标不是“骗过”教师,而是与教师合作,尝试达到与教师差不多的性能。
-
- WaveRNN-【1802】
相比Wavenet,更加简化
为了让模型能够在嵌入式端部署,DeepMind 进一步提出了WaveRNN,WaveRNN 使用GRU 的变种结构,以及结构稀疏化和亚尺度(Subscale)生成机制等方法,保证模型不仅在移动端能高效地推理,而且音质几乎接近Wavenet。
从论文的内容来看,主要创新点为:1)结构大大简化,只有一层RNN(GRU)+两层全连接+一层softmax,效果接近wavenet2)将16bit输出标量分割为高8位和低8位,独立采用上述结构,不同点是预测低8位是要以高8为最为额外条件,而高8位的预测只依赖前一时刻的全部16位3)把2中的两组参数设计在一个网络结构中,可以加快训练速度和简化训练流程事实上我对这篇论文的结果表示质疑,排除上述2\3,如果数据就是8bit的数据(第一版的wavenet也是8bit数据),采用1就能完成,但这样的模型是没有理由获得很好的结果的,单层的LSTM/GRU是很难预测这么长时的数据的(语音每秒24000个数据),如果这都可以,wavenet那真是自己找麻烦。当然以高8位为额外条件预测低8位,这显然具有很强的可预测性,问题是高8位要先预测出来,首先这个就过不了关。
我猜想作者做实验的时候作为条件的高8位是ground truth的,但我不想这样去想,应该不会这么low。
- WaveRNN-【1802】
-
-
百度
- DeepVoice1 【1702】
该系统是一个完全用深度神经网络构建的人类语音合成系统。Deep Voice 1 与之前其他神经文本转语音(TTS)系统不同,它不仅能实时运行,同时还可以足够快速地合成音频,因此 Deep Voice 1 可以应用于媒体和会话接口等交互性应用。通过训练能由大量数据和简单特征(而不是人工定制的数据)学习的深度神经网络,我们创建了一个极其灵活的高质量实时音频合成系统。- beam search算法过程(集束搜索-定向搜索)https://zhuanlan.zhihu.com/p/28048246
集束搜索算法是对广度/宽度搜索算法的改进,对于图的广度优先算法,由对每一层进行遍历搜索时,都需要保存当前层的所有节点,这样将导致存储的指数上升,为了节约这点内存,集束搜索算法采用了一种类似A*算法的启发式搜索思想,即在搜索当前层的时候,我们就定义一个成本函数,比如当前点到终点的近似距离,同时我们选择一个固定值k,即我们只保留距离计算最短的k个点,这样就不用保存全部的节点,而结果近似最优解。用在自然语言处理当中即为:比如翻译系统,的编码输出并不是只有一个值或者所有的值,而是固定输出k种可能的值。
- beam search算法过程(集束搜索-定向搜索)https://zhuanlan.zhihu.com/p/28048246
- DeepVoice2
对第一代进行改进优化;增加了说话人向量,从而可以进行多说话人训练 - DeepVoice3 【1710】
使用全部卷积实现的编码器-解码器结构,因此训练效率更高。 - ClariNet-【1807】
语音合成领域第一个完全端到端的系统
先前为业界所熟知的「端到端」语音合成系统(比如 Google 提出的 Tacotron,百度之前提出的 Deep Voice 3),实际是先将文本转换为频谱(spectrogram),然后通过波形生成模型 WaveNet 或者 Griffin-Lim 算法,将频谱转换成原始波形输出。这种方法由于文本到频谱的模型和 WaveNet 是分别训练优化的,往往导致次优的结果。
更值得注意的是,ClariNet 还是语音合成领域第一个完全端到端的系统,可以通过单个神经网络,直接将文本转换为原始的音频波形。先前为业界所熟知的「端到端」语音合成系统(比如 Google 提出的 Tacotron,百度之前提出的 Deep Voice 3),实际是先将文本转换为频谱(spectrogram),然后通过波形生成模型 WaveNet 或者 Griffin-Lim 算法,将频谱转换成原始波形输出。这种方法由于文本到频谱的模型和 WaveNet 是分别训练优化的,往往导致次优的结果。
而百度研究员提出的 ClariNet,则是完全打通了从文本到原始音频波形的端到端训练,实现了对整个 TTS 系统的联合优化,比起分别训练的模型,在语音合成的自然度上有大幅提升(参见 合成语音示例)。另外,ClariNet 是全卷积模型,训练速度比起基于循环神经网络(RNN)的模型要快 10 倍以上。
参考分析:https://zhuanlan.zhihu.com/p/30776006
- DeepVoice1 【1702】
-
印度理工学院-加拿大蒙特利尔大学
- SampleRNN-【声码器-201612】
- CHAR2WAV-【1710】
由两部分组成:参数生成器与神经声码器。参数生成器直接读取音子作为输入,输出声码器参数,同时,参数生成器使用Graves Attention以保证良好对齐。神经声码器使用SampleRNN 代替传统声码器,读取声码器参数生成语音采样点
-
Facebook
- VoiceLoop-【1707】
VoiceLoop 同样读取音子作为输入,输出声码器参数;但不同的是,VoiceLoop 并没有使用神经声码器,而是
使用WORLD[176]来合成语音。VoiceLoop 的一个显著特点是使用一个移动缓冲(Shifting Buffer)来代替解码器结构中的循环神经网络,而且不需要使用编码器,因此结构上更为简单。
版本:https://github.com/c1niv/Voiceloop_TensorFlow
- VoiceLoop-【1707】
-
瑞典爱丁堡-merlin
-
科大讯飞
-
日本名古屋大学-HTS
-
语音合成工具箱WORLD
-
卡耐基梅隆大学-Festvox
-
新方向:无监督生成式对抗网络(GAN)
区分说话主要是通过音高(基频)和音色(频谱包络-频谱最大幅度的连接线)
音高:http://ibillxia.github.io/blog/2013/05/16/audio-signal-processing-time-domain-pitch-python-realization/
音色:http://ibillxia.github.io/blog/2013/05/18/audio-signal-processing-time-domain-timbre-python-realization/
此工具箱通过提取语音的三个特征,然后对其进行修改,从而改变语音的音色等特征,从而转换语音特性
比如:通过调高基频,可以偏女性化,通过改变基频未固定值,可以类似机器人等等
f0 : ndarray
F0 contour. 基频等高线
sp : ndarray
Spectral envelope. 频谱包络
ap : ndarray
Aperiodicity. 非周期性
工具箱主要是用matlab和c语言进行开发,pyworld脚本调用c语言接口
文档:直接参考C语言文档或者查看github源码及其一个demo
https://qiita.com/ohtaman/items/84426cee09c2ba4abc22
合成数据集下载:
CMU ARCTIC (en)-李开复实验室: http://festvox.org/cmu_arctic/
LJSpeech (en): 2.6G https://keithito.com/LJ-Speech-Dataset/
thchs30: 清华大学30小时的数据集(中文) 6.4G http://www.openslr.org/18/
四种现阶段主要的语音合成系统:
- 传统-概率参数- Parametric TTS
参数语音合成系统的特点是,在语音分析阶段,需要根据语音生成的特点,将语音波形(speech waves) 通过声码器转换成频谱,基频,时长等语音或者韵律参数。在建模阶段对语音参数进行建模。并且在语音合成阶段,通过声码器从预测出来的语音参数还原出时域语音信号。参数语音合成系统的优势在于模型大小较小,模型参数调整方便(说话人转换,升降掉),而且合成语音比较稳定。缺点在于合成语音音质由于经过参数化,所以和原始录音相比有一定的损失。 - 传统-拼接系统- Concatenative TTS
拼接语音合成系统的特点是,不会对原始录音进行参数化,而会将原始录音剪切成一个一个基本单元存储下来。在合成过程中,通过一些算法或者模型计算每个单元的目标代价和连接代价,最后通过Viterbi算法并且通过PSOLA(Pitch Synchronized Overlap-Add)或者WSOLA(Waveform Similarity based Overlap-Add)等信号处理的方法“拼接”出合成语音。因此,拼接语音合成的优势在于,音质好,不受语音单元参数化的音质损失。但是在数据库小的情况下,由于有时挑选不到合适的语音单元,导致合成语音会有Glitch 或者韵律、发音不够稳定。而且需要的存储空间大。 - 基于深度学习的-百度、谷歌
- GAN网络-还处于研究阶段
合成语音的评价标准:
声音的好听与难听是一个相对主观的概念,因此合成语音的好坏主要通过找很多测听人员对合成语音进行打MOS(Mean Opinion Score)分;其中MOS的范围是 1-5 分,分别代表 1: Bad, 2: Poor, 3: Fair, 4: Good, 5: Excellent 。MOS打分可以对合成语音的音质,可懂度,相似度,或者其他的分项进行评价,也可以对语音的整体自然度进行评价。