深入浅出讲解语音合成二:tacotron2及其改进方向

时间:2024-04-02 15:46:02

传统的语音合成方案如Merlin、HTS等,依赖于fulllabel和匹配问题集的生成,导致前端的处理工作是非常繁琐的。近年来,为了减少前端的数据准备工作,诞生了tacotron等优秀的端到端语音合成方案。本文着重讲解一下在业界广受好评的tacotron2,其结合了seq2seq(序列到序列)、位置敏感注意力机制及其端到端的语音合成方法,非常值得学习。

1.序列到序列

序列到序列最早应用于机器翻译邻域,下文将以机器翻译为例进行讲解seq2seq原理。序列到序列包含编码器(encoder)和解码器(decoder)两个部分。编码器和解码器常用LSTM网络构成,将一个语言序列转换到另一个语言序列。编码器网络负责接收源句子的embedding并提取特征解码器网络负责将编码文本解码输出成翻译的语言。这两个过程分别称为编码和解码的过程。编码器输出编码文本(encoder_out)<START>decode开始标志位(<Go> frame)。在编码器中,所有的字符将embedding成为一个词向量再进行编码。由于解码器(decoder)是一个自回归的过程,对于第一个decoder单元,则使用一个初始化的全零向量(<START>)作为解码过程的起始状态。

深入浅出讲解语音合成二:tacotron2及其改进方向

但是LSTM网络在长序列下,序列尾难以关注到序列头部的信息,这无疑局限了机器翻译的性能。为了在翻译过程中,将注意力“撒”向全局,有了注意力机制与序列到序列的结合。

2.注意力机制

我们从简单的自注意力机制说起。下列句子是我们想要翻译的输入句子:

The animal didn't cross the street because it was too tired

这个“it”在这个句子是指什么呢?它指的是street还是这个animal呢?

当模型处理这个单词“it”的时候,自注意力机制会允许“it”与animal,street建立联系。以编码过程为例,随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词(计算注意力得分),帮助模型对本单词更好地进行编码。

深入浅出讲解语音合成二:tacotron2及其改进方向

第一步就是从每个单词的词向量中生成三个向量。也就是说对于每个单词,我们创造一个查询向量(Query)、一个键向量(Key)和一个值(Value)向量。这三个向量是通过词嵌入与三个权重矩阵相乘创建的。

深入浅出讲解语音合成二:tacotron2及其改进方向

一个简单粗暴的比喻是在档案柜中找文件。查询向量就像一张便利贴,上面写着你正在研究的课题。键向量像是档案柜中文件夹上贴的标签。当你找到和便利贴上所写相匹配的文件夹时,拿出它,文件夹里的东西便是值向量。将单词的查询向量分别乘以每个文件夹的键向量,得到各个文件夹对应的注意力得分(这里的乘指的是向量点乘,乘积会通过 softmax 函数处理)。

深入浅出讲解语音合成二:tacotron2及其改进方向

深入浅出讲解语音合成二:tacotron2及其改进方向

我们将每个文件夹的值向量乘以其对应的注意力得分,然后求和,得到最终自注意力层的输出。

深入浅出讲解语音合成二:tacotron2及其改进方向

最终,自注意力机制的公式可如下表示:

深入浅出讲解语音合成二:tacotron2及其改进方向

在当前词的Query向量与同序列其他单词的Key向量和Value向量相乘的过程中,其他词的含义会融入到注意力算出来的Z向量中。其中,Z向量可称之为注意力上下文(attention_context)。每个序列将产生等于序列字符个数的Z向量,而每个Z向量都隐含了整个序列的上下文信息。所谓的注意力机制,正是在当前词向量的生成过程中,渗透进句子的上下文信息。基于不同方式的注意力机制,计算方式不同,渗透进句子信息的侧重点也有所不同。tacotron2中使用的是位置敏感注意力机制,凸显出位置二字。

引入注意力机制的机器翻译流程图

深入浅出讲解语音合成二:tacotron2及其改进方向

序列到序列和机器翻译原理三言两语较难解释清楚,如果看到这里尚未理清原理的童鞋可以反手问一波度娘,网络上的资料也有不少。

3.tacotron2

深入浅出讲解语音合成二:tacotron2及其改进方向

tacotron2的encoder过程较为清晰,此处略去不表,重点讲解decoder过程并分为上下两部分。

深入浅出讲解语音合成二:tacotron2及其改进方向

括号内为测试时观测到的特征维度。由于使用的声码器为LPCnet,BFCC维度为36维。以上的Q、K、V向量仅方便理解的粗略划分,请勿较真。可以将tacotron2的注意力机制类比到自注意力机制的计算方式,需要生成三个向量,用于注意力的计算。在训练过程中,Q向量包含了音频与文本的混合信息,K向量包含了累加注意力权重与当前注意力权重之和(位置敏感注意力的精髓所在),累加注意力权重过程中体现了位置信息,有助于防止语音合成过程的错漏字情况,V向量则为encoder输入的编码文本,将在decoder过程中逐步输入。

深入浅出讲解语音合成二:tacotron2及其改进方向

深入浅出讲解语音合成二:tacotron2及其改进方向

tacotron中引入注意力机制的作用是什么?

替换传统语音合成的时长模型,将梅尔谱与文本做对齐,使用梅尔谱作为Query,去计算注意力得分,在梅尔谱对应的文本embedding处注意力得分就高。使用tacotron合成语音有时会存在尾声的问题,这是由于注意力机制输出的gate_prediction未达到门限值所导致的,在出现尾音时,debug发现尾音下的gate_prediction与正常时的值相差甚小,后续优化可以考虑修改loss函数。但最终的语音合成项目,我们并未使用极为不稳定的tacotron方案,而是舍弃了tacotron2的注意力机制计算,加入了传统语音合成方案中的时长模型,效果稳定且音质与tacotron2相当。

对于去年新出的transformertts和fastspeech等端到端合成方案,前者引入了在NLP邻域的新秀transformer,但未对transformer做什么修改,照搬过来效果一般推断过程还很慢。fastspeech在transformertts做了改进,使其可并行化运行并引入了时长模型(regulate model),但其时长模型的训练是用了另一个模型(tacotron2或者transformertts)的合成结果做对齐,虽然还是端到端了,但是未免太消耗算力。