第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > tts代表_Text-to-Speech (TTS) Synthesis语音合成----控制语言合成

tts代表_Text-to-Speech (TTS) Synthesis语音合成----控制语言合成

时间:2020-02-10 20:21:23

相关推荐

tts代表_Text-to-Speech (TTS) Synthesis语音合成----控制语言合成

炫云:Text-to-Speech (TTS) Synthesis语音合成​

I Beyond Tacotron

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

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

1.1 Mispronunciation

语音合成任务并不需要像训练语音识别模型那样上万小时的有标注数据。 数据集平均一个人的声音有 20 多个小时,就能保证合成出来的声音品质非常高。但是,20多个小时的人声是无法保证词汇量的。VCTK 数据集词汇大概在 5000 左右。就算是 Nancy 词汇量也不到 2 万。目前最大的公开数据集像 LibriTTS 的词汇量也才不到 10 万。一般英文词典的数量,都是十万以上。模型虽然能猜测英文的单词的音素。但是它看过的词汇不够,没法准确估计出每个词应有的发音方式。所以它在看到生僻词或新词时,会念错。使用者会对此难以接受。我们要怎么办呢?

有一个解决的方法是,不要把character当作输入,找一个比较好的lexicon词典,lexicon里有 词汇word 和 音素phoneme的对应关系,将要输入给Tacotron的文字转为phoneme再输入,这样就不会有念错词汇的可能了。但用lexicon还会有一些问题的,举例来说

OOV问题:想要机器念词典中未出现的词,如 “nCoV”

有一个解决方法是 给Tacotron 同时输入 character 和 phoneme 混合起来的东西。比如在训练时,将某些词汇(即使词典里有)用character来表示。当出现有新词不会念的时候,可以将新词添加到lexicon字典中,从而使得机器学会念这个新词。而且,这样做的好处是,假设之后我们知道一些OOV词汇的phoneme后,我们可以通过更新词典来修正发音。

1.2 More information for Encoder

有时候,我们也会把句法资讯加到Tacotron的输入里,那为什么要把语法资讯加到输入里呢?

句法信息对一个句子的发音也有重要的贡献。比如它能决定一个句子的短句和语气。如图1所示例子,these two boys 可以是一个短语,eating apples 可以是一个短语。通常我们会把一个完整意义的短语连读,而在分隔的短语之间,留有气息。对于一些歧义比较多的语言而言,比如中文,句法信息对断句的影响可能会造成你对某句话完全不同的理解。这和中文分词中的歧义是一样的。比如「欢迎新老师生前来就餐」可以被划分为:

欢迎 / 新老师 / 生前 / 来就餐

欢迎 / 新老师生 / 前来 / 就餐

停顿的位置稍微不一样,意思就天差地别了。如果我们能把这些信息提前告诉给 Tacotron。

也有人把 BERT 的embedding当作是 Tacotron 的输入来做语音合成。其中的直觉是,BERT 利用自注意力机制,它的每一个字嵌入都融合了上下文信息,当然也融合了语义句法信息。这些信息对语音合成是有帮助的。

1.3 Attention

1.3.1 Guided Attention

既然我们期待我们的attention能够拟合Encoder steps 和 Decoder steps成一条斜线,我们何不把这样的想法加到Attention里呢?原来的 Tacotron 损失是计算模型输出与目标语音越接近越好。而 Guided Attention 则是在原来的损失上,再加上一项对注意力的正则化。在训练时就告知Attention希望它拟合出一条对角线,这种方法就叫做Guided Attention,类似图上,相当于给Attention画了一个禁止出入的区域,如果训练时参数落到了禁止出入的区域,那么在训练的时候就要更新参数使得它与禁止出入的区域的loss更小。

Guided Attention 只是一个指导,而不是强制学到的注意力权重就是要在对角线的地方。还有一些其他方法可以给 Attention 更强的限制。

1.3.2 Monotonic Attention

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

1.3.3 Location-aware Attention

还有一些其他的方法,比如说Location-aware Attention,Tacotron的第二个版本就是用 Location-aware attention 的 .在 ASR 中讲到过的 Location-aware attention.

上图的纵轴是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 蓝线的表现很差。

衡量指标的计算方式为,用合成的声音,喂给现有的语言识别系统转换为文字后,对照目标的文稿看看有多少词汇是错的。这个错的差异越大,代表语音合成系统表现越糟。实验表明,用GMMv2b或DCA的注意力结果就会好。可以点开链接看具体论文细节。注意力机制依然是一个非常值得研究的方向。

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 embedding来决定的。这个 Speaker embedding包含了说话者的音色、感情和速度等信息。直觉上看,说话者的速度信息是会影响到位置编码的。

1.4 Fast Speech

还有一种方法是Fast Speech,它和DurlAN其实是一样的,不同的团队在同一时间几乎提出了同样的方法。

输入 character ,如 c a t

输出 acoustic feature

在Fast Speech中,不再使用seq2seq模型,而是这样做的

首先,Encoder把character变成embedding

接下来,有个Duration的 模块 ,它预测每一个character应该念多长(类似Tacotron中的Attention),输出的数字就是对应vector的重复次数,例如上图中是231,那么根据231将字母embedding分别复制2/3/1次,也就是经过Duration模型后字母embedding延展了。并且我们希望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等长。

最后Duration模型就相当于一个regression模型,看到红色的embedding就复制2次,蓝色的embedding就复制3次。。。

整个大模型就避开Duration模块,进行反向传播

最终的实验结果表明,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能不能被控制呢?因为一段声音讯号里面,它的组成其实包含了好几个方面:

说什么 : 可以通过TTS解决谁在说 : 我们希望我们可以操控我们的语音合成系统,可以合成某个特定的人的声音,也有人叫做voice cloning怎么说 : 我们希望我们合成的声音可以有一定的 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 set(global style tokens),他的每个维度对应的是语音的某个style。再把 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越相似越好当作一个训练目标。

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

最后总结下关于 GST-Tacontron 补充几个问题:

如何知道 GST-Tacontron 学到的不是 Speaker Identity,而是 Prosody 呢?

因为 GST 的数据集中只有一个说话人,所以不会有不同说话人的差异,只有抑扬顿挫的差异。如果我们想做得更好一点,我们需要把 Speaker Identity 和 Prosody 再做特征分离。在语音数据集中,我们需要知道哪些句子是同一个人说的。从这些句子中,我们会抽出某些共同的 Style Vector。除掉这些共同的特征后剩下的就会是表征 Prosody 信息的向量。

GST-Tacontron 只用一个向量来表征说话的风格,这是否足够表征抑扬顿挫信息呢?

一个向量的表征能力有限。这未必是一个好的解决思路。我们需要实验研究,说话风格能否用一个向量来表示。会不会太粗糙了,有些信息损失,没有表示到。因此有些做可控 TTS 的模型会考虑用一排向量,数量为输入序列的长度。这样每一小段声音信号,都有一个向量表征。或许这样才能真正地 Control 一个句子的 Prosody。这是一个尚待研究的问题。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。