diffwave

基础

是语音合成任务使用的模型。

原始音频通常是通过声波表达的。

在语音中有三个最基本的要素,第一个是

  1. pitch(音高或音调):frequency,它是通过波形图的频率来反映的,频率越高,音调越高

我们可以观察钢琴和提琴的震动频率,在同样的时间点中钢琴震动了5次提琴震动了更多。如果我们在时间轴上进行平移我,钢琴的音调不会发生任何的变化

  1. timbre:shape是用波形的形状来表示的。这三个不同的语音波形的形状是不一样的。钢琴的波形随着时间的推移,虽然范围会发生变化,但是形状是几乎不变的。
  2. 响度,loundness:range。这是通过波形的范围来表示的,范围越大响度越大,随着时间的推移,钢琴的范围是在不断的减小的,因此其响度在不断的下降。

图像往往是通过三个维度来表示,对于大部分图像任务,图像的维度都是固定的,网络结构只需要做一种维度

通道x宽x高

而语音通常只有一个维度就是长度。声波的维度是变化的,这是因为声波每秒采用的频率是固定的,但是采样的长度是不固定的。有的时候想生成5秒的语音,有的时候想生成10秒的语音。

对于一个256x256的图像下采样到128x128,其实是可以保留绝大部分信息的。只不过是分辨率稍微低了一点,模糊了一点。但是语音降采样会严重丢失信息。会从非常清晰的语音变成非常老式的电话。

图像对于高频的噪音和小的缺陷并不致命,但是对于语音来说非常致命。比如数秒钟的语音出现了噪音,人耳听起来非常敏感,因此语音做这些任务会困难一些。

一个22.05k时间步每秒的音频,持续九秒就等于(RGB)3x256x256 的图像的维度

生成的维度是不固定的,人很难通过肉眼去理解波形图。

语音需要非常高的质量。

已经有的模型

我们可以将任务分成几类。分类的语句是条件信息富足的程度。

从富足到缺少条件信息分别可以分为

Neural vocoding:声码器

梅尔频谱本身并不能直接还原原始音频,因为会经过一些不可逆操作。因此单靠算法无法精确反演原始波形。声码器本质上是在做,将声学特征(mel)->近似真实的波形(audio waveform)这个映射不是传统的DSP的反向变换,而是学习出来的生成模型。

波形中每个点的精确值(振幅)由频率和相位共同决定。梅尔频谱主要保留了频率和能量信息,但相位信息大量丢失。声码器的核心挑战之一就是如何高质量地估算出与梅尔频谱对应的、听起来自然的相位。拙劣的相位重建会导致语音听起来有杂音、金属感或嗡嗡声。

这是条件信息非常强的任务,使用的是梅尔谱。梅尔谱是通过原始音频的STFFT得到的。包含了原始音频的绝大部分信息,声码器就是将这样的谱转化为音频,他是TTS系统里重要的组成部分。(另外一半就是通过文本生成这样的梅尔谱)

在声码器领域有很多的工作。我们可以粗浅的分类为几个模型

自回归模型

比如wavenet就是一个维度一个维度的生成,这类模型质量非常好,但是生成的速度非常慢。是慢于实时的,生成1秒钟的音频需要5s的时长。实际应用非常困难。

第二类模型是基于flow标准化流的模型。是通过likelihood训练一个可逆的神经网络。这类模型运行速度非常快,远远超过实时。但是缺点就是因为要让网络结构可逆需要的参数量会多很多,才能保证网络结构的容量

VAE和GAN这俩个在图像领域流行的工作,稍微比上俩个模型要差一点点。

Class-conditional和unconditional

  • 无条件生成:模型“自由发挥”,学习训练数据(如各种音乐、语音、环境声音)的整体分布,然后生成一个“典型”的、符合该分布但全新的音频样本。你无法控制它会生成什么具体内容。
  • 有条件生成:模型“按需创作”,生成过程受到一个或多个条件的约束。这个条件就像是一个指令或蓝图,告诉模型你希望生成什么样的音频。你可以控制生成结果的关键属性。

条件上一个离散的类别标签然后进行生成,是条件非常弱的生成模型。

unconditional:完全无监督的生成

wave net也可以实现这个工作。wavenet可以生成听起来像单词的语音,但是质量会差一些。

我们能不能设计一个普适的模型

能够在刚才提到的不同的任务里都能达到非常好的效果。

为了这个目标,提出了一个模型叫做diffusion probabilistic model

这类模型不是自回归的,所以他的生成速度比wavenet要快很多。它的网络结构非常灵活,不像基于流的模型,需要维护一个可逆的网络。因此这类模型能实现更小的模型体积。这个模型只涉及训练单个网络。而GAN和VAE都需要训练俩个网络。训练俩个网络的时候,需要平衡俩个网络的训练进展。

在降噪扩散概率模型方面 目前没有这类的问题。

首先由x0这个数据分布。然后往干净的数据里加噪音(从右向左),经过T步之后。

Diffusion process q:add Gausian noise

这个扩散模型是马尔科夫链,是固定的不科学系的,只有超参数,没有神经网络。

Reverse process $p_\theta$: eliminate Gaussian noise.

如果我们能把每一步加的噪音都准确找出来

参数化的马尔科夫链是一个马尔科夫链,其状态转移概率不是固定不变的,

我们可以从$X_t$中采样处随机噪音然后经过逆过程,就能最终得到很干净的数据。这些参数值发生变化时,整个马尔科夫链的动态行为也会随之改变。

我们通过变分推断来进行训练,目标函数就是ELBO Evidence Lower Bound:变分下届

$$ \mathbb{E}\parallel\epsilon-\epsilon_\theta\left(\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon,t\right)\parallel^2\quad\Leftrightarrow\quad\text{Denoising score matching} $$

这里的$\epsilon$是一个随机噪音。$\epsilon_\theta$是一个神经网络,是用来预测这个随机噪音的。

采样:

$$ x_{t-1}=\mu_\theta(x_t,t)+\sigma_t\epsilon\quad\Leftrightarrow\quad\text{Langevin dynamics} $$

Diffwave

a diffusion probabilistic model for waveform synthesis

  • a versatile model for various audio synthesis tasks
  • a fast sampling algorithm
  • a compact neural architecture

实现很小的模型体积,高质量,以及五倍于实时的生成。

在基于类别和无条件生成中,Diffwave远远强于baseline。

快速采样方法:

标准的采样方法是要把很长的逆过程采样一遍,也就是神经网络要计算T次,这个T可能是200-1000.

那能不能用非常短的逆过程来近似这个很长的逆过程呢?如果我们使用S步,这个S远远小于T。我们只需要在这个短的逆过程生成就可以了。我们可以把这个过程对齐起来。中间的怎么对齐呢?

我们通过每个噪音的噪音水平来对其,这个噪音水平可以通过超参数计算出来,只需要做一个线性的差值来计算。

这并不需要重新训练整个模型。只需要选取非常少的步数,比如6步就能实现高质量的语音的生成。理论上加速了三十多倍。

网络结构

在wavenet基础上进行了改进,使用了双向的dilated convolution

把每个conditioner添加到Convolution layer之后。

声码器重将梅尔谱进行上采样,通过几个conv加进去

对于基于类别标签的生成任务,训练一个embedding向量 128维度,把它加进去。和网络一起训练。

网络在不同的diffusion step t是不一样的

但是我们不可能训练T个神经网络,所以我们要把步数t加到神经网络中去,让网络知道当前在第几步。首先将整数t编码为向量(有一套规则通过sin和cos计算的方式),然后通过几层全连接层加到每一个卷积层。就把diffusion step加到了网络中去。

Last modification:November 28, 2025
如果觉得我的文章对你有用,请随意赞赏