INTRODUCTION
Deep Voice3 是由百度提出的一个全新的全卷积 TTS 架构。百度的主要工作分为如下五个方面:
- 提出了一个全卷积的 character-to-spectrogram 架构,它能并行计算,并且比使用循环单元的架构快
- Deep Voice3 训练非常快,并且可以扩展到 LibriSpeech 语音数据集,该数据集包含来自 2484 个说话人的 820 小时音频数据
- 可以产生单调的注意力行为 (monotonic attention behavior),避免了 seq2seq 语音合成中常见的错误
- 比较了几种波形合成方法的质量,包括 WORLD、Griffin-Lim 以及 WaveNet
- 描述了 Deep Voice3 推理内核的实现,它可以在单个 GPU 上提供高达每天一千万次推理
ARCHITECTURE
Deep Voice3 能够将各种文本特征(如字符、音素、重音)转换为各种声码器参数,如梅尔谱、线性对数谱、基频、频谱包络等。这些声码器参数可用作波形合成模型的输入
Deep Voice3 架构包括 3 个组件:
- 编码器:完全由卷积构成,用于提取文本特征
- 解码器:也是完全由卷积构成,利用多跳卷积注意力机制 (multi-hop convolutional attention mechanism) 将提取的文本特征,以一种自回归的方式解码成低维的音频特征
- 转换器:同样是完全由卷积构成,它从解码器隐藏状态预测最终声码器的参数(取决于声码器选择)。与解码器不同,转换器是非因果的,因此它可以依赖未来的上下文信息
优化的目标是解码器和转换器损失的线性组合。作者将解码器和转换器分开并应用于多任务训练,因为这样可以使得实践中注意力更好的学习。具体来说的话,梅尔谱预测的损失指导了注意力机制的训练,因为注意力的训练利用了梅尔谱预测以及声码器参数预测的梯度
TEXT PREPROCESSING
- 字母全部转大写
- 删除所有标点符号
- 每句话的结尾由且仅由句号或问号组成
- 使用特殊的分隔符替换单词之间的空格,这些分隔符表示说话人在单词之间停顿的时长。共有四种特殊的分隔符,它们表示的含义分别是:含糊不清的单词、标准发音和空格字符、单词之间的短时停顿、单词之间的长时停顿。例如句子 "Either way, you should shoot very slowly," 在 way 后带有长时停顿,在 shoot 后带有短时停顿,可以写成 "Either way% you should shoot/very slowly%." 其中 % 表示长时停顿,/ 表示短时停顿。停顿时长可以通过手工标记或文本音频对齐器
CONVOLUTION BLOCKS
该卷积块包含一个一维卷积滤波器,一个门控可学习的非线性单元,一个残差连接,以及一个缩放因子 $\sqrt {0.5}$。为了引入说话人的相关特征,在经过 softsign 激活函数之后,将说话人特征作为偏置添加到卷积滤波器的输出。卷积块中使用标准正态分布初始化卷积滤波器的权重
Softsign 函数:
$$ y=F(x)=\frac{x}{1+|x|}. $$
ENCODER
编码器网络首先从文本编码开始,将字符或音素转换为可训练的向量表示 $h_e$。然后将 $h_e$ 送入全连接层以投影到目标维度。PreNet 得到的输出再送入一系列卷积块,以提取时间相关的文本信息。最后,它们被投影回 Text Embedding 维度以创建注意力键向量 $h_k$。从注意力键向量和文本嵌入计算注意力值向量 $h_v=\sqrt {0.5}(h_k+h_e)$,以联合考虑 $h_e$ 中的局部信息和 $h_k$ 中的长时上下文信息。键向量 $h_k$ 被各个注意力块用来计算注意力权重,而最终的上下文向量被计算为值向量 $h_v$ 的加权平均
DECODER
解码器以自回归的模式预测接下来的 r (r>1) 帧梅尔谱。由于不能利用后面时刻的数据,所以解码器采用的是 causal convolution 或者也叫做 masked convolution
梅尔谱数据先经过 PreNet,然后通过 casual convolution 层将其变为 query 矩阵。再与 Encoder 的输出的 Key 和 Value 矩阵进行 attention 运算。如此积累多层,最后经过全连接层预测接下来的 r 帧梅尔谱,并且还会预测是否该停止预测(类似于 Tacotron2)。损失函数是 L1 Loss 及交叉熵
ATTENTION BLOCK
Attention 模块就是大家熟知的传统点积计算方法,先用 query 矩阵与 key 矩阵计算 attention 权重,然后再对 value 矩阵加权求和,得到 context 向量。此外,attention block 还引入了位置编码 $h_p (i)$ 帮助文本和频谱进行对齐
$$ h_p(i)=sin(w_si/10000^{k/d})\ ,i=0,2,4,...\\ h_p(i)=cos(w_si/10000^{k/d})\ ,i=1,3,5,... $$
其中,$i$ 是时间步索引,$k$ 是位置编码中的通道索引,$d$ 是位置编码中所有通道的数量,$w_s$ 是编码的位置率。位置率决定了注意力分布中线的平均斜率,大致对应于语速。对于单说话人,query 中的 $w_s$ 被固定为 1,key 中的 $w_s$ 被固定为输入时间步与输出时间步之比;对于多说话人,$w_s$ 通过每个说话人嵌入进行计算(下图左边)
详细流程如下图所示
在翻译场景中,源语言句子和目标语言句子中词的对应顺序并不是严格单调的,而在语音合成中,语音是按照文本顺序读出来的,所以对齐关系会更严格
CONVERTER
转换器网络将解码器的最后隐藏层的输出作为输入,转换器包含若干非因果卷积块,然后预测下游声码器的参数。与解码器不同,转换器是非因果和非自回归的,因此它可以使用解码器的未来信息进行预测。转换器有很多种,可以使用 Griffin-fim 或者 wavenet 等,当然,采用 wavenet 的效果会好一些。整个模型框架如下
RESULTS
Deep Voice3 模型由于采用全卷积而非 GRU 来提取文本及频谱特征,可以大幅提高训练时 GPU 的利用率,相同的 batch size 下,速度是 Tacotron 的 10 倍。并且达到收敛所需的步数也只是 Tacotron 的 1/4。在加入 monotonic attention 后,合成语音的自然语也有所提高