赞
踩
Tacotron2是由Google Brain 2017年提出来的一个语音合成框架。
Tacotron2:一个完整神经网络语音合成方法。模型主要由三部分组成:
声谱预测网络主要包含一个编码器和一个包含注意力机制的解码器。编码器把字符序列转换成一个隐层表征,解码器接受这个隐层表征用以预测声谱图。
编码器模块包含一个字符嵌入层(Character Embedding),一个3层卷积,一个双向LSTM层。
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,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。