Tacotron2 原理及使用(基于TensorFlow)

环境:win10 + TensorFlow1.13.1,不支持TensorFlow2.0及以上
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。

主要参考

[1] Shen J , Pang R , Weiss R J , et al. Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions[J]. 2017.
[2] https://github.com/Rookie-Chenfy/Tacotron-2

一、背景:

在TTS方向,有着很多方法,之前出现的出现了Wavenet和Tacotron在TTS领域的应用,都取得了非常优秀的成果,但是都存在着自身的缺陷。Wavenet的缺陷是需要进行自回归,即把这一次的输出附加到下一次运算的输入中,使得运算无法并行进行,速度较慢,并且它并不是端到端,它需要对TTS前端语言的特征进行调节。而Tacotron则使用了RNN模型,具有短期记忆、梯度消失严重等问题,导致信号合成效果并不是很好,不如Wavenet。

Tacotron2则将Wavenet和Tacotron相结合,吸取了两者的优势并解决了两者的问题。

在2017年3月提出的模型中,Tacotron 模型取得了 3.82 的平均意见得分(满分5) 。而在最近的评估中,Tacotron 2 模型平均意见得分为 4.53,专业录音平均意见得分为 4.58。

二、适用场景及优缺点:

适用于端到端的TTS,输入为文本和.wav音频集,输出为.wav音频,生成的语音具有专业录音级别的质量。

缺陷:但还不能实时生成音频,并且不能让生成的音频听起来高兴或者悲伤。它在复杂单词(如decorum)的发音上有些困难,在极端情况下甚至会随机产生奇怪的噪音。

(试听原声和合成声:https://google.github.io/tacotron/publications/tacotron2/index.html)

三、架构和模型:

Tacotron2的架构如下图所示:
Tacotron2 原理及使用(基于TensorFlow)_第1张图片
该系统由两个部分组成,一个部分是循环序列到序列的特征预测网络,将特征叠加到梅尔光谱图上,在该部分之后通过一个修正过的Wavenet作为vocoder,它的输入为梅尔光谱图,通过vocoder之后,会将其合成为时域波形。Tacotron2所得到的合成语音比参照语音的MOS仅仅低了0.05。

在这个架构中,Tacotron2将原先Tacotron的RNN模型进行改进,使用了LSTM模型,加入了遗忘门、输入门、输出门等门控结构,优化了梯度消失的问题,使得模型在反向传播的记忆力上有所提升,提高了合成的语音的质量。
Tacotron2 原理及使用(基于TensorFlow)_第2张图片Tacotron2 原理及使用(基于TensorFlow)_第3张图片
并且如下图所示,将tacotron输出的梅尔波谱图作为Wavenet的输入,也解决了每次进行Wavenet需要对TTS前端语言的特征进行调节的问题。
Tacotron2 原理及使用(基于TensorFlow)_第4张图片
算法整个流程如下:
文本输入,使用三层卷积利用LSTM模型与注意力机制,进行特征提取,然后将特征输入到模型中,预测出值,将值附加到梅尔波谱图上,然后使用WaveNet把梅尔波谱图转换为时域波形,合成出语音。

四、安装与环境配置:

版本①:https://github.com/NVIDIA/tacotron2
(NVDIA版,基于pytorch,具有NVDIA公司的APEX运算加速技术,并且没有使用Wavenet,而是使用了最新的WaveGlow技术)

版本②:https://github.com/Rookie-Chenfy/Tacotron-2
(TensorFlow版)

我的工作主要是借鉴了最上方的2017年的Natural TTS Synthesis by Conditioning Wavenet On Mel Spectrogram predictions论文,这篇论文的架构里是有Wavenet的,因此我选择版本②。

流程:
首先,下载LJSpeech数据集:https://keithito.com/LJ-Speech-Dataset/,或者下载new M-AILABS speech 数据集:http://www.m-ailabs.bayern/en/the-mailabs-speech-dataset/

然后,cd到Tacotron-2目录下,使用pip install -r requirements.txt,安装py库

pip install -r requirements.txt

(如果使用的是cpu版本的TensorFlow,则忽略这步,gpu版本的TensorFlow还需要如下配置:下载1.13.1版本的TensorFlow,切记Cuda版本为10.0,官方给出的是10.1,但是会报错,同时cuDNN的版本为7.6.4)

配置完毕。

五、使用步骤:

超参数配置:
根目录下的hparams.py
在这里插入图片描述
haparams.py的代码片段
Tacotron2 原理及使用(基于TensorFlow)_第5张图片
数据集:
将下载的数据集复制到根目录。
在这里插入图片描述
预处理(提取特征):
Tacotron2 原理及使用(基于TensorFlow)_第6张图片
预处理完成后会出现,training_data文件夹:
在这里插入图片描述
包含以下文件:
Tacotron2 原理及使用(基于TensorFlow)_第7张图片
这些是用于训练的特征。

log片段:
在这里插入图片描述

训练模型:
Tacotron2 原理及使用(基于TensorFlow)_第8张图片
训练完成后会出现这两个文件夹:
在这里插入图片描述
这就是我们训练好的模型,这里面的文件将会用于下一步的合成

log片段:
在这里插入图片描述
Tacotron2 原理及使用(基于TensorFlow)_第9张图片
训练模型:
Tacotron2 原理及使用(基于TensorFlow)_第10张图片

六、未完成的部分:

由于我的GPU的内存不足以训练这个模型,我使用了CPU进行训练。

长达4个半小时的训练,仅仅完成了50轮次的迭代(默认设置时100000次),wavenet_model.ckpt-50为保存的训练节点
在这里插入图片描述
可能是因为检查点过少,也有可能是配置时检查点的名称设置问题,导致在合成时,合成了一半就报错(还在排查错误)。

根据这个,最终合成出的语音,仅有一两个音节,不过听起来仍然是高质量的人声。音频文件名为step-50-real.wav。
在这里插入图片描述
未完成的部分,我会尽可能在近一月内更新。

七、想说的话:

细致到行的代码分析,我便不做阐述,源代码的注释已经足够清晰,我的目的是想让大家了解到Tacotron2的架构、运行方式,它最近在什么地方改进了(使用WaveGlow替换了Wavenet),希望大家能把Tacotron2的前世今生和未来串起来。

同时,踩完了很多坑,能让大家了解到如何去快速安装及使用它来合成一段声音,这样对于它的理解会更加切合实际。

你可能感兴趣的:(AI语音合成,TensorFlow,Tacotron2)