1. 概述
Tacotron2是由Google Brain 2017年提出来的一个语音合成框架。
Tacotron2:一个完整神经网络语音合成方法。模型主要由三部分组成:
- 声谱预测网络:一个引入注意力机制(attention)的基于循环的Seq2seq的特征预测网络,用于从输入的字符序列预测梅尔频谱的帧序列。
- 声码器(vocoder):一个WaveNet的修订版,用预测的梅尔频谱帧序列来生成时域波形样本。
- 中间连接层:使用低层次的声学表征-梅尔频率声谱图来衔接系统的两个部分。
2.声谱预测网络:
声谱预测网络主要包含一个编码器和一个包含注意力机制的解码器。编码器把字符序列转换成一个隐层表征,解码器接受这个隐层表征用以预测声谱图。
编码器:
编码器模块包含一个字符嵌入层(Character Embedding),一个3层卷积,一个双向LSTM层。
- 输入字符被编码成512维的字符向量;
- 然后穿过一个三层卷积,每层卷积包含512个5x1的卷积核,即每个卷积核横跨5个字符,卷积层会对输入的字符序列进行大跨度上下文建模(类似于N-grams),这里使用卷积层获取上下文主要是由于实践中RNN很难捕获长时依赖;卷积层后接批归一化(batch normalization),使用ReLu进行激活;
- 最后一个卷积层的输出被传送到一个双向的LSTM层用以生成编码特征,这个LSTM包含512个单元(每个方向256个单元)。
f e = R e L U ( F 3 ∗ R e L U ( F 2 ∗ R e L U ( F 1 ∗ E ( X ) ) ) ) f_e = ReLU(F_3*ReLU(F_2*ReLU(F_1*E(X)))) fe=ReLU(F3∗ReLU(F2∗ReLU(F1∗E(X))))
H = E n c o d e r R e c u r r e n c y ( f e ) H = EncoderRecurrency(f_e) H=EncoderRecurrency(fe)
其中,F1、F2、F3为3个卷积核,ReLU为每一个卷积层上的非线性激活,E表示对字符序列X做embedding,EncoderRecurrency表示双向LSTM。
class Encoder(nn.Module):
"""Encoder module:
- Three 1-d convolution banks 5x1
- Bidirectional LSTM
"""
def __init__(self, hparams):
super(Encoder, self).__init__()
convolutions = []
for _ in range(hparams.encoder_n_convolutions):
conv_layer = nn.Sequential(
ConvNorm(hparams.encoder_embedding_dim,
hparams.encoder_embedding_dim,
kernel_size=hparams.encoder_kernel_size, stride=1,
padding=int((hparams.encoder_kernel_size - 1) / 2),
# 进行填充,保持输入,输出的维度一致。
dilation=1, w_init_gain='relu'),
nn.BatchNorm1d(hparams.encoder_embedding_dim))
convolutions.append(conv_layer)
self.convolutions = nn.ModuleList(convolutions)
self.lstm = nn.LSTM(hparams.encoder_embedding_dim,
int(hparams.encoder_embedding_dim / 2), 1,
batch_first=True, bidirectional=True)
注意力网络:
Tacotron2中使用了基于位置敏感的注意力机制(Attention-Based Models for Speech Recognition),是对之前注意力机制的扩展(Neural machine translation by jointly learning to align and translate);这样处理可以使用之前解码处理的累积注意力权重作为一个额外的特征,因此使得模型在沿着输入序列向前移动的时候保持前后一致,减少了解码过程中潜在的子序列重复或遗漏。位置特征用32个长度为31的1维卷积核卷积得出,然后把输入序列和为位置特征投影到128维隐层表征,计算出注意力权重。关于具体的注意力机制计算可以参考这篇博客。
Tacotron2中使用的是混合注意力机制,在对齐中加入了位置特征。
e i , j = s c o r e ( s i , c α i − 1 , h j ) = v a T t a n h ( W s i + V h j + U f i , j + b ) e_i,_j=score(s_i,cα_{i−1},h_j) =v_a ^Ttanh(Ws_i+Vh_j+Uf_i,_j+b) ei,