什么?语音合成开源代码不会跑,follow me!
摘要:本文描述的深度神经网络模型结构:: Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions。
本文分享自华为云社区《什么?语音合成开源代码不会跑,我来教你跑Tacotron2》,作者: 白马过平川 。
Tacotron-2:
TTS论文大全: https://github.com/lifefeel/SpeechSynthesis
DeepMind的Tacotron-2的Tensorflow实现。 本文描述的深度神经网络模型结构:: Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions
github地址:https://github.com/Rookie-Chenfy/Tacotron-2
还有一些其他版本的Tacotron2开源项目:
这个 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)
什么?语音合成开源代码不会跑,follow me!的更多相关文章
- 一个可随意定位置的带色Toast——开源代码Crouton的简单使用
今天在公司要求的代码中,要求显示的提示能够更加具有多样化,而不是简单的Toast字样,第一想法肯定是自定义View呀,结果在浏览中发现还有这样的一个开源代码——Crouton. 几经折腾,发现这个东西 ...
- GitHub + VSTS 开源代码双向同步
GitHub已经是全球开源代码的大本营了,通过以下统计你可以看到仅仅javascript在github就有超过32万个活动的repo.很多开发人员都会把自己的一部分代码分享到github上进行开源,一 ...
- CWMP开源代码研究5——CWMP程序设计思想
声明:本文涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文介绍自己用过的ACS,其中包括开源版(提供下载包)和商业版(仅提供安装包下载 ...
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- CWMP开源代码研究2——easycwmp安装和学习
声明:本文是对开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文所有笔记和代码可以到csdn下载:http://download.csdn.n ...
- CWMP开源代码研究1——开篇之作
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
- 开源代码Window下搭建rtmp流媒体服务器
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综合:有这样需求,将摄像头 ...
- 你的C#代码是怎么跑起来的(二)
接上篇:你的C#代码是怎么跑起来的(一) 通过上篇文章知道了EXE文件的结构,现在来看看双击后是怎样运行的: 双击文件后OS Loader加载PE文件并解析,在PE Optional Header里找 ...
- AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载
一.AgileEAS.NET SOA 中间件简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速 ...
- 苹果刷机相关开源代码(如iRecovery等)收集汇总(不断更新中...)
下面截图是在下面开源代码下使用VS2015修改部分代码后适配而成,可以在Windows平台上运行, 下载连接: http://pan.baidu.com/s/1i4zKGx3.
随机推荐
- vue中数字和字符串的转换问题(v-bind和v-model的使用)
可以看到上面自增加时,成了拼接字符串的效果. 打开vue工具查看: 此时n和sum都是数字,可以正常自增加,但是操作了section之后,n就变成了字符串: 此时再执行自增加,sum也会变成字符串形式 ...
- 详解GuassDB数据库权限命令:GRANT和REVOKE
本文分享自华为云社区<GuassDB数据库的GRANT & REVOKE>,作者: Gauss松鼠会小助手2 . 一.GaussDB的权限概述 在数据库中,对象的创建者将成为该对象 ...
- 【KMP】border 题解
题目描述 输入 输出 样例输入 abaabaa 样例输出 17 样例解释: f[2][a] = 1 f[3][a] = 1 f[4][a] = 1 f[4][b] = 2 f[5][a] = 1 f[ ...
- FreeSWITCH的moh使用笔记
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前写过FreeSWITCH安装的文章,今天整理下moh使用过程中遇到的问题及解决方案,并提供moh音频下载途径.F ...
- 数据结构-线性表-双向链表(c++)
与单循环链表类似,但析构函数需要注意 析构函数: 因为while循环的条件是p->next!=front,所以不能直接delete front: template<class T> ...
- 使用 redis 实现分布式接口限流注解 RedisLimit
前言 很多时候,由于种种不可描述的原因,我们需要针对单个接口实现接口限流,防止访问次数过于频繁.这里就用 redis+aop 实现一个限流接口注解 @RedisLimit 代码 点击查看RedisLi ...
- List 切割成小 list 分批处理数据
使用 Google Guava 库中的方法对 bmList 进行分割. Lists.partition() 方法用于将一个列表按指定大小进行分割,返回一个包含分割后子列表的新列表. 在这个例子中,bm ...
- HTML基础_01
HTML 基础_01 01.初识 HTML 什么是 HTML! Hyper Text Markup Language(超文本标记语言).超文本包括文字.图片.音频.视频.动画等. HTML5,提供了一 ...
- 文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题
二.用go语言,假设将一个长度为r的字符串散列到m 个槽中,并将其视为一个以 128 为基数的数,要求应用除法散列法.我们可以很容易地把数 m 表示为一个 32 位的机器字,但对长度为r的字符串,由于 ...
- P5318 查阅文献
题意大概意思就是分别用dfs与bfs遍历一个图,特殊要求是从编号小的点开始遍历. 用邻接表存图,至今我也没想明白怎么才可以从编号小的点开始遍历,明白是排序,但是不知道如何排序,题解中的排序方法是:按照 ...