赞
踩
李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
课件ppt已上传至资源,可免费下载使用
在上两篇中(P12、13),我们讲解 Speech Separation 语音分离技术,从定义、分类再到其中一种 Speaker Separation的评估和排列Assignment问题与最新的解决方法,端到端的 TasNet 的模型结构,以及Speech Sparation领域的前沿研究领域及其扩展等。
而在本篇开始我们继续讲解 Text-to-Speech (TTS) Synthesis 语音合成,输入文字产生声音,我们会从四个方面来讲:本篇将讲解1 和 2
1 TTS before End-to-End :在端到端技术之前TTS是怎么做的
2 Tacotron: End-to-end TTS :硬train一发的时代
3 Beyond Tacotron :硬train一发的后时代
4 Controllable TTS :怎么控制TTS合出我们要的声音
而这里每一个module都是一个deep network,其实把它们都串起来训练,那就是一个End-to-End模型。但第一版的Deep Voice 1中的每一个模块都是分开训练的,因此不是端到端模型,但在Deep Voice 3 中改成了端到端。
接下来我们将进入真正的端到端模型来解决Text-to-Speech (TTS) Synthesis 文字转语音问题。
Taco:墨西哥卷饼,tron没有特别的意思,只是要增加名字的科技感而已(对不起,听到这我笑出了声)
带有*的作者是喜欢taco的,带|的作者是喜欢sushi寿司的。有两个版本,一个17年、一个18年。
在进入 Tacotron之前,就已经有一些端到端的TTS的尝试:
Model | Input | Output |
---|---|---|
Tacotron | character 字母 | spectrogram 声谱图 |
First Step Towards End-to-end Parametric TTS Synthesis | phoneme 音素 | 特殊的acoustic feature(还需要经过 STRAIGHT) |
Char2wav | character 字母 | 特殊的acoustic feature(还需要经过 SampleRNN) |
可以注意到,Tacotron 的输入和输出是最适合端到端的。
Tacotron 的模型大略说来 就是 seq2seq + attention ,还有一个Post-processing
接下来,我们就来看模型里的每一个module的具体原理。
这个Encoder的目的类似于上一篇Deep Voice里的Grapheme-to-phoneme模块一样,只不过Encoder输入的是字母,如h e l l o ! (甚至可以加标点符号),而输出的就是 代表每一个字母发音的vector,也相当于phoneme。再丢给attention和Decoder部分。
首先,输入的字母经过Transform后,变成Input embeddings
然后,Input embeddings 通过 Pre-net,这个Pre-net就是几层Fully-connected network并带有dropout
最后,Pre-net的输出还会再丢给一个叫做CBHG的模型,如上图,得到每一个代表character的发音的向量
既然CBHG如此复杂,我们一定要使用这个模型么?当然,在第二版Tacotron里就不再使用CBHG了,如上图v2
这里的Attention就是普通的attention机制,今天在做语音合成和语音辨识所使用的attention 有共同的地方,那就是它们的输出的文字和声音是 monotonic aligned 单调对齐的,文字和声音是有共同的顺序的,等一下我们还会再回来看Attention的问题。
如上图,attention图的纵轴上的每一个点是Encoder输出的embedding,横轴代表每一个embedding在Decoder后会输出的时间宽度。这个Attention的目标有点像是 Modeling Duration ,我们在讲Deep Voice时有讲模型会预测每个phoneme要发音多长。简而言之,Attention要学的就是对于每一个character对应的embedding在Decoder会产生多长的声音讯号。
如果训练得到的Attention是类似左图的一条斜线,通常是训练好的。如果是类似右图的比较糊的,通常是模型训练效果并不好,合出来的声音不会太好。
Decoder就是吃Attention的结果来产生声音讯号。这里的Decoder也类似于一般的seq2seq里的Decoder一样,
首先,输入一个zero vector 代表起始
之后,这个zero vector丢给Pre-net,再丢给RNN
最后,这个RNN会去做attention产生 attention context vector再丢给下一层RNN,这个下一层的RNN就会产生输出
在Tacotron里面,Decoder有一个比较特别的地方是,它不是一次只产生一个vector,它会一次产生好多一个vector(比如上图的三个黄框框),而Decoder产生的vector就是 多个 Mel-spectrogram。
产生的vector的数目叫做 r,在Tacotron的第一版里这个r可以设3、5(第二版r=1),那为什么要Decoder产生多个vector呢?可能的原因是因为声音讯号非常非常的长,我们产生的一个 spectrogram vector才代表了非常短的一段声音讯号(通常是代表了0.01秒的声音讯号),所以如果要产生1秒钟的声音讯号就需要100个这样的vector拼起来。需要产生上百个vector才能拼成一段最终的声音讯号。
同时,RNN因为产生非常长的vector的效率是很低的,因为生成的有多长就要花多少个timestamp。而通过增加生成vector的数量来减少时间是一种蛮有效率的方法。
这种 r 的设定是Tacotron第一代非常独特值得自豪的设计,但有趣的是,在第二代Tacotron中 r=1 和一般的 Decoder 并无区别。
在第一个timestamp的RNN生成3个vector,哪一个vector输入给下一个timestamp的输入呢?有各种不同的做法,可以把三个vector串起来当作输入,不过在第一代的Tacotron中直接把第三个vector当作下一个RNN的输入。同样在Decoder中,我们一样需要teacher forcing。那对于测试时没有正确答案,训练时使用teacher forcing会不会导致过拟合呢?不会,因为我们的Pre-net中有一定的dropout。
在做这个Decoder时,还要有一个module来决定什么时候结束。在语音辨识的时候可以通过decode出<EOS>来结束,但语音合成上我们产生的并不是token,是continuous vector。所以Decoder加了额外的module,判断RNN的hidden layer是否结束。
在Tacotron里面的Decode之后,还有一个Post processing的network。
在第一代Tacotron里,Post processing也是一个CBHG,在第二代里就是一堆的卷积。它会把Decoder的输出:很多个vector当作输入,然后再输出另外一排vector。那我们为什么要经过这样的处理呢?因为RNN的生成vector是按照顺序一个一个产生的,所以后面的vector只能看前面已经产生的vector来生成,且无法更改前面已经生成的vector。因此,加上一个后处理的network,把整个输出都看一遍再产生新的输出。
也因此,Tacotron训练的时候有两个loss,训练是会最小化这两个loss
一个是计算RNN Decoder的loss:Mel-spectrogram
另一个是计算后处理后的loss:Mel/Linear-spectrogram
而第二代优于第一代,一部分原因就是Vocoder的改变,将第一代使用的Griffin-Lim(rule-based)换成第二代的Wavenet。
这里的分数 mean opinion score :MOS是通过人为打分,0-5分
奇妙的是,Tacotron在做 inference 测试一定要加 dropout 结果才会好。在NLG中也有类似的问题,比如用GPT生成句子的时候,每次输出几率最大的字,可能会导致生成重复句子,也因此我们在用GPT生成句子的时候也需要一定的随机性,随机sample才能产生比较好的句子。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。