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

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 语音合成,输入文字产生声音,我们会从四个方面来讲:P14讲解1 和 2,而本篇P15将讲解 3 和 4
1 TTS before End-to-End :在端到端技术之前TTS是怎么做的
2 Tacotron: End-to-end TTS :硬train一发的时代
3 Beyond Tacotron :硬train一发的后时代
4 Controllable TTS :怎么控制TTS合出我们要的声音


I Beyond Tacotron

那在有了 Tacotron 之后呢?是不是有了 Tacotron 所有的问题就统统被解决,没有什么好研究的了?其实不是, Tacotron 并没有解决所有的问题。

首先 Tacotron 会遇到的问题是有时候 合出来的发音会有错 (occasional mispronunciation),有时候会拼错字。产生这样的原因是在训练Tacotron 时,所使用的是 的方法,其训练包含的词汇量有效,当我们要合成的语音中包含训练中没有的词时,模型就只能靠猜导致最终发音错误,那有可能使用包含全部词汇的训练集么?当然没有,即使最大的英文语音数据集也仅有一本英文字典的一半的词汇。

1.1 Mispronunciation

在这里插入图片描述
有一个解决的方法是,不要把character当作输入,找一个比较好的 lexicon 词典,lexicon里有 词汇word 和 音素phoneme的对应关系,将要输入给Tacotron的文字转为phoneme再输入,这样就不会有念错词汇的可能了。但用lexicon还会有一些问题的,举例来说
   OOV问题:想要机器念词典中未出现的词,如 “nCoV”
有一个解决方法是 给Tacotron 同时输入 character 和 phoneme 混合起来的东西。比如在训练时,将某些词汇(即使词典里有)用character来表示。而且,这样做的好处是,假设之后我们知道一些OOV词汇的phoneme后,我们可以通过更新词典来修正发音。

1.2 More information for Encoder

在这里插入图片描述
有时候,我们也会把文法资讯加到Tacotron的输入里,那为什么要把文法资讯加到输入里呢?文法资讯至少可以告诉我们哪些词汇合起来可以算是一个片语,类似分词的方法。

同样,在文献上,通过BERT对输入的文字做embedding,将这个embedding输入给Tacotron

1.3 Attention

在这里插入图片描述

1.3.1 Guided Attention

既然我们期待我们的attention能够拟合Encoder steps 和 Decoder steps成一条斜线,我们何不把这样的想法加到Attention里呢?在训练时就告知Attention希望它拟合出一条对角线,这种方法就叫做 Guided Attention ,类似图上,相当于给Attention画了一个禁止出入的区域,如果训练时参数落到了禁止出入的区域,那么在训练的时候就要更新参数使得它与禁止出入的区域的loss更小。

Guided Attention要求 Attention 的参数 一定要落在对角线附近。还有一些其他方法可以给 Attention 更强的限制。
在这里插入图片描述

1.3.2 Monotonic Attention

比如说,Monotonic Attention 会要求 Attention 一定要由左向右,这个细节不讲。

1.3.3 Location-aware Attention

还有一些其他的方法,比如说 Location-aware Attention ,Tacotron的第二个版本就是用 Location-aware attention 的 (ASR中讲过)
在这里插入图片描述
上图的纵轴是 Character Error Rate,衡量合成的声音讯号里面有多少词汇是念错的。是通过谷歌的语音辨识系统去辨识语音,再去和原来的文字做比对。

1.3.4 Different Attention for <10s LJ speech

其实 Attention 有非常多可以研究的地方,大家可以参考上图的论文,它会告诉你 Attention 对于 Tacotron 的语音合成会有多么的重要。

有趣的是,这篇文献做了上图第二个图的实验,只拿 LJ speech 里面长度小于10s的声音进行训练,训练的时候所有的语音的长度都小于10s,但测试的时候,会测试超过10s的句子去念。实验发现,如果选择不同的 Attention ,模型的表现有很大的不同。如上图超过10s后的使用Content-Based Attention 蓝线的表现很差。

1.3.5 Attention in Deep Voice (v3)

在这里插入图片描述
首先,第一个小技巧是说,既然Attention的参数对角线化更好,而不直接强制Attention直接就是对角线的呢,对于Guided Attention而言,出现不在对角线的参数只会增加loss进行惩罚,而上图的Attention会在测试时(仅在测试时),直接将不在对角线区域内的Attention参数直接设置为0

第二个小技巧是说,在计算Attention时的 query (decoder) 和 key (encoder) 都加上 positional encoding,这个 positional encoding 是由 speaker 的资讯来决定的

1.4 Fast Speech

在这里插入图片描述

还有一种方法是 Fast Speech ,它和 DurlAN 其实是一样的,不同的团队在同一时间几乎提出了同样的方法。
  输入 character ,如 c a t
  输出 acoustic feature
在Fast Speech中,不再使用seq2seq模型,而是这样做的
  首先,Encoder把character变成embedding
  接下来,有个 Duration 的 模块 ,它预测每一个character应该念多长(类似Tacotron中的Attention),输出的数字就是对应vector的重复次数,并且我们希望Duration生成的数字的总和与最终输出的acoustic feature的长度相等,如最终输出6个acoustic feature就要生成 c a t 的数字2 3 1和为6
  最终,把带有重复的embedding输入给Decoder,输出预测的acoustic feature

注意,Duration 在测试时,是生成数字扩展embedding变长。但在训练的时候,Duration的输出会给出正确答案,并直接按照这个正确答案重复embedding,同样Duration也会根据正确答案跟新参数。那像这样的正确答案该怎么得到呢?在 Fast Speech 的原始论文里面,它是先训练一个 Tacotron,根据 Tacotron 的Attention去计算每一个character embedding要重复几次才能和最终的acoustic feature等长。

最终的实验结果表明,Fast Speech 比 Tacotron和 Transformer TTF都有着更少的重复、更小的Error等等,效果很好

1.5 Dual Learning

在这里插入图片描述
TTS和ASR互为表里,正好相反,它们都可以用seq2seq模型+Attention来解。
  ASR :输入 语音 ,输出文字
  TTS :输入 文字 ,输出语音
它们可以串在一起,变成一个循环,这个循环叫做 Speech Chain ,那这个Speech Chain把ASR和TTS接在一起,有什么妙用呢?
   可以做Dual Learning,让ASR和TTS互相去增进彼此的能力

那怎么能让ASR和TTS互相增进彼此的能力呢?
在这里插入图片描述   假设我们有了训练好的TTS和ASR,我们可以收集到很多的声音讯号,但没有文字标注的。我们用ASR把声音转成文字以后,就有了成对的文字和声音的训练数据。然后,就可以拿成对的数据去训练一个TTS系统。同样,反过来就可以训练一个ASR系统。

此时,是可以把ASR和TTS组成的系统看作成一个 “ auto-encoder ”,ASR是一个Encoder,TTS是一个Decoder

II Controllable TTS

为什么我们要讨论,TTS能不能被控制呢?因为一段声音讯号里面,它的组成其实包含了好几个方面:

  1. 说什么 : 可以通过TTS解决
  2. 谁在说 : 我们希望我们可以操控我们的语音合成系统,可以合成某个特定的人的声音,也有人叫做 voice cloning
  3. 怎么说 : 我们怎希望我们合成的声音可以有一定的 Intonation (语调), stress (重音), rhythm (韵律) -> Prosody (抑扬顿挫)

那我们该怎么控制语音合成系统来合出我们想要的声音呢?,如下图,有这样一种方法:

2.1 Controllable TTS Model

在这里插入图片描述
一般的语音合成系统,输入一段文字,输出一段声音。如果我们想要操控这个语音合成的抑扬顿挫,我们可以再给TTS一段语音输入,这段声音也被称为Reference audio,通俗而言,就是告诉机器,”请你跟我一起念“。

这个好像有点像是Voice Conversion,我们在讲VC的时候也是给模型输入两段声音,一段用来提取出内容信息,另一段用来提取出语者特征。也就是,我们可以用蓝色这段声音的语者去念黄色这段语音的内容。

没错,Controllable TTS 和 VC是非常相似的,它们也都有一段Reference audio提供声音风格。只不过Controllable TTS的语音内容是由文字来决定的,而VC是由语音来决定的。当然,因为模型的类似,训练方法也是蛮类似的。

2.2 Controllable TTS Training

在这里插入图片描述
对于一般的 TTS 输入文字,输出acoustic feature ,训练目标就是最小化 输出的 与 真实值 之间的L1距离。
而在 Controllable TTS 中,还加了一段 Reference audio ,如上图的 “hello”,而在训练的时候,这个 Reference audio 就是 我们的真实值 ,训练目标与一般的TTS一样;测试的时候,只要把 Reference audio 换掉 ,就可以改变合成的声音的特征。

但这里存在一个问题,那就是如果我们直接将 Reference audio 给出为真实值,那么TTS在训练时很有可能直接把 Reference audio 当作输出进行输出,因为这样甚至可以达到最好的训练目标,并且在测试时,可能直接就把 Reference audio 输出出去。那该怎么解决这个问题呢?

2.2 Speaker Embedding for Controllable TTS Training

在这里插入图片描述
举例来说,可以用 Speaker Embeddding 来替换 Reference audio 的真实值,可以训练一个 Feature Extractor 来仅仅提取 语者的特性而忽略内容,而这个Extractor是固定的、不跟着训练的。这样就可以解决上述的问题。

还有另外一种作法叫做GST-Tacotron

2.3 GST-Tacotron

在这里插入图片描述
GST = global style tokens,同样GST-Tacotron也是要做 Controllable TTS ,也需要 Reference Audio。
文字的部分和Tacotron处理一样,经过Encoder得到等长的重复的character embedding,而 Reference Audio 输入给 Feature Extractor,此时这个 Feature Extractor 不再是固定了,而是和整个TTS一起训练出来,与Speaker Embedding不一样。这个 Feature Extractor 输入 Reference Audio ,输出一个 vector,并同样重复等长,并将这些vector和Encoder结果做Attention。

同样 , 这个 Feature Extractor 是怎么设计的,只保留语者信息,而过滤掉 Reference Audio 的内容信息呢?其结构图如下图。
在这里插入图片描述
首先,在 Feature Extractor 里 有一个 Encoder,这个Encoder可以是 LSTM,输入Reference audio ,输出一段 vector,那这个vector是最终的输出么,不是!这个GST巧妙的地方就是Encoder的结果不直接拿来当作 Feature Extractor 的输出。这个Encoder的输出是attention weight,还有另外一组需要训练得到的vector setglobal style tokens ),再把 Encoder的输出分别乘上这组vector set,并求和,这个输出才是 Feature Extractor 的输出。也就是说,这个Encoder只能决定attention的weight,而带不出content的内容。

最终训练得到 vector set 的每一种就代表一种抑扬顿挫,如语速、音高、音调等。

那还有哪些其他的方法,防止 Reference audio 内的content资讯直接被复制到输出呢,有一个方法,我们在Voice Conversion中了解过,就是做 Two-stage Training

2.3 Two-stage Training

在这里插入图片描述
我们可以通过在训练中刻意增加一些 文字 和 Reference Audio内容不同的训练资料,可是问题是我们没有这样对应的正确答案,比如上图中用“I love you”的语调念“good bye”听起来是什么样的。那怎么办呢?

我们可以在后面加一个 ASR 语音辨识系统,这个想法和GAN就有点像了
在这里插入图片描述
假设我们有一个已经训练好的 ASR 语音辨识系统,现在呢,给我们的Controllable TTS一段文字 + Reference Audio,TTS就会产生一段声音讯号,接下马上交给ASR再得到文字。至此,我们希望我们训练的TTS能够将输入的文字与ASR输出的文字越类似越好,并且Reference Audio的文字和输入的文字是不同的,也就期待我们的TTS不会把Reference Audio的文字提取出来放到输出的声音讯号里。同时,我们还可以把TTS中的Attention与ASR中的Attention越相似越好当作一个训练目标。

至此,语音合成的部分到此结束。

猜你喜欢

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