Human Language Processing——Beyond Tacotron

2020-08-06 20:33:53 浏览数 (1)

acotron 并没有解决所有的问题,有时候它合成出的发音会出错。这一次我们会先讲一讲 Tacotron 以外的一些模型。这些模型是基于 Tacotron 的变种。有的解决它的发音出错问题,有的则在其他方面,如注意力,损失,训练技巧上创新,来让 Tacotron 的表现变得更好。还有的是可以控制语气停顿等条件的语音合成,比如第七代微软小冰中用到的,基于人设的语音合成

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

一个解决方法是我们不把字符当作输入,而是找一个质量比较高的词表。这个词表有文字和音素之间对应的关系。我们先把单词通过词典转换为音素,再将音素作为输入,Tacotron的问题似乎就能解决了。但是使用词表始终是有限的。它无法应对没有在词表中出现的词,比如说 新冠状病毒nCoV。对于新词没有发音映射,世上的新词又太多了,而且每天都在更新。一个简单做法是把字符和音素一起输入给Tacotron,训练的时候,随机地把某一些词汇用字符来表示,让Tacotron能够根据学到的字符和音素的对应关系来预测未登录词的音素发音。当然,另一种解决方法是让智能多一点"人工",如果模型预测的发音错了,我们也可以通过更新词表来解决这个问题

句法信息对一个句子的发音也有重要的贡献。对于一些歧义比较多的语言而言,比如中文,句法信息对断句的影响可能会造成你对某句话完全不同的理解,这和中文分词中的歧义是一样的。比如「欢迎新老师生前来就餐」可以被划分为:

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

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

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

Attention 对于 Tacotron 来说是非常重要的。训练好的 Tacotron,它的注意力权重矩阵可视化出来是一条集中的对角线。既然这就是我们想要的,为什么要在之前把这个信息加入到训练的过程中呢。这样模型就会更有意识地去学出这样好的注意力权重矩阵。这便是 Guided Attention。原来的 Tacotron 损失是计算模型输出与目标语音越接近越好。而 Guided Attention 则是在原来的损失上,再加上一项对注意力的正则化。我们限定注意力权重矩阵得分不要超过如图中标黑的指定的区域。若超过了,在训练的时候就会有一个 penalty,计算的损失就会比较大,反向传播就需要更新更多的权重来调整模型学到的注意力权重集中在指定区域

Guided Attention 只是一个指导,而不是强制学到的注意力权重就是要在对角线的地方。还有一些其它方法是会给非常强的限制。Monotonic Attention 会要求注意力权重一定要从左往右。还有在 ASR 中讲到过的 Location-aware attention。Tacotron 的第二个版本用的就是Location-aware attention

Attention 还有许多值得研究的地方。ICASSP 2020 的这篇文章有分析注意力对语音合成有多么重要。这篇论文做了一个有趣的实验。它只拿 LJ Speech 数据集中小于 10s 的声音训练。但测试的时候,故意让机器去念哈利波特的很长的超过 10s 的句子。结果发现,如果 Attention 选的不好,比如用 Content-Based 训练效果就不好。衡量指标的计算方式为,将合成的声音输入到现有的语言识别系统转换为文字后,对照目标的文稿看看有多少词汇是错的。这个错的差异越大,代表语音合成系统表现越糟。实验表明,用 GMMv2b 或 DCA的注意力结果就会好。可以点开链接看具体论文细节。注意力机制依然是一个非常值得研究的方向

百度的第三代 DeepVoice 还提出了一些模型上的小技巧。既然我们希望解码器的注意力权重矩阵是成对角线的,何不直接在推断的时候,把非对角线的一个区域直接设置为0呢?结果发现这个技巧是很有用的。而且不需要改变训练过程。此外,还有一个神奇的技巧是,它把输入注意力的 Query (decoder 产生) 和 Keys (encoder 产生) 都加上了位置编码信息。这样可以加强注意力的计算。而且 Positional Encoding 是由 Speaker 的嵌入信息来调整操控的。这个 Speaker 嵌入包含了说话者的音色、感情和速度等信息。直觉上看,说话者的速度信息是会影响到位置编码的

Fast Speech 和 Duration Informed Attention 是不同团队在同一时间提出的类似的想法。一般输入序列和输出序列是不同长度的任务最适合用 Seq2Seq 框架来解。而这两篇论文用的却不是 Seq2Seq。它在编码器和解码器之间,用的是一个预测每个单词要念多长的模型 Duration。这个 Duration 模块会输入一个单词嵌入,输出每个字符要说的长度。比如输出是2,它就要把当前的字符嵌入复制两次。我们期待解码器的输入与声学特征的长度是一样的,而通常编码器的输入都会比它短很多。所以 Duration 就需要学到怎么把字符嵌入拉长到刚好合适。这个思路是没有错的,但问题是要如何训练 Duration 这个模型呢?其实只要把他当作是一个classification问题就好了,可是ground truth从哪来呢?可以通过语音识别系统做 Alignment 来获得

实验结果发现,FastSpeech 使用了 Duration 模块的好处是,它不会像 Tacotron 或 基于 Transformer 的 TTS 那样,有一些发音上的瑕疵,比如结巴,跳过词汇没念,念错词汇的情况。直觉上看,FastSpeech 在 Duration 上做了一个更大的限制,来避开这些错误。其实 Tacotron 也没有论文中说的表现那么差。之所以错误这么多,是因为测试的句子是一些特殊的案例。比如很多相同的单词,或念一段网址。由于 Tacotron 训练数据中缺乏这类的语料,所以说起来比较有难度

TTS 和 ASR 是两个互为表里的任务。它们可以串在一起,变成一个循环,做 Dual Learning,互相去增强彼此的能力。这便是 Speech Chain

如何让二者互相增强呢?我们先找到两个预训练好的 TTS 和 ASR 系统。ASR 系统可以把声音转成文字,再丢给 TTS 合成语音,让这段合成的语音与初始的声音越接近越好。我们也可以把文字丢给 TTS,让它输出语音。再把语音喂给 ASR 识别出文字,让这些文字与初始的文字越接近越好

Dual Learning 一个好处是可以减少对 文字-语音数据对的依赖。如果局限于数据对去做训练,TTS 和 ASR 学到的东西都有限。因为没有机会接触未成对的海量数据。而使用了 Dual Learning 之后。只需要有文字或者有语音就可以进行训练

0 人点赞