天天看点

端到端语音合成:tacotron2及其改进方向

传统的语音合成方案如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中使用的是位置敏感注意力机制,凸显出位置二字。自注意力机制早期应用于自动翻译领域,其计算注意力是基于待翻译语句的全局,但语音发音往往只需要考虑当前语句发音近期的位置。而tacotron引入了位置注意力机制,它的做法是对注意力进行累加和合并,这种方式可以保障离发音位置越近的帧越能影响当前帧的发音。

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

端到端语音合成:tacotron2及其改进方向

序列到序列和机器翻译原理三言两语较难解释清楚,如果看到这里尚未理清原理的童鞋先别往下看,循序渐进,tacotron原理将更加复杂哦~

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相当。

--
 文章转载自:https://blog.csdn.net/qq_41571456/article/details/103836727
           

传统的语音合成方案如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中使用的是位置敏感注意力机制,凸显出位置二字。自注意力机制早期应用于自动翻译领域,其计算注意力是基于待翻译语句的全局,但语音发音往往只需要考虑当前语句发音近期的位置。而tacotron引入了位置注意力机制,它的做法是对注意力进行累加和合并,这种方式可以保障离发音位置越近的帧越能影响当前帧的发音。

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

端到端语音合成:tacotron2及其改进方向

序列到序列和机器翻译原理三言两语较难解释清楚,如果看到这里尚未理清原理的童鞋先别往下看,循序渐进,tacotron原理将更加复杂哦~

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相当。