Grad-TTS:Diffusion在语音合成中的端到端实现

2025-06-03  本文已影响0人  顾劝劝

本期介绍华为俄罗斯诺亚方舟实验室团队的2021年的ICMLGrad-TTS: A Diffusion Probabilistic Model for Text-to-Speech

一、从文字到声音:传统语音合成的两步流程

语音合成(text-to-speech,TTS)的核心任务是将文本(和目标音色)转换为自然语音波形。有一族主流方法将这一过程分为两个阶段:

  1. 特征生成(feature generator):文本首先被转换为梅尔频谱(Mel-spectrogram)。梅尔频谱是对原始波形压缩的时频表示,它是一个二维矩阵,横轴(时间)表示音频分段的时间帧(如每帧20ms),纵轴(频率)是非线性的声音频率刻度,也叫Mel刻度,通常强调人耳更敏感的低频分辨率(如包含64或者128个Mel带),矩阵元素值是每个时间点、每个频率的能量,通常为对数功率。之所以是压缩过的,是因为它:

由于梅尔频谱存在信息损失,所以需要接一个声码器模块来补充信息。因为有可能多个waveform对应同一个mel-spectrogram,声码器也适合用一个生成模型去建模、填充。

  1. 声码器(Vocoder):将梅尔频谱还原为波形。常用方法依赖 WaveNet 2016
    等自回归模型,或者HiFi-GAN 2020等生成对抗网络产生最终的语音。

二、Grad-TTS的架构创新

Grad-TTS是一个特征生成算法,输入文字得到梅尔频谱,vocoder需要借用HiFi-GAN等完成(但也讨论了直接端到端生成波形的可行性)。它首次将扩散模型(Diffusion Model)应用于特征生成阶段,此前扩散模型仅用于声码器(如(DiffWave 2020WaveGrad 2020等),这次研究证明扩散模型在特征生成阶段不仅可行,而且可以表现得很优异。

为什么特征生成的扩散模型更难做?我想原因有三:

三、扩散模型

非平衡热力学的启发

想象一个人饱饱地抽了一口烟,猛一下吐出,烟雾会以这位烟民的口作为起点,向外扩散。开始可以看到一团清晰的烟雾,逐渐地在空气中化为无形。如果我们知道完整的动力学规律,掌握气流方向、障碍物、扩散速度,就知道这一刻和上一刻相比,烟雾以何种规律变得更无序,从而知道如何从这一刻回到上一刻。在更极限的情况下,从末态还原初态——从一个已经均匀扩散的介质里反演最初烟雾产生的位置。扩散模型就是这样的思路:

通过一个逐步加噪声的马尔可夫过程,把任意数据分布变成标准高斯分布,然后再学习一个反向过程把高斯噪声还原成数据分布。

数学形式

前向过程

描述数据被逐步加噪的随机过程,t时刻数据X_t将要发生的变化是一个Itô型随机微分方程:
dX_t=b(X_t,t)dt+a(X_t,t)dW_t
第一项是随时间变化的确定性漂移(drift),主导长期趋势。比如b(X_t,t)=-X_t,因为X_t前面有个负号,它永远会将X拉回原点。
第二项是随机波动的扩散项(diffusion),模拟不可预测的噪声。这里W_t是标准布朗运动(维纳过程),也就是dW_t\sim \mathcal{N}(0,dt), W_{t_2}-W_{t_1}\sim \mathcal{N}(0,t_2-t_1)

如果a、b满足一定的性质,就可以构造出t\rightarrow \infty的解X_t最终变成白噪声。要让X_T服从正态分布,需要

作者构造了这样的一个前向扩散过程:
dX_t = \dfrac{1}{2}\Sigma^{-1}(\mu-X_t)\beta_t dt + \sqrt{\beta_t}dW_t
这个过程是DDPM (Ho et al. 2020)的一个变体,保持了总方差不变,逐渐将X_t拉向\mu,同时逐步加高斯噪声,噪声量\sqrt{\beta_t}随时间变化,\beta_t是人为预设的。

为什么能得到稳态的终点解?

作者在文章中也给出了证明。我稍作展开补充,如果
dX_t=A(t)X_tdt+b(t)dt+\sigma(t)dW_t
解就是
X_t=\Phi(t)X_0+\Phi(t)\int_0^t\Phi(s)^{-1}b(s)ds+\Phi(t)\int_0^t\Phi(s)^{-1}\sigma(s)dW_s
其中
\Phi(t)=\exp(\int_0^t A(s)ds)
代入

  • A(t)=-\frac{1}{2}\Sigma^{-1}\beta_t
  • b(t)=\frac{1}{2}\Sigma^{-1}\mu\beta_t
  • \sigma(t)=\sqrt{\beta_t}
    再把\mu项做常用的积分变量替换(你可以把\mu项理解为非齐次项经过衰减与叠加,趋向于一个稳态 \mu,但乘了一个衰减因子\Phi),立马得到了文中的式(3):
    X_t=\underbrace{e^{-\frac{1}{2}\Sigma^{-1}\int_0^t\beta_s ds}X_0+(I-e^{-\frac{1}{2}\Sigma^{-1}\int_0^t\beta_s ds})\mu}_{均值}+\underbrace{\int_0^t\sqrt{\beta_s}e^{-\frac{1}{2}\Sigma^{-1}\int_s^t\beta_u du}dW_s}_{随机扰动项}
    前两项是均值项记成\rho,含e的最后都趋向于0所以\rho\rightarrow \mu,第三项是W_t带来的扰动,Var(\int_0^t \ldots W_s)=\Sigma(I-e^{-\Sigma^{-1} \int_0^t \beta_s ds})\rightarrow\Sigma
    这样就完成了正态稳态解的扩散过程的构造。并且稳态的分布只和W_t的分布有关,\sigma也就是\beta_t的大小只能决定收敛到稳态的速度。
为什么X_t|X_0的分布是一个正态?

刚才推导了t\rightarrow\infty极限情况,现在来推导t有限情况。上一节中X_t的随机扰动项的积分项dW_s是一个布朗运动的微分,对形如\int_0^t f(s) dWs这样类型的Itô积分,如果f(s)是确定性的(non-random)可积函数,那它积分的结果就是一个正态分布:
\int_0^t f(s) dWs\sim \mathcal N(0,\int_0^t f(s)^2 ds)
运用这个结果就能从文章的式(3),X_t的加噪过程,得到式(5),这个加噪过程的每个时间t对应的标准差矩阵。

要计算这个积分分布的方差的话,就直接按照定义去计算随机扰动项的协方差矩阵:
Cov(X_t) =\int_0^t\beta_s e^{-\Sigma^{-1}\int_s^t\beta_u du}dW_s
:=\int_0^{\Psi(t)}e^{-\Sigma^{-1}\tau}d\tau=[-\Sigma e^{-\Sigma^{-1}\tau}]_0^{\Psi(t)}=\Sigma(I-e^{-\Sigma^{-1}\Psi(t)})
=\Sigma(I-\exp(-\Sigma^{-1}\int_0^t\beta_s ds):=\lambda
其中指数上面的矩阵只有对角元素,所以得到的就是逐元素的指数。
由此,Law(X_t|X_0)的分布\mathcal N(\rho,\lambda)就推导完成了。(这两个量都随时间而变化,详情见式(6)。)

逆向过程

逆向过程的随机微分方程是
dX_t=(\frac{1}{2}\Sigma^{-1}(\mu-X_t)-\nabla\log p_t(X_t))\beta_t dt+\sqrt{\beta_t}d\tilde W_t

简单展开讲讲这个式子是怎么来的。根据Reverse-time diffusion equation models 1982,原始过程dX_t=b(X_t,t)dt+\sigma(t)dW_t对应的反向过程dX_t=\tilde b(X_t,t)dt+\tilde \sigma(t)d\tilde W_t中,\tilde\sigma(t)不变,
\tilde b(X_t,t)=b(x,t)-\sigma^2(t)\nabla_x \log p_t(x)
也就是在原来的drift基础上,减掉一个score correction term,补偿前向过程中噪声造成的扩散偏移。

解微分方程有很多成熟的数值方法,例如Euler、Runge-Kutta、DPM-Solver等。不过上式SDE包含了一个随机项d\tilde W_t,表示reverse-time brownian motion。作者说我可以改为解一个ODE,也就是去掉这个噪声项,模拟一个“平均轨迹”,变成
dX_t=(\frac{1}{2}\Sigma^{-1}(\mu-X_t)-\nabla\log p_t(X_t))\beta_t dt
至少它们的最终生成的样本分布p(x,t)是一样的。

为什么SDE和ODE样本分布是一样的?

对于一个Itô SDE
dX_t =b(x,t) dt + \sigma(x,t)dW_t 它对应的密度函数p(x,t)满足Fokker-Planck方程
\frac{\partial p(x,t)}{\partial t}=-\nabla_x \cdot (b(x,t)p(x,t))+\frac{1}{2}\nabla_x^2:[\sigma(x,t) \sigma(x,t)^Tp(x,t)]
代入逆向过程\tilde b(x,t)=b-\sigma^2\nabla\log p\tilde \sigma = \sigma
\frac{\partial p}{\partial t}=-\nabla\cdot [(b-\sigma^2\nabla\log p)p]+\frac{1}{2}\nabla_x^2:(\sigma^2 p)
由于\nabla[(\sigma^2\nabla\log p)p]=\nabla\cdot(\sigma^2\nabla p)=\nabla^2 (\sigma^2 p),这项正好和后面的drift correction抵消了,
于是变成\frac{\partial p}{\partial t}=-\nabla\cdot (bp)
ODE也是这个不带\sigma项的式子!
所以在所有时间点t上都有p_{SDE}(x,t)=p_{ODE}(x,t)

那么已知X_t的话,只要知道扩散的规律,原始梅尔频谱就可以通过以下ODE式子来解:
dX_t=(\frac{1}{2}\Sigma^{-1}(\mu-X_t)-\nabla\log p_t(X_t))\beta_t dt
扩散的规律就掌握在\nabla \log p_t(X_t)中,不妨用一个神经网络s_\theta (X_t,t)估计。也就是解以下式子
dX_t = \frac{1}{2}(\mu-X_t-s_\theta(X_t,\mu,t))\beta_t dt
这里作者让终极分布变成\mathcal N(\mu,I)。所以其实s学的是\nabla_{X_t} \log p(X_t|\mu),建模时需要带上均值参数\mu

为什么要采用这样的终点分布呢?

我猜测,相比之下,\mathcal N(0,I)是DDPM的原始设定,它更通用但可能会因为缺少条件信息而降低生成的控制能力;\mathcal N(\mu,\Sigma)有更复杂的建模能力,但是会增加训练和采样的复杂度,不利于实现score matching(score matching就是估计\nabla \log p_t(X_t))。

四、Grad-TTS

简化流程

整个语音生成流程大致是这样的:

  1. 输入文本,输出文字对应的表征。用一个encoder把token转换成表征
  2. 输入表征,输出对齐后的语音帧的表征,即初始的梅尔频谱。用了MAS作为训练对齐的指引。
  3. 利用语音帧的表征,得到条件向量\mu,在正向和逆向过程中都会用到
  4. 正向过程:把训练集中的梅尔频谱X_0一步加噪成X_t
  5. 逆向过程:从X_0X_t对中学习decoders
  6. 解ODE,学会如何从噪声中还原出想要的梅尔频谱。


    Grad-TTS极简流程图

完整流程

1. encoder

这一步把文本用encoder转换成表征输出。作者希望encoder的输出就已经接近目标y,这样从X_TX_0解ODE的去噪过程会更轻松(路径短、误差小)。作者也尝试了不要encoder,直接从白噪声里学y,发现不太行,没法对齐,文本token就学不到和帧的对应关系。
我们知道Grad-TTS的反向采样是从\mathcal N(\mu,I)开始的,所以\mu希望可以尽可能接近y,让X_T尽量是一个以y为中心的随机点。训练目标就有形如\mathcal L_{enc}=L(\mu,y)这样的项。作者选择了对数似然作为参与训练的损失函数:
\mathcal L_{enc}=-\sum_{j=1}^F \log \psi(y_j;\tilde \mu_{A(j)},I)
来聚合真实y\mathcal N(\tilde \mu,I)设定下的概率密度。因为是高斯分布,其实也就是在优化y\tilde \mu的MSE。

这里的\tilde\mu代表从encoder里生成的表征,F是声音的帧数,A是对齐的算子(下一节介绍)。

encoder模型照搬了Glow-TTSTransformer-TTS+FastSpeech框架。

2. 对齐

这一步训练duration predictor来学习MAS找到的映射关系。
在训练时,首先要知道文字表征事实上是如何映射到语音帧数(时长)的,然后再去学习这个过程以方便推理。Glow-TTS用了硬单调对齐搜索(hard Monotonic Alignment Search, hard MAS)来动态搜索映射关系,这里也照搬了。hard MAS是一种常用于非自回归的最短路搜索对齐策略,每一个语音帧要明确地分配给输入的某个或者某些音素(满射性),特征和音素的对齐路径是一致的,不会往回搜(单调性)。“hard”指的是对齐的确定性,输入音素与输出帧的映射关系是明确且离散的,不存在soft那种概率权重或模糊对应。基于单调和满射的特性,MAS很适合于文字和语音之间的转换任务。

通过MAS找到最优硬对齐路径A^*之后,我们就拥有了每个音素\tilde \mu的时长d_i。作者建立了一个神经网络DP来预测这些音素的对数时长,具体优化目标是:
d_i=\log\sum_{j=1}^F\mathbb{I}_{A^*(j)=i},i=1,\ldots,L,
\mathcal L_{dp}=MSE(DP(sg[\tilde \mu]),d)。
这个神经网络作为duration predictor将会参与到推理中,而MAS只作为训练时的ground truth。

3. 加噪

作者构造了前向过程的SDE使得X_t\sim\mathcal N(\rho,\lambda)(不同时刻这个分布的参数不同),于是可以采样每个时刻的\epsilon\sim\mathcal N(0,\lambda)也就是\sqrt{\lambda}\xi,\xi\sim\mathcal N(0, I)来得到X_t = \rho+\epsilon(为了写法上的简洁,\rho\epsilon以来的时间等变量忽略)。
我们的s就是要学这些不同t时刻的X_t的score,也就是它们的log-density:
\nabla_X \log p(X) =\nabla_X( -\frac{1}{2}(X-\rho)^T\lambda^{-1})(X-\rho)+const
=-\lambda^{-1}(X-\rho)=-\lambda^{-1}\epsilon=-\lambda^{-1/2}\xi
用一个mse来衡量s对所有时刻所有采样的拟合情况,也就是损失函数
\mathcal L_{diff}=\mathbb{E}_{X_0,t}[\mathbb{E}[\| s_\theta (X_t,\mu,t)+\frac{\xi_t}{\sqrt\lambda_t}\|^2_2]]
不过,随着噪声越来越大,内层期望的scale也会越来越大。diffusion的惯用操作是把内层期望rescale到统一的度量,也就是乘上权重1/\mathbb{E}[\| \frac{\xi_t}{\sqrt\lambda_t}\|^2_2=\lambda_t,损失函数变成
\mathcal L_{diff}=\mathbb{E}_{X_0,t}[\lambda_t\mathbb{E}[\| s_\theta (X_t,\mu,t)+\frac{\xi_t}{\sqrt\lambda_t}\|^2_2]]
作者用均匀分布作为t的采样,其他diffusion的研究也有用cos等两头密中间梳的schedule,取决于不同模型的实际表现。

在实际训练中,s的框架采用了U-Net 2015,三层分辨率+输入本身作为通道。

4. 训练流程

至此,所有在推理中需要的参数就训练结束了。总共有三个模块:文本encoder,duration predictor和decoders。通过三个损失函数优化:L_{enc}+L_{dp}+L_{diff}L_{enc}调整token表征让它更容易对齐,L_{dp}预测每个token的帧数,L_{diff}训练去噪score函数。

由于MAS是一个组合优化问题,不能和网络参数联合端到端优化,所以用下列形式

在训练s时,需要很有耐心地等diff loss到一个很低的水平,因为这里不仅要求全局s误差小,而且要每条时间线上的每个点误差都很小,不然一点点局部误差就会在ODE中被放大。

为什么三个loss不能解耦?

encoder loss依赖于(duration直接决定的)对齐来评估输出,duration需要token embedding作为输入,这二者无法解耦。diff是用的frame-level \mu\mu又依赖于token表征和duration决定的对齐mapping,它和duration predictor得到的frame-level embedding无法解耦。

5. 条件向量

本章第1节,encoder的训练目标是阶段性输出和最终生成比较像。养兵千日用兵一时,在推理时就到了该用它的时候。对齐后文字token\tilde \muL\times d)变成了语音表征\muF\times d'),这个\mu就作为X_t的条件向量,diffusion的加噪终点,去噪过程从\mathcal N (\mu, I )开始解。
L是文字的token数量,F是语音帧,二者的对齐靠duration predictor。d是文字的编码长度,d'是语音的编码长度,也就是梅尔频谱的频率数,后续实验中取80。

6. 去噪

从encoder和对齐得到的声帧表征的均值向量\mu出发,到最终的梅尔频谱,用文章公式(13)所定义的ODE来执行逆扩散。这个ODE用欧拉方法进行数值求解,其中h是step size步长,越小精度越高,速度越慢。所以h控制了速度和质量的平衡。

小节一下,刚才的6步整理成流程图如下


官方整理的Grad-TTS框架

五、讨论和展望

上一篇 下一篇

猜你喜欢

热点阅读