课程向:深度学习与人类语言处理 ——李宏毅,2020 (P14)

Text-to-Speech (TTS) Synthesis

李宏毅老师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合出我们要的声音


I TTS before End-to-End

  1. 1939 VODER :纽约世博会上展示的一种语音合成的系统,它是通过操控类似电子琴的琴键去合出不同的声音。
  2. 1960s IBM computer : 在Bell lab实验室,John Larry Kelly Jr.使用 IBM computer 来进行语音合成,最早使用计算机来进行唱语音合成:唱歌 。、
  3. Concatenative Approach : 对于商用系统,过去最常用的语音合成的技术就是Concatenative Approach,如下图,原理很简单,我们首先会有一个很大的数据库,数据库中包含了大量的文字对应的声音讯号。例如,我们想要合出“你好吗”的声音讯号,只需要在数据库中找出“你”、“好”、“吗”三个字的声音讯号,再把它们拼起来输出即可。而怎么挑出声音讯号,让它们串起来是通顺的,这就是一个研究的重点,也就是Concatenation cost问题。当然,它是有一定的局限性的,如没办法合成任意某个人的声音、数据库太大
    在这里插入图片描述
  4. Parametric Approach : 进入机器学习时代后,使用机器学习方法进行语音合成的技术就叫做 Parametric Approach 参数化方法。最早是用HMM、后来DNN。最知名的叫做HTS,如下图。
    在这里插入图片描述
  5. Deep Voice : 在进入End-to-End “硬train一发”之前,有一个最接近 “硬train一发”,但还不是 “硬train一发” 的方法,叫做 Deep Voice,这个是百度做的。它是输入一段文字,输出一段声音讯号,中间有很多module模块:
    Grapheme-to-phoneme : 输入文字,机器猜测文字的发音,如输入CAT这三个字母,其中的C应该念C还是K,如下图,模型判断 发音应该为“K AE T”,并将发音结果输入给另外两个模块。
    Duration Prediction : 输入一段phoneme,判断出每一个phoneme的时间长度应该是多少,如 K 应该发0.1s。
    Fundamental Frequency Prediction : 输入一段phoneme,输出这段发音应该有的音高,去预测声带振动频率是多少。有一些发音不需要声带振动,就预测为X,如K的预测就是X
    Audio Synthesis : 输入 发音phoneme + 每个phoneme的时间长度 + 每个phoneme的音高,输出合成的语音

而这里每一个module都是一个deep network,其实把它们都串起来训练,那就是一个End-to-End模型。但第一版的Deep Voice 1中的每一个模块都是分开训练的,因此不是端到端模型,但在Deep Voice 3 中改成了端到端。
在这里插入图片描述
接下来我们将进入真正的端到端模型来解决Text-to-Speech (TTS) Synthesis 文字转语音问题。

II Tacotron: End-to-end TTS

在这里插入图片描述
Taco:墨西哥卷饼,tron没有特别的意思,只是要增加名字的科技感而已(对不起,听到这我笑出了声)
带有*的作者是喜欢taco的,带|的作者是喜欢sushi寿司的。有两个版本,一个17年、一个18年。

2.1 Before Tacotron

在这里插入图片描述
在进入 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 的输入和输出是最适合端到端的。

2.2 Tacotron Overview

在这里插入图片描述Tacotron 的模型大略说来 就是 seq2seq + attention ,还有一个Post-processing
接下来,我们就来看模型里的每一个module的具体原理。

2.3 Encoder

在这里插入图片描述
这个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

2.4 Attention

在这里插入图片描述
这里的Attention就是普通的attention机制,今天在做语音合成和语音辨识所使用的attention 有共同的地方,那就是它们的输出的文字和声音是 monotonic aligned 单调对齐的,文字和声音是有共同的顺序的,等一下我们还会再回来看Attention的问题。

如上图,attention图的纵轴上的每一个点是Encoder输出的embedding,横轴代表每一个embedding在Decoder后会输出的时间宽度。这个Attention的目标有点像是 Modeling Duration ,我们在讲Deep Voice时有讲模型会预测每个phoneme要发音多长。简而言之,Attention要学的就是对于每一个character对应的embedding在Decoder会产生多长的声音讯号。

如果训练得到的Attention是类似左图的一条斜线,通常是训练好的。如果是类似右图的比较糊的,通常是模型训练效果并不好,合出来的声音不会太好。

2.5 Decoder

在这里插入图片描述
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是否结束。

2.6 Post processing

在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。

2.7 Result

在这里插入图片描述
这里的分数 mean opinion score :MOS是通过人为打分,0-5分

2.8 Tip

在这里插入图片描述
奇妙的是,Tacotron在做 inference 测试一定要加 dropout 结果才会好。在NLG中也有类似的问题,比如用GPT生成句子的时候,每次输出几率最大的字,可能会导致生成重复句子,也因此我们在用GPT生成句子的时候也需要一定的随机性,随机sample才能产生比较好的句子。

猜你喜欢

转载自blog.csdn.net/qq_44574333/article/details/108198290
今日推荐