本期介绍华为俄罗斯诺亚方舟实验室团队的2021年的ICMLGrad-TTS: A Diffusion Probabilistic Model for Text-to-Speech
一、从文字到声音:传统语音合成的两步流程
语音合成(text-to-speech,TTS)的核心任务是将文本(和目标音色)转换为自然语音波形。有一族主流方法将这一过程分为两个阶段:
- 特征生成(feature generator):文本首先被转换为梅尔频谱(Mel-spectrogram)。梅尔频谱是对原始波形压缩的时频表示,它是一个二维矩阵,横轴(时间)表示音频分段的时间帧(如每帧20ms),纵轴(频率)是非线性的声音频率刻度,也叫Mel刻度,通常强调人耳更敏感的低频分辨率(如包含64或者128个Mel带),矩阵元素值是每个时间点、每个频率的能量,通常为对数功率。之所以是压缩过的,是因为它:
- 只保留了人耳敏感的频率范围,基于Mel刻度进行了滤波,丢弃了高频细节;
- 是把waveform 做了 短时傅里叶变换(STFT),只保留幅度信息,丢弃了相位信息
- 舍弃一些不可听但存在的超短时间变化
由于梅尔频谱存在信息损失,所以需要接一个声码器模块来补充信息。因为有可能多个waveform对应同一个mel-spectrogram,声码器也适合用一个生成模型去建模、填充。
-
声码器(Vocoder):将梅尔频谱还原为波形。常用方法依赖 WaveNet 2016
等自回归模型,或者HiFi-GAN 2020等生成对抗网络产生最终的语音。
二、Grad-TTS的架构创新
Grad-TTS是一个特征生成算法,输入文字得到梅尔频谱,vocoder需要借用HiFi-GAN等完成(但也讨论了直接端到端生成波形的可行性)。它首次将扩散模型(Diffusion Model)应用于特征生成阶段,此前扩散模型仅用于声码器(如(DiffWave 2020、WaveGrad 2020等),这次研究证明扩散模型在特征生成阶段不仅可行,而且可以表现得很优异。
- 相比自回归生成模型,Grad-TTS直接生成梅尔频谱,避免了逐帧迭代的累积误差。
- 相比传统特征生成,扩散模型对梅尔频谱的天然生成更平滑的结果,减少音素边界处的锯齿,也就减少了人工感。
- 相比于早期扩散模型,Grad-TTS用的是解ODE的方式进行推理,而不是像DiffWave、WaveGrad那样在一个马尔科夫链上逐步采样,推理更快、采样路径稳定、对score的精度更敏感。
- 在对齐时,用一个显式的时长预测(duration predictor)规避了注意力机制常见的对齐失败问题,比如某些字符分配过多/过少帧。
为什么特征生成的扩散模型更难做?我想原因有三:
- 输出空间的复杂度更高。生成 mel-spectrogram 涉及时间对齐、语速控制等复杂因素;
- 控制性要求更高:需要准确表达文本信息、韵律、情感等;
- 反向过程的条件复杂:从纯噪声生成mel特征不仅需要学会语音结构,还要满足输入文本语义。
三、扩散模型
非平衡热力学的启发
想象一个人饱饱地抽了一口烟,猛一下吐出,烟雾会以这位烟民的口作为起点,向外扩散。开始可以看到一团清晰的烟雾,逐渐地在空气中化为无形。如果我们知道完整的动力学规律,掌握气流方向、障碍物、扩散速度,就知道这一刻和上一刻相比,烟雾以何种规律变得更无序,从而知道如何从这一刻回到上一刻。在更极限的情况下,从末态还原初态——从一个已经均匀扩散的介质里反演最初烟雾产生的位置。扩散模型就是这样的思路:
通过一个逐步加噪声的马尔可夫过程,把任意数据分布变成标准高斯分布,然后再学习一个反向过程把高斯噪声还原成数据分布。
数学形式
前向过程
描述数据被逐步加噪的随机过程,时刻数据
将要发生的变化是一个Itô型随机微分方程:
第一项是随时间变化的确定性漂移(drift),主导长期趋势。比如,因为
前面有个负号,它永远会将
拉回原点。
第二项是随机波动的扩散项(diffusion),模拟不可预测的噪声。这里是标准布朗运动(维纳过程),也就是
。
如果满足一定的性质,就可以构造出
的解
最终变成白噪声。要让
服从正态分布,需要
-
一般让它有收敛的性质;
-
一般设置为随时间变化的缩放;
- Fokker-Planck方程的稳定解是正态分布。
作者构造了这样的一个前向扩散过程:
这个过程是DDPM (Ho et al. 2020)的一个变体,保持了总方差不变,逐渐将拉向
,同时逐步加高斯噪声,噪声量
随时间变化,
是人为预设的。
为什么能得到稳态的终点解?
作者在文章中也给出了证明。我稍作展开补充,如果
解就是
其中
代入
再把项做常用的积分变量替换(你可以把
项理解为非齐次项经过衰减与叠加,趋向于一个稳态
,但乘了一个衰减因子
),立马得到了文中的式(3):
前两项是均值项记成,含e的最后都趋向于0所以
,第三项是
带来的扰动,
这样就完成了正态稳态解的扩散过程的构造。并且稳态的分布只和的分布有关,
也就是
的大小只能决定收敛到稳态的速度。
为什么
的分布是一个正态?
刚才推导了极限情况,现在来推导
有限情况。上一节中
的随机扰动项的积分项
是一个布朗运动的微分,对形如
这样类型的Itô积分,如果
是确定性的(non-random)可积函数,那它积分的结果就是一个正态分布:
运用这个结果就能从文章的式(3),的加噪过程,得到式(5),这个加噪过程的每个时间
对应的标准差矩阵。
要计算这个积分分布的方差的话,就直接按照定义去计算随机扰动项的协方差矩阵:
其中指数上面的矩阵只有对角元素,所以得到的就是逐元素的指数。
由此,的分布
就推导完成了。(这两个量都随时间而变化,详情见式(6)。)
逆向过程
逆向过程的随机微分方程是
简单展开讲讲这个式子是怎么来的。根据Reverse-time diffusion equation models 1982,原始过程
对应的反向过程
中,
不变,
也就是在原来的drift基础上,减掉一个score correction term,补偿前向过程中噪声造成的扩散偏移。
解微分方程有很多成熟的数值方法,例如Euler、Runge-Kutta、DPM-Solver等。不过上式SDE包含了一个随机项,表示reverse-time brownian motion。作者说我可以改为解一个ODE,也就是去掉这个噪声项,模拟一个“平均轨迹”,变成
至少它们的最终生成的样本分布是一样的。
为什么SDE和ODE样本分布是一样的?
对于一个Itô SDE
它对应的密度函数
满足Fokker-Planck方程
代入逆向过程,
,
由于,这项正好和后面的drift correction抵消了,
于是变成
ODE也是这个不带项的式子!
所以在所有时间点上都有
那么已知的话,只要知道扩散的规律,原始梅尔频谱就可以通过以下ODE式子来解:
扩散的规律就掌握在中,不妨用一个神经网络
估计。也就是解以下式子
这里作者让终极分布变成。所以其实
学的是
,建模时需要带上均值参数
。
为什么要采用这样的终点分布呢?
我猜测,相比之下,是DDPM的原始设定,它更通用但可能会因为缺少条件信息而降低生成的控制能力;
有更复杂的建模能力,但是会增加训练和采样的复杂度,不利于实现score matching(score matching就是估计
)。
四、Grad-TTS
简化流程
整个语音生成流程大致是这样的:
- 输入文本,输出文字对应的表征。用一个encoder把token转换成表征
- 输入表征,输出对齐后的语音帧的表征,即初始的梅尔频谱。用了MAS作为训练对齐的指引。
- 利用语音帧的表征,得到条件向量
,在正向和逆向过程中都会用到
- 正向过程:把训练集中的梅尔频谱
一步加噪成
- 逆向过程:从
和
对中学习decoder
-
解ODE,学会如何从噪声中还原出想要的梅尔频谱。
Grad-TTS极简流程图
完整流程
1. encoder
这一步把文本用encoder转换成表征输出。作者希望encoder的输出就已经接近目标,这样从
到
解ODE的去噪过程会更轻松(路径短、误差小)。作者也尝试了不要encoder,直接从白噪声里学
,发现不太行,没法对齐,文本token就学不到和帧的对应关系。
我们知道Grad-TTS的反向采样是从开始的,所以
希望可以尽可能接近
,让
尽量是一个以
为中心的随机点。训练目标就有形如
这样的项。作者选择了对数似然作为参与训练的损失函数:
来聚合真实在
设定下的概率密度。因为是高斯分布,其实也就是在优化
和
的MSE。
这里的代表从encoder里生成的表征,
是声音的帧数,
是对齐的算子(下一节介绍)。
encoder模型照搬了Glow-TTS的Transformer-TTS+FastSpeech框架。
2. 对齐
这一步训练duration predictor来学习MAS找到的映射关系。
在训练时,首先要知道文字表征事实上是如何映射到语音帧数(时长)的,然后再去学习这个过程以方便推理。Glow-TTS用了硬单调对齐搜索(hard Monotonic Alignment Search, hard MAS)来动态搜索映射关系,这里也照搬了。hard MAS是一种常用于非自回归的最短路搜索对齐策略,每一个语音帧要明确地分配给输入的某个或者某些音素(满射性),特征和音素的对齐路径是一致的,不会往回搜(单调性)。“hard”指的是对齐的确定性,输入音素与输出帧的映射关系是明确且离散的,不存在soft那种概率权重或模糊对应。基于单调和满射的特性,MAS很适合于文字和语音之间的转换任务。
通过MAS找到最优硬对齐路径之后,我们就拥有了每个音素
的时长
。作者建立了一个神经网络
来预测这些音素的对数时长,具体优化目标是:
这个神经网络作为duration predictor将会参与到推理中,而MAS只作为训练时的ground truth。
3. 加噪
作者构造了前向过程的SDE使得(不同时刻这个分布的参数不同),于是可以采样每个时刻的
也就是
来得到
(为了写法上的简洁,
和
以来的时间等变量忽略)。
我们的就是要学这些不同
时刻的
的score,也就是它们的log-density:
用一个mse来衡量对所有时刻所有采样的拟合情况,也就是损失函数
不过,随着噪声越来越大,内层期望的scale也会越来越大。diffusion的惯用操作是把内层期望rescale到统一的度量,也就是乘上权重,损失函数变成
作者用均匀分布作为的采样,其他diffusion的研究也有用cos等两头密中间梳的schedule,取决于不同模型的实际表现。
在实际训练中,s的框架采用了U-Net 2015,三层分辨率+输入本身作为通道。
4. 训练流程
至此,所有在推理中需要的参数就训练结束了。总共有三个模块:文本encoder,duration predictor和decoder。通过三个损失函数优化:
。
调整token表征让它更容易对齐,
预测每个token的帧数,
训练去噪score函数。
由于MAS是一个组合优化问题,不能和网络参数联合端到端优化,所以用下列形式
- 固定模型参数,用MAS找到最优对齐A
- 固定A,优化三个loss的和
在训练s时,需要很有耐心地等diff loss到一个很低的水平,因为这里不仅要求全局s误差小,而且要每条时间线上的每个点误差都很小,不然一点点局部误差就会在ODE中被放大。
为什么三个loss不能解耦?
encoder loss依赖于(duration直接决定的)对齐来评估输出,duration需要token embedding作为输入,这二者无法解耦。diff是用的frame-level ,
又依赖于token表征和duration决定的对齐mapping,它和duration predictor得到的frame-level embedding无法解耦。
5. 条件向量
在本章第1节,encoder的训练目标是阶段性输出和最终生成比较像。养兵千日用兵一时,在推理时就到了该用它的时候。对齐后文字token(
)变成了语音表征
(
,这个
就作为
的条件向量,diffusion的加噪终点,去噪过程从
开始解。
是文字的token数量,
是语音帧,二者的对齐靠duration predictor。
是文字的编码长度,
是语音的编码长度,也就是梅尔频谱的频率数,后续实验中取80。
6. 去噪
从encoder和对齐得到的声帧表征的均值向量出发,到最终的梅尔频谱,用文章公式(13)所定义的ODE来执行逆扩散。这个ODE用欧拉方法进行数值求解,其中h是step size步长,越小精度越高,速度越慢。所以h控制了速度和质量的平衡。
小节一下,刚才的6步整理成流程图如下
官方整理的Grad-TTS框架
五、讨论和展望
- 效率:虽然 ODE 推理比 SDE 快,但仍然比非扩散方法慢很多。后续研究如 FastDiff、DiffSinger 有更快的采样路径。
- 端到端一体化:Grad-TTS提出的方法仍依赖 HiFi-GAN 作为 vocoder,它也讨论了实现真正 end-to-end waveform 生成的可行性。但是,实际结果来看,Grad-TTS直接生成的声音波形不忍卒听。
- 多说话人、多情感:在Grad-TTS原始设计中,如果模型训练完成,它无法直接通过用户提供的任意语音来合成该音色的语音,只能用训练阶段已经学习到的speaker embeddings.
- Diffusion: 通用任务上,CSI(Cosine similarity index)是diffusion的优势,所以很适合用于人声的相似性任务,在语音中的优势在于可以生成大量细节,所以在个性化、极值表现很优秀。缺点也是可以生成大量噪声的低频信号来影响loss(确定性模型在低频信号上性能更好,它们能够有准确的平均结果,但是细节的表现不敢保证,对它的调整会很难)。











网友评论