zhihutheirTTS1

https://zhuanlan.zhihu.com/p/88502449  from zhihu

最近研究了一段时间的TTS模型。然后将自己的一些成果研究分享一下下,有不对的地方还请忽略。

 

一、Merlin语音合成系统。

这个系统应该可以说是历史比较长久的一套系统了,其搭配了三个声码器,WORLDSTRAIGHTWORLD2,感觉采用WORLD的偏多一点。WORLD的介绍网上已经很多啦,这里就不赘述了。

系统流程梳理:

先贴一张流程图:

光看着就复杂。。。简单来说就四个模块:

 

①文本处理前端

这个模块自己感觉是本系统里最难上手的地方,它要干的工作是:

1.将文字转化为自己的建模单元,比如文字转音素、韵律标注、词性标注等。

2.将标注转化为HTS格式。

3.根据设计的question来将每一个单元转化为向量。

HTS格式的详解和question的设计可以参考,里面也详细讲了一些所需的知识:

https://mtts.readthedocs.io/zh_CN/latest/merlin.html​mtts.readthedocs.io

我是没有把它完全弄懂。。。。

经过这个模块,得到Merlin接受的HTS格式标签

 

 

然后就可以把config文件中的

NORMLAB : True

执行merlin脚本即可得到Merlin系统的输入啦,当然前提是把question准备好。

②时长模型、声学模型

时长模型,如字面意思就是预测每个单元的发音长度。

声学模型就是为了得到WORLD所需的各种参数。

获得时长模型的输入输出就需要:

1.每个单元对应的长度。

2.每个单元的向量。

单元向量在文本前端可以获得。长度的获得就比较麻烦了。以没有韵律对齐标签的数据为例,

参考MTTS这个项目

Jackiexiao/MTTS​github.com图标

首先利用alig工具,将音素对齐,然后再处理。跟着这个项目的Readme操作,比较容易。

主要是为了得到每个音素的长度。

有了这个完整的.lab文件,就可以启动Merlin的 05、06脚本了,05脚本是处理时长模型的训练文件,06脚本是处理声学模型的训练文件。对应配置文件里,只需开启

处理完毕后得到的文件,打开一下可以发现:

1.语言学特征文件(normal_lab文件夹里的文件)

以我624行的question为例,label为19行,首尾为‘sil’静音,会被去掉:

 

2.时长模型训练目标文件

可以看出其做法就是:

Label中的前两个数值相减,再除以5000(5ms,默认值)的个数,即多少个5ms。其预测的就是这个5ms的个数。

 

3.声学模型的输入输出文件:

此时就比较关注(426,628)形状的来历,其做法:

转换完628维度后的矩阵为(17,628),然后每一行重复时长个数,重复的不同在于倒数三维

 

搞清楚了输入输出后,基本整个流程就清楚了。然后对应训练即可。

 

二、端到端系统

经过了麻烦的Merlin系统,来梳理一下端到端的系统。

端到端的系统就比较简单了。

1.准备自己的建模单元,想怎么建就怎么建。

2.找好vocoder,准备对应输出。

3.训练就好了。

 

首先用微软的FastSpeech来说

FastSpeech: Fast, Robust and Controllable Text to Speech​arxiv.org

和Merlin做个对比:

区别在于:

Merlin的embbeding是由人工设定的(question)。

端到端的embbeding是训练过程中形成的。

 

论文中FastSpeech借助Tacotron2 ransformerTTS的alig为duration标签用以训练它的时长预测能力。后面的做法都和Merlin一致,将embeding的输出复制几个送入Decoder。

星辰漫游者:FastSpeech复现笔记​zhuanlan.zhihu.com图标

这有大大复现的代码。

 

FastSpeech属于非自回归模型,所以其预测时间非常得短。并且可以调控duration的长短来进行发音长短的控制、一定韵律的控制。

 

然后自回归模型以Tacotron2DeepVoice3为代表梳理一下,

 

借一下别人的图。。。

自回归模型就是说,它必须一步一步地执行,自己判断或人为设定最大步数。相比Tacotron ,Tacotron2加入了一个stop token状态,从固定预测步数变为了动态的预测步数,可以一定程度上地减少运算量。

从结构上看,自己感觉其实和Tacotron是一样的,不同的就是换成了全卷积,然后把attention优化了一下,循环的步骤只送入query,(key,value)都放到了encoder层面,这么做应该也是为了加速解码过程。Github上也有很多代码了,此处就不贴代码了。

所以相同的FLOAS能力下,非自回归模型显著要快于自回归模型。

自己实验得,同样十个字,生成mel图速率,FastSpeech在几十毫秒级,Tacotron2在三百毫秒级,DeepVoice3在一百五十毫秒级。

 

最后,贴一个实验结果,

最近看见Google发了一篇Tacotron控制韵律、节奏的论文,自己复现了一下,做法略有不同。

https://arxiv.org/pdf/1910.01709.pdf​arxiv.org

论文是一部分监督学习,一部分无监督学习,有两个控制参数,一个是由人控制,另一个是无监督训练的。

然后自己懒到不想标注数据,所以改成全部的无监督学习,采用了2维的flag向量生成一个控制信息。

采用了标贝公开的数据实验,网络自己总结的向量变化情况如下:

 

当输入[-1,-1]时,生成的语音说话快,[1,1]时则很慢。

基本符合这个数据库的数据特点,情感变化不大,说话快慢变化比较凸显。

后续搭一个来展示各个模型的效果,和最后这个实验结果。

原文地址:https://www.cnblogs.com/skydaddy/p/11988228.html