赞
踩
环境: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的架构如下图所示:
该系统由两个部分组成,一个部分是循环序列到序列的特征预测网络,将特征叠加到梅尔光谱图上,在该部分之后通过一个修正过的Wavenet作为vocoder,它的输入为梅尔光谱图,通过vocoder之后,会将其合成为时域波形。Tacotron2所得到的合成语音比参照语音的MOS仅仅低了0.05。
在这个架构中,Tacotron2将原先Tacotron的RNN模型进行改进,使用了LSTM模型,加入了遗忘门、输入门、输出门等门控结构,优化了梯度消失的问题,使得模型在反向传播的记忆力上有所提升,提高了合成的语音的质量。
并且如下图所示,将tacotron输出的梅尔波谱图作为Wavenet的输入,也解决了每次进行Wavenet需要对TTS前端语言的特征进行调节的问题。
算法整个流程如下:
文本输入,使用三层卷积利用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的代码片段
数据集:
将下载的数据集复制到根目录。
预处理(提取特征):
预处理完成后会出现,training_data文件夹:
包含以下文件:
这些是用于训练的特征。
log片段:
训练模型:
训练完成后会出现这两个文件夹:
这就是我们训练好的模型,这里面的文件将会用于下一步的合成
log片段:
训练模型:
由于我的GPU的内存不足以训练这个模型,我使用了CPU进行训练。
长达4个半小时的训练,仅仅完成了50轮次的迭代(默认设置时100000次),wavenet_model.ckpt-50为保存的训练节点
可能是因为检查点过少,也有可能是配置时检查点的名称设置问题,导致在合成时,合成了一半就报错(还在排查错误)。
根据这个,最终合成出的语音,仅有一两个音节,不过听起来仍然是高质量的人声。音频文件名为step-50-real.wav。
未完成的部分,我会尽可能在近一月内更新。
细致到行的代码分析,我便不做阐述,源代码的注释已经足够清晰,我的目的是想让大家了解到Tacotron2的架构、运行方式,它最近在什么地方改进了(使用WaveGlow替换了Wavenet),希望大家能把Tacotron2的前世今生和未来串起来。
同时,踩完了很多坑,能让大家了解到如何去快速安装及使用它来合成一段声音,这样对于它的理解会更加切合实际。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。