摘要:本文描述的深度神经网络模型结构:: Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions。
本文分享自华为云社区《什么?语音合成开源代码不会跑,我来教你跑Tacotron2》,作者: 白马过平川 。
Tacotron-2:
TTS论文大全: https://github.com/lifefeel/S...
DeepMind的Tacotron-2的Tensorflow实现。 本文描述的深度神经网络模型结构:: Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions
github地址:https://github.com/Rookie-Che...
还有一些其他版本的Tacotron2开源项目:
https://github.com/Rayhane-ma...
https://github.com/NVIDIA/tac...
这个 github 包含了对该论文的其他改进和尝试, 因此我们使用paper_hparams.py文件,该文件保存精确的超参数以重现了paper的结果,而无需任何额外的附加功能。默认使用的建议hparams.py文件包含带有额外内容的超参数,在大多数情况下可以提供更好的结果。 按照自己的需要随意修改参数,差异将在文件中突出显示。
Repository Structure:
步骤 (0): 获取数据集, 这里我设置了Ljspeech,en_US和en_UK(来自M-AILABS)的示例。
步骤 (1): 预处理您的数据。这将为您提供training_data文件夹。
步骤 (2): 训练你的Tacotron模型。产生logs-Tacotron文件夹。
步骤 (3): 合成/评估Tacotron模型。给出tacotron_output文件夹。
步骤 (4): 训练您的Wavenet模型。产生logs-Wavenet文件夹。
步骤 (5): 使用Wavenet模型合成音频。给出wavenet_output文件夹。
注意:
步骤2,3和4可以通过Tacotron和WaveNet(Tacotron-2,步骤(*))的简单运行来完成。
原有github的预处理仅支持Ljspeech和类似Ljspeech的数据集(M-AILABS语音数据)!如果以不同的方式存储数据集,则需要制作自己的preprocessing脚本。
如果同时对两个模型进行训练,则模型参数结构将不同。
一些预训练模型和demo:
您可以在此处.查看模型性能的一些主要见解(在预训练阶段)。
模型架构:
图1:Tacotron2模型结构图
作者描述的模型可分为两部分:
谱图预测网络
Wavenet声码器
要深入探索模型体系结构,训练过程和预处理逻辑,请参阅 作者的 wiki
如何开始
环境设置:
首先,您需要与Tensorflow一起安装python 3 。
接下来,您需要安装一些Linux依赖项以确保音频库正常工作:
apt-get install -y libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 ffmpeg libav-tools
最后,您可以安装 requirements.txt. 如果你是一个 Anaconda 用户: (可以用 pip3 代替 pip 并 用python3 代替 python)
pip install -r requirements.txt
Docker:
或者,可以构建docker镜像以确保自动设置所有内容并使用docker容器内的项目。
Dockerfile is insider “docker” folder
docker image可以用以下内容构建:
docker build -t tacotron-2_image docker/
然后容器可以运行:
docker run -i --name new_container tacotron-2_image
数据集:
该github在 ljspeech dataset数据集上测试了上面的代码,该数据集有近24小时标记的单个女演员录音。(下载时,README文件中提供了有关数据集的更多信息)
该github还在 新的M-AILABS语音数据集 上运行当前测试,该数据集 包含超过700种语音(超过80 Gb的数据),超过10种语言。
下载数据集后, 解压压缩文件, 而该文件夹放在克隆的github里。
Hparams设置:
在继续之前,您必须选择最适合您需求的超参数。 虽然可以在预处理/训练期间从命令行更改超参数,但我仍然建议直接在hparams.py文件上一劳永逸地进行更改。
为了选择最佳的fft参数,我制作了一个griffin_lim_synthesis_tool笔记本, 您可以使用它来反转实际提取的梅尔/线性光谱图,并选择预处理的好坏程度。所有其他选项都在hparams.py中得到了很好的解释,并且具有有意义的名称,因此您可以尝试使用它们。
AWAIT DOCUMENTATION ON HPARAMS SHORTLY!!
预处理
在运行以下步骤之前,请确保您在Tacotron-2文件夹中
cd Tacotron-2
然后可以使用以下命令开始预处理:
python preprocess.py
可以使用 –dataset 参数选择数据集。如果使用M-AILABS数据集,则需要提供 language, voice, reader, merge_books and book arguments 以满足您的自定义需求。默认是 Ljspeech.
示例M-AILABS:
python preprocess.py --dataset='M-AILABS' --language='en_US' --voice='female' --reader='mary_ann' --merge_books=False --book='northandsouth'
或者如果你想一个说话人使用所有书籍:
python preprocess.py --dataset='M-AILABS' --language='en_US' --voice='female' --reader='mary_ann' --merge_books=True
这应该不会超过几分钟。
训练:
按顺序训练两个模型:
python train.py --model='Tacotron-2'
特征预测模型Tacotron-2可以分别被训练使用:
python train.py --model='Tacotron'
每5000步记录一次,并存储在logs-Tacotron文件夹下。
当然,单独训练wavenet是通过以下方式完成的:
python train.py --model='WaveNet'
logs will be stored inside logs-Wavenet.
注意:
如果未提供模型参数,则训练将默认为Tacotron-2模型培训。(与tacotron模型结构不同)
训练模型的参数可以参考 train.py 有很多选项可以选
wavenet 的预处理可能得单独使用 wavenet_proprocess.py脚本
合成
合成音频 以 端到端 (文本到音频) 的方式 (两个模型同时运行):
python synthesize.py --model='Tacotron-2'
对于频谱图预测网络,有三种类型的mel谱图的预测结果:
推理测试(对自定义句子的综合评测)。 这是我们在拥有完整的端到端模型后通常会使用的。
python synthesize.py --model='Tacotron'
自然合成 (让模型通过将最后一个解码器的输出输入到下一个时间步来单独进行预测).
python synthesize.py --model='Tacotron' --mode='synthesis' --GTA=False
有效的对齐合成 (默认: 模型是在有效真实的标签下强制训练产生的). 当预测用于训练wavenet的mel频谱时,使用该合成方法. (如文中所述,产生更好的结果)
python synthesize.py --model='Tacotron' --mode='synthesis' --GTA=True
用先前合成的Mel频谱合成波形:
python synthesize.py --model='WaveNet'
注意:
如果未提供模型参数,则默认使用Tacotron-2模型合成。(End-to-End TTS)
选择的合成参数,你可以参考synthesize.py
参考文献和源码:
Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions
Original tacotron paper
Attention-Based Models for Speech Recognition
Wavenet: A generative model for raw audio
Fast Wavenet
r9y9/wavenet_vocoder
keithito/tacotron
想了解更多的AI技术干货,欢迎上华为云的AI专区,目前有AI编程Python等六大实战营供大家免费学习。(六大实战营link:http://su.modelarts.club/qQB9)
点击关注,第一时间了解华为云新鲜技术~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。