Deep Voice 1 论文学习
文章目录
1 简介
这篇文章介绍了 Deep Voice ,一个完全由深度神经网络构建的生产质量的文本到语音系统,为真正的端到端神经语音合成奠定了基础。
该系统包括五个主要的模块:定位音素边界的分割模型、字素-音素转换模型、音素时长预测模型、基频预测模型和音频合成模型。
在音素分割模型中,论文提出了一种基于深度神经网络的音素边界检测方法。
对于音频合成模型,论文实现了一个不同的 WaveNet ,它需要的参数更少,比原来的训练更快。
通过为每个组件使用神经网络,论文提出的系统比传统的文本到语音系统更简单、更灵活;在传统的系统中,每个组件都需要费力的特征工程和广泛的领域专业知识。
最后,论文提出的系统可以比实时更快地执行推理,并描述了 CPU 和 GPU 上优化的 WaveNet 推理内核,比现有的实现可达到400倍的速度。
Deep Voice 是受传统的文本-语音管道的启发,采用相同的结构,但用神经网络取代所有组件,使用更简单的特征:首先将文本转换为音素,然后使用音频合成模型将语言特征转换为语音。
与之前的工作不同(使用手工设计的特征,如光谱包络、光谱参数、非周期参数等),系统中唯一的特征是:带有重音标注的音素、音素持续时间和基频(F0)。
这种特性的选择使系统更容易适用于新的数据集、声音和领域,而不需要任何手动数据注释或额外的特性工程。
论文们通过在一个全新的数据集上重新训练整个管道,而不修改任何超参数来演示这一声明,该数据集只包含音频和未对齐的文本副本,并生成相对高质量的语音。
在传统的 TTS 系统中,这种调整需要几天到几周的时间,而 Deep Voice 只需要几个小时的人工工作和模型训练时间。
实时推理是生产质量TTS系统的要求;如果没有它,系统就不能用于大多数TTS的应用。先前的工作已经证明,WaveNet 就可以产生接近人类水平的语音。
然而,由于 WaveNet 模型的高频、自回归特性,波网推理提出了一个令人生畏的计算问题,迄今为止还不知道这种模型是否可以用于生产系统。
我们肯定地回答了这个问题,并演示了高效、比实时的 WaveNet 推断内核,产生高质量的 16khz 音频,并实现了比以前的 WaveNet 推断实现 400 倍的加速。
2 相关研究
之前的研究使用神经网络替代多个TTS系统组件,包括字素-音素转换模型,音素持续时间预测模型,基础频率预测模型和音频合成模型。
然而,与 Deep Voice 不同的是,这些系统都不能解决 TTS 的全部问题,许多系统使用专门为其领域开发的手工工程特性。
最近,在参数音频合成方面有很多工作,特别是 WaveNet 、 SampleRNN 和 Char2Wav 。
虽然 WaveNet 可以用于条件和无条件音频产生,但 SampleRNN 只用于无条件音频产生。 Char2Wav 用一个基于注意的音素持续时间模型和等效的 F0 预测模型扩展了 SampleRNN ,有效地为基于 SampleRNN 的声码器提供了本地条件信息。
Deep Voice 在几个关键方面与这些系统不同,显著地增加了问题的范围。
首先, Deep Voice 是完全独立的;训练新的 Deep Voice 系统不需要预先存在的 TTS 系统,可以使用短音频剪辑数据集和相应的文本文本从头开始。相反,复制上述两个系统都需要访问和理解已存在的 TTS 系统,因为它们在训练或推理时使用来自另一个 TTS 系统的特性。
其次, Deep Voice 最大限度地减少了人工工程功能的使用;它使用单热编码字符进行字素到音素的转换、单热编码的音素和重音、音素持续时间(毫秒)和标准化对数基频(可以使用任何 F0 估计算法从波形计算)。
所有这些都可以很容易地从音频和文本以最小的努力获得。相比之下,以前的工作使用了更复杂的特性表示,如果没有预先存在的 TTS 系统,就不可能有效地复制系统。
WaveNet 从 TTS 系统使用多个特性,包括价值观如一个词的音节数量,位置词的音节,当前帧的音素,语音频谱的和动态特征光谱和激发参数,以及它们的衍生品。
Char2Wav 依赖世界 TTS 系统的声码器特征来预训练他们的对齐模块,其中包括 F0 、光谱包络和非周期参数。
最后,我们关注于创建一个可用于生产的系统,这要求我们的模型实时运行以进行推理。 Deep Voice 可以在几分之一秒内合成音频,并提供了合成速度和音频质量之间的可调平衡。
相比之下,以前的 WaveNet 结果需要几分钟的运行时间才能合成一秒钟的音频。 SampleRNN 原始出版物中描述的 3 层架构在推理过程中需要的计算量大约是我们最大的 WaveNet 模型的 4-5 倍,所以实时运行模型可能会很有挑战性。
3 TTS 系统组件
TTS系统由五个主要的构建模块组成:
字素到音素模型:将书面文本(英语字符)转换为音素(使用像ARPABET这样的音素字母表编码)。
分割模型:对语音数据集中的音素边界进行定位。给定一个音频文件和音频的一个音素逐音素转录,分割模型确定每个音素在音频中的起始和结束位置。
音素持续时间模型:预测音素序列(一句话)中每个音素的时间持续时间。
基频模型:预测一个音素是否被发声;如果是,该模型预测整个音素持续时间的基频(F0)。
音频合成模型:将字素到音素、音素持续时间和基频预测模型的输出组合,并以与所需文本相对应的高采样率合成音频。
描述(a)训练程序和(b)推理程序的系统图,输入在左边,输出在右边;在系统中,持续时间预测模型和 F0 预测模型是由一个经过联合损失训练的单一神经网络来实现的;字素到音素模型用作音素字典中不存在的单词的后备;虚线表示非学习组件。
在推理过程中:通过字素-音素模型或音素字典输入文本来生成音素;接下来,将音素作为音素持续时间模型和 F0 预测模型的输入提供,以便为每个音素分配持续时间并生成 F0 轮廓;最后,将音素、音素时长和 F0 作为语音合成模型的局部条件输入特征,生成最终的语音。
与其他模型不同的是,在推理过程中不使用分割模型;相反,它用于用音素边界注释训练语音数据;音素边界包含音素持续时间,可以用来训练音素持续时间模型;在语音合成模型中,使用带有音素、音素持续时间和基频的音频进行训练。
3.1 字素到音素模型
字素到音素模型,是基于 “字素到音素转换的序列到序列神经网络模型” 开发的编码器-解码器架构。使用了具有门控递归单元(GRU)非线性的多层双向编码器和同样深度的单向 GRU 解码器。每个解码器层的初始状态初始化为对应编码器转发层的最终隐藏状态。
该体系结构采用教师强制训练,采用波束搜索进行解码。我们在编码器中使用 3 个双向层(每个层 1024 个单位),在解码器中使用 3 个大小相同的单向层,并使用宽度为 5 个候选的波束搜索。在训练过程中,我们在每个循环层后使用概率为 0.95 的 dropout 算法。
训练过程中,我们使用 Adam 优化算法与 β1 = 0.9, β2 = 0.999, ε= 10^-8, 批处理大小为 64,学习速率为 10^-3 ,退火速率为 0.85 每1000次迭代。
3.2 分隔模型
分割模型经过训练,输出对齐的给定的话语和目标音素序列。
这个任务类似于语音识别中将语音与文本输出对齐的问题。在该领域,连接主义者时间分类( CTC )损失函数已被证明专注于字符对齐,以学习声音和文本之间的映射。
我们从最先进的语音识别系统中采用了卷积递归神经网络体系结构,用于音素边界检测。
用 CTC 训练生成音素序列的网络将为每个输出音素产生简短的峰值。尽管这足以粗略地将音素与音频对齐,但还不足以检测到精确的音素边界。
为了克服这一点,我们训练预测音素对的序列而不是单个音素。然后,该网络将倾向于在接近一对音素之间边界的时间步输出音素对。
输入音频以 10 毫秒步长计算 20 个梅尔频率倒谱系数( MFCCs )为特点。在输入层之上,有两个卷积层(时间和频率的 2D 卷积),三个双向循环的 GRU 层,最后是一个 softmax 输出层。
卷积层使用单位步幅、高度 9 (频率)和宽度 5 (时间)的核,循环层使用 512 个 GRU 单元(每个方向)。
在最后一次卷积和递归层之后,应用概率为 0.95 的 Dropout 。为了计算音素对错误率,我们采用波束搜索进行解码。
为了解码音素边界,我们在相邻的音素对至少有一个音素重叠的约束下进行宽度为 50 的波束搜索,并跟踪每个音素对在话语中的位置。
在训练中,我们使用 Adam 优化算法与 β1 = 0.9 , β2 = 0.999 , ε= 10^-8 ,批处理大小为 128 , 10^-4 的学习速率和退火速率 0.95 每 500 次迭代。
3.3 音素持续时间模型与基频模型
系统单一的结构来共同预测音素持续时间和随时间变化的基频。
该模型的输入是一个带有重音的音素序列,每个音素和重音都被编码为一个热载体。
该架构包括两个完全连接的层,每个层有 256 个单元,然后是两个单向循环层,每个层有 128 个GRU单元,最后是一个完全连接的输出层。在初始全连通层和最后一个循环层之后,应用概率为 0.8 的 Dropout 。
最后一层对每个输入音素产生三种估计:音素持续时间、音素清音的概率(即具有基频)和 20 个时间相关的 F0 值,这些值在预测持续时间内均匀采样。
该模型通过最小化音素持续时间误差、基频误差、音素清音概率的负对数似然以及与 F0 相对于时间的绝对变化成比例的惩罚项来实现平滑,从而使音素持续时间误差、基频误差、音素清音概率的负对数似然以及与 F0 相对于时间的绝对变化成比例的联合损失达到最优。
在训练过程中,我们使用 Adam 优化算法与 β1 = 0.9 , β2 = 0.999 , ε= 10^-8 , 批处理大小为 128 , 3*10^-4 的学习速率和退火速率 0.9886 每 400 次迭代。
3.4 音频合成模型
音频合成模型是 WaveNet 的一个变种。 WaveNet 由一个调节网络和一个自回归网络组成,该网络将语言特征提高到所需的频率,并在离散音频样本 y{0, 1, …, 255} 上生成概率分布 P(y) 。
我们改变层数,剩余通道数 r (每层隐藏状态的维数),以及跳过通道数 s (在输出层之前层输出被投影到的维数)。
WaveNet 包括一个上采样和调节网络,然后是带有 r 剩余输出通道和 tanh 非线性门控的 2*1 的卷积层。
我们用 Wprev 和 Wcur 将卷积分解为每个时间步的两个矩阵乘法。这些层通过残差连接连接起来。
每一层的隐藏状态连接到一个 r 向量,用 Wskip 投影到 s 跳过通道,然后用 relu 非线性进行两层 1*1 的卷积(权值 Wrelu 和 全职Wout )。
WaveNet 使用转置的卷积进行上采样和调节。我们发现,如果我们先用一叠双向准 rnn ( QRNN )层对输入进行编码,然后通过重复到所需频率进行上采样,我们的模型会表现得更好,训练得更快,需要的参数更少。
我们最高质量的最终模型使用 40 层网络, r = 64 个残差通道, s = 256 个跳步通道。在训练过程中,我们使用了 β1 = 0.9 , β2 = 0.999 , ε= 10^-8 的 Adam 优化算法,批量大小为 8 ,学习率为 10^-3 ,每 1000 次迭代退火率为 0.9886 。
4 结果
我们在一个内部英语语音数据库上训练我们的模型,该数据库包含约 20 小时的语音数据,这些数据被分割为 13079 个话语。
此外,我们还提供了基于暴雪 2013 数据子集训练的模型的音频合成结果。
这两个数据集都是由一位职业女性演讲者说的。
所有的模型都是使用 TensorFlow 框架实现的.
4.1 分割结果
我们使用 8 个 Titanx Maxwell gpu 进行训练,将每个批处理在 gpu 之间平均分配,并使用在不同 gpu 上使用环形全局归约平均梯度的计算,每次迭代大约花费 1300 毫秒。
经过大约 14000 次迭代,模型收敛到 7% 的音素对错误率。我们还发现音素边界不一定是精确的,随机移动音素边界 10-30 毫秒对音素质量没有影响,因此我们怀疑音素质量对超过某一点的音素对错误率不敏感。
4.2 字素到音素结果
我们在 CMUDict 获得的数据上训练了一个字素-音素模型。我们去掉了所有不以字母开头、包含数字或有多个发音的单词,这样在原来的 133854 个字素-音素序列对中就剩下了 124978 个字素-音素序列对。
我们使用一个 Titanx Maxwell GPU 进行训练,每次迭代大约花费 150 毫秒。经过约 20000 次迭代,该模型的音素错误率为 5.8% ,单词错误率为 28.7% ,与之前报道的结果基本一致。
与之前的工作不同,我们在解码过程中不使用语言模型,在我们的数据集中不包括具有多种发音的单词。
4.3 音素持续时间与基频结果
我们使用一个 Titanx Maxwell GPU 进行训练,每次迭代大约需要 120 毫秒。在大约 20000 次迭代后,模型收敛到 38 毫秒(音素持续时间)和 29.4 Hz (基频)的平均绝对误差。
4.4 音频合成结果
我们将音频数据集中的话语划分为一个一秒块,每个块有 1/4 秒的上下文,在开始时用 1/4 秒的静默填充每句语。我们过滤掉主要为沉默的块,最后总共剩下74348块。
我们对模型进行了不同深度的训练,包括残差层堆栈中的 10 、 20 、 30 和 40 层。我们发现低于 20 层的模型会导致较差的音频质量。 20 层、 30 层和 40 层模型都能产生高质量的可识别语音,但 40 层模型的噪声比 20 层模型小,可以通过高质量的耳机检测到。
先前的研究已经强调了感受野大小对决定模型质量的重要性。事实上, 20 层模型的接受野只有 40 层模型的一半。然而,当在 48khz 运行时, 40 层的模型只有 83 毫秒的感受野,但仍然可以产生高质量的音频。这表明 20 层模型的接收场是充分的,我们推测音频质量的差异是由于其他因素而不是接收场大小。
我们在 8 个 Titanx Maxwell GPU 上训练,每个 GPU 有一个数据块,使用环形全局归约在不同的 GPU 上计算平均梯度。每次迭代大约需要 450 毫秒。我们的模型在大约 300000 次迭代后趋于收敛。我们发现单个 1.25s 的数据块就足以使 GPU 的计算饱和,而批处理并不能提高训练效率。
与高维生成模型一样,模型丢失与个体样本的感知质量在一定程度上无关。当模型具有异常高的损失声音明显嘈杂,模型优化低于某一阈值没有损失指示其质量。此外,模型架构中的变化(如深度和输出频率)可能会对模型损耗产生重大影响,而对音频质量的影响则很小。
为了评估我们的 TTS 管道中各个阶段的感知质量,我们使用 CrowdMOS 工具包和方法从 Mechanical Turk 众包了平均意见评分( MOS )评分。
为了单独的音频预处理的效果, WaveNet 模型质量,和音素持续时间和基频模型质量,我们提出 MOS 得分对于各种话语类型,包括合成结果的 WaveNet 输入(持续时间和 F0 )从地面实况音频中提取,而不是由其他模型合成。
结果如下表所示。我们有目的地在评分者评估的每批样本中包含地面实况样本,以突出人类语言的增量,并允许评分者区分模型之间更细粒度的差异;这种方法的缺点是,产生的 MOS 分数将显著低于如果评分者只提供合成音频样本。
首先,我们发现 MOS 显著下降时只需将采样音频流从 48 千赫至 16 赫兹,特别是结合法律压缩和量化,可能是因为 48 kHz 样本呈现给评级机构作为基准为 5 分,一个低质量的嘈杂的合成结果是 1 分。
当使用地面实况持续时间和 F0 时,我们的模型得分很高,我们的模型的 95% 置信区间与地面实况样本的置信区间相交。然而,使用合成频率会降低 MOS ,进一步包括合成时间会显著降低 MOS 。
结论是,朝向自然 TTS 的进展的主要障碍在于持续时间和基频预测,而我们的系统在这方面并没有有意义地进步超过目前的技术水平。
最后,我们的最佳模型运行速度略慢于实时模型,因此我们通过对运行速度比实时模型快 1 倍和 2 倍的模型获得分数来调整模型大小,从而证明综合质量可以换取推理速度。
我们也测试了基于原始 WaveNet 出版物的完整特征集训练的 WaveNet 模型,但是没有发现这些模型和基于我们的简化特征集训练的模型之间有知觉上的差异。
4.5 暴雪数据集结果
为了演示我们系统的灵活性,我们在暴雪 2013 数据集上用相同的超参数重新训练了所有模型。在我们的实验中,我们使用了一个 20.5 小时的数据集子集,该子集被分割为 9741 个话语。我们评估了模型,该过程鼓励评价者直接比较合成音频与地面真实情况。显示设置, 16 kHz 组合和扩展音频接收 MOS 评分 4.65±0.13 ,而我们的合成音频接收 MOS 评分 2.67±0.37 。
5 优化推理
虽然 WaveNet 在生成高质量的合成语音方面表现出了很大的潜力,但最初的实验报告显示,短语音的生成时间可达数分钟或数小时。由于模型的高频、自回归特性,波网推理提出了一个难以置信的具有挑战性的计算问题,它比传统的递归神经网络需要更多数量级的时间步长。
当生成音频时,单个样本必须在大约 60 秒( 16khz 音频)或 20 秒( 48khz 音频)内生成。对于我们的 40 层模型,这意味着单层(由几个矩阵乘法和非线性组成)必须在大约 1.5 秒内完成。相比之下,访问驻留在内存的值在一个CPU可以 0.1 毫秒。
为了实时执行推断,我们必须非常小心,永远不要重新计算任何结果,将整个模型存储在处理器缓存(而不是主存)中,并优化利用可用的计算单元。这些相同的技术可以用于使用 PixelCNN 加速图像合成到每幅图像不到一秒。
用我们的 40 层 WaveNet 模型合成一秒钟的音频大约需要 55109 个浮点运算( FLOPs )。任何给定层中的激活都依赖于前一层和前一时间步中的激活,因此必须一次一个时间步和一层地进行推理。
单个层只需要 42*10^3 次 FLOPs ,这使得实现有意义的并行性非常困难。除了计算要求,该模型有大约 1.6*10^6 个参数,如果用单一精度表示,这相当于约 6.4 MB 。
在 CPU 上,单个 Haswell 或 Broadwell 核的单精度吞吐量峰值约为 77*10^9 次 FLOPs , l2 - l1 缓存带宽约为 140 GB/s 。模型必须在每个时间步从缓存加载一次,这需要 100GB/s 的带宽。即使模型适合 L2 缓存,实现也需要利用最大带宽的 70% 和峰值 FLOPS 的 70% ,以便在单个核心上实时进行推断。
跨多个核分割计算减少了问题的难度,但它仍然具有挑战性,因为推理必须在最大内存带宽和峰值 FLOPs 的很大一部分下运行,同时保持线程同步。
与 CPU 相比, GPU 具有更高的内存带宽和峰值 FLOPs ,但它提供了更专门的、因此更有限制的计算模型。为每一层或每个时间步启动一个内核的幼稚实现是站不住脚的,但是基于持久性 RNN 技术的实现可能会利用 GPU 提供的吞吐量。
我们在 CPU 和 GPU 上实现了高速优化的推理内核,并证明了可以实现比实时速度更快的波网推理。上表列出了不同型号的 CPU 和 GPU 推断速度。在这两种情况下,基准只包括自回归、高频音频生成,而不包括语言条件作用特征的生成(这可以在整个话语中并行完成)。
我们的 CPU 内核是实时运行的,或者在某些模型上运行得比实时还要快,而 GPU 模型还没有达到这样的性能。
5.1 CPU实现
我们通过避免任何重计算、进行缓存友好的内存访问、通过多线程实现高效同步并行工作、最小化非线性故障、通过线程固定避免缓存抖动和线程争用,以及使用定制的硬件优化例程进行矩阵乘法和卷积来实现实时 CPU 推理。
对于CPU的实现,我们将计算分为以下步骤:
1. 样本嵌入
2. 层推理
3. 输出
如下图所示,我们在两组线程之间并行处理这些内容。
将线程固定到物理内核(或禁用超线程)对于避免线程争用和缓存抖动非常重要,并可将性能提高约 30% 。
根据模型大小的不同,非线性( tanh 、 sigmoid 和 softmax )也会占用推断时间的很大一部分,因此我们用高精度近似代替所有非线性。
这些近似产生的最大绝对误差为 tanh 的 1.5*10^3 , sigmoid 的 2.5*10^3 , e^x 的 2.4*10^5 。使用近似而不是精确的非线性,性能增加了大约 30% 。
我们也实现了将权重矩阵量化到 int16 的推理,并发现使用量化时感知质量没有变化。对于更大的模型,量化在使用更少的线程时提供了显著的加速,但线程同步的开销使它在使用更大的线程时不起作用。
最后,我们使用 PeachPy 专门为我们的矩阵大小编写定制的 AVX 汇编内核,用于矩阵向量乘法。在使用 float32 时,使用自定义汇编内核的推断速度比 Intel MKL 快 1.5 倍,比 OpenBLAS 快 3.5 倍。两个库都不提供等效的 int16 操作。
5.2 GPU实现
由于它们的计算强度,许多神经模型最终部署在 gpu 上, gpu 的计算吞吐量比 cpu 高得多。因为我们的模型是基于内存带宽和失败的,所以在 GPU 上运行推断似乎是一个很自然的选择,但结果却带来了一系列不同的挑战。
通常,代码在 GPU 上以一系列内核调用的方式运行,每个矩阵乘或向量操作都是它自己的内核。然而, CUDA 内核启动的延迟(可能高达 50 毫秒)和从 GPU 内存加载整个模型所需的时间对于这样的方法来说是非常大的。这种风格的推理内核最终会比实时内核慢大约 1000 倍。
为了在 GPU 上接近实时性,我们转而使用持久 RNNs 技术构建一个内核,它在一个内核启动中生成输出音频中的所有样本。模型的权值只加载到寄存器一次,然后在整个推理过程中不卸载它们而使用。
由于 CUDA 编程模型和这些持久内核之间的不匹配,生成的内核专门针对特定的模型大小,编写起来非常费力。
虽然我们的 GPU 推断速度不是很实时,但我们相信通过这些技术和更好的实现,我们可以在 GPU 和 CPU 上实现实时的 WaveNet 推断。
6 结论
在这项工作中,我们通过构建一个完整的神经系统,证明了当前的深度学习方法对于一个高质量的文本到语音引擎的所有组件都是可行的。我们将推理优化到比实时更快的速度,表明这些技术可以应用于以流媒体的方式实时生成音频。我们的系统是可培训的,无需任何人力参与,极大地简化了创建 TTS 系统的过程。
我们的工作为探索开辟了许多新的可能方向。通过仔细优化,在 GPU 上进行模型量化,在 CPU 上进行 int8 量化,以及在 Xeon Phi 等其他架构上进行试验,可以进一步提高推理性能。
另一个方向自然是去除阶段之间的分离和合并的分割,持续时间预测,预测模型和基本频率直接到音频合成模型,从而将问题转化为一个完整的 sequence-to-sequence 模型,创建一个端到端可训练的 TTS 系统,整个系统允许我们训练没有中间监督。
为了代替融合模型,通过更大的训练数据集或生成建模来改进持续时间和频率模型技术可能会对声音的自然性产生影响。