音频学习基础
DAC
传统的 的音频生成模型在压缩音频信号时存在以下问题
音频伪影
高频细节丢失
模型通常针对特定音频类型,缺乏设计通用性
https://github.com/descriptinc/descript-audio-codec
DAC方案
用AI对音频进行高倍率的压缩和解压缩,同时尽可能保证出色的音质。
它可以将44.1kHz的音频压缩到8 kbps的极低比特率。这相当于约90倍的压缩率,意味着文件体积会变得非常小。
VQ-VAE的目标是学习一个离散的潜空间。核心是编码器解码器结构,中间加入了向量量化步骤。
传统VQ-VAE存在码本坍塌问题(部分码本未被使用)导致有效比特率降低
论文中提出讲编码向量投影到低维空间(如8维)进行码本查找,再映射回高维。将欧氏距离转化为余弦相似度,提升训练稳定性。
Diffusion Transformer
Diffusion里面的骨干网络(网络架构),几乎用的都是U-net。也就是用U-Net去预测噪声。
以往大多数论文都是研究如何改进diffusion本身的数学理论,很少关注它的骨干网络。
那么能不能把这个架构换成Transformer呢?
DiT模型基于潜空间扩散模型(latent diffusion LDM)框架,将图像编码为潜表示后,使用Transformer对其进行处理。
音频中的常见操作
STFT
FT也就是傅里叶变换可以将信号从时域转换到频域。告诉我们这个信号是由哪些频率组成的。
短时傅里叶变换。STFT通过对音频分段加窗 并对每段做Fourier Transformer,你会获得时间-频率(time-frequency)分布。
现实中的信号很多都是非平稳的,它们的频率成分会随着时间的变换。比如一首曲子现有钢琴声,后由鼓声,频率分成在变化。
既然整个信号不稳定,就假设信号在一小段时间内是稳定的。选择一个很短的信号,如汉宁窗,只分析窗内的这一段信号
对窗内的这一小段信号进行傅里叶变换,得到这一小段时间内的频率分布。这相当于得到了信号开头时刻的“局部频谱”。
将窗函数向右滑动一小段距离(这个距离称为步长或跳数)。重新对窗内信号进行傅里叶变换,得到下一个时间点的局部频谱图。
最终,你会得到一系列按时间顺序排列的“局部频谱”。将这些频谱并排起来,就能同时看到频率如何随时间变化了。
傅里叶变换和STFT本身是可逆的数学工具,它们不会丢失信息。(不可变通常发生在我们对变换后的数据特别是丢弃相位进行人为的修改后)
Mel-Spectrogram
Spectrogram :从STFT的结果中获取幅度或功率得到可视化举证。
- 普通频谱图 就像用一把均匀的尺子去测量声音,客观但不符合听觉。
- 梅尔频谱图 就像用一把“人耳尺”去测量,这把尺子的刻度在低端很密,在高端很疏,测量结果更符合我们实际听到的感觉。
人耳在低频(<1kHz)更敏感,在高频区的感知分辨率更低。Mel 频率尺度模拟了这种心理声学特性。
- 对音频做 STFT → 得到 magnitude/power spectrum
- 将频率轴通过 Mel filter-bank(Mel 滤波器组)进行加权
- 得到 Mel 频率谱
- 通常再做 log:log-Mel spectrogram
在深度学习中梅尔频谱比普通频谱更常用
- 与人耳特性更接近
- 压缩维度减少模型负担
- 更平滑,更适合 CNN、Transformer 等模型处理
无论是普通频谱(通常指STFT的幅度谱)还是梅尔频谱,它们在生成过程中都主动丢弃了关键信息,这使得完美的逆向还原在数学上变得不可能。
DCT
DCT的核心思想是将一组信号(比如一段声音,一块图像像素)分解成一系列不同频率的余弦函数组合。它特别擅长将能量集中到少数几个系数上,这个特性让它称为视频(如JPEG,MPEG)领域的基石
想象你在一个嘈杂的鸡尾酒会上,能听到各种声音的总和:人们的谈话声、杯碟碰撞声、以及背景音乐声。
你的耳朵听到的:是一个复杂的、混合在一起的时域信号。这就像一张图片在空间域的表示,你看到的是千千万万个不同颜色和亮度的像素点混杂在一起。
DCT所做的工作:就像一个超级敏锐的耳朵,它能把你听到的混合声音分解开来,并告诉你:“这个总的声音里,包含10%的100Hz低音(贝斯声)、5%的1000Hz中音(人声)、1%的10000Hz高音(杯碟碰撞声)……”
在DCT之后,信号被表示成了不同频率成分的强度(系数)。这就是频域表示。
对于自然图像,大部分能量都集中在其中低频的部分
低频分量代表了图像大致的轮廓和缓变的色块。比如一个人脸的模糊轮廓这非常重要,包含了图像中的主要信息
高频分量:代表了图像的细节和边缘。比如人脸这周头发丝和锐利的边界。这部分通常细节丰富,但人眼对其相对不敏感,且能量较弱。
自然界的音频比如音乐,人声有个特点:其主要能量通常集中在少数几个频率上(通常是低频部分),而其他大量的频率 (系数很小或为0)
DCT也是有损的压缩。
MFCC
Mel-frequency cepstral coefficients 梅尔倒谱系数。
计算流程
- STFT
- Mel-Spectrogram
- log压缩
- 对每帧做DCT(离散余弦变换)->得到MFCC系数(用车前13维最常用)
使用DCT将Mel频谱压缩成低维(类似PCA) 去掉相关性,更适合传统机器学习。
但DCT去除了细节,对生成任务不利。
HIFI-GAN
c5d736809766d46260d816d8dbc9eb44-Paper.pdf
GAN有俩部分结构,一个是生成器一个是判别器。

生成器
生成器接受一个梅尔谱,输出是原始波形。把梅尔谱送进网络后,首先送进一个卷积核大小为7x1的卷积层。图中的h是通道数,输出结果送给keaky ReLU。
然后送给一个转置卷积,这个转置卷积将会增强输入数据的长度 同时减小通道数。然后送给一个MRF模块,也就是多感受野融合模块。红色虚线框起来的部分,一共重复执行k次。因此这里的卷积核大小是根据不同的迭代次而决定的。然后输出过keaky RELU,然后卷积将通道数转换为1。然后使用Tanh激活,得到的输出结果就是原始波形。

这张图展示了多感受野融合模块的展开。中间的部分就是一堆残差模块堆叠。这里每一个模块的感受野并不相同。右边是残差模块的进一步细分。右边部分红框有俩个循环。一层外一层内。一个残差模块内部执行一个循环。先leaky Relu之后送给一个卷积层,卷积核大小为k列表的第n个,单个残差模块内部的核大小相同。膨胀值也是一个列表。其实内循环就是一个膨胀卷积加一个普通卷积。不同的模型尺度设置的是不一样的。于是就得到了单个擦差模块的执行结果,然后继续执行其他残差模块,直到外层循环完成,然后得到输出结果。
判别器
多周期判别器(MPD):存在多个不同划分周期的判别器。周期设定为2,3,5,7,11。我们首相将程度T的1D原始音频重塑为高度T/p和宽度p的2D数据,然后对他使用二维卷积。卷积核宽度轴设定为1。

这是一个周期为3的模型判别图,将原始音频做成一个二维矩阵。程度为T/3宽度为3。卷积的时候,按照长度进行卷积,宽度设定为1,作者认为这种方式更能捕捉到音频的周期模式。作者设定了5个周期的判别器,让他们一起判别输入的原始音频
多尺度判别器MSD:三个鉴别器(原始音频、x2平均池化音频、x4平均池化音频)
多周期判别器卷积的时候是跳步卷积的,缺乏对连续时刻的处理,所以论文引入了多尺度判别器。
论文这里就引入了三个判别器。第一个接受原生音频,第二个接受2单位平均池化的音频,第三个接受4单位平均池化的音频。三个判别器分别对他们进行判断。
归一化是深度学习中的一项关键技术,其主要目的是通过调整数据的尺度或分布,提升模型训练的效率和稳定性。
谱归一化和权重归一化是深度学习中俩个重要的参数归一化技术,通过不同的方式约束神经网络权重的范数。
谱归一化:通常使用幂迭代法近似计算最大奇异值,计算成本相对较高。
权重归一化:直接计算权重向量的L2范数,计算效率高。
第一个判别器使用谱归一化;第二第三个判别器使用权重归一化。
到目前位置我们一共有8个判别器,5个周期判别器,3个多尺度判别器。总而言之都是为了提高判别器的判别能力。让GAN提高生成质量。
这是一个周期为p的周期判别器结构,

上面是填充和reshape成周期形状。然后使用卷积核大小为5x1的判别结构。接着进行leakyrelu激活,这俩个步骤一共重复进行四次。之后再卷积再激活在卷积得到判断结果。这就是一个周期判别器的结构。
损失函数
接下来是损失函数第一个损失为对抗损失,本篇论文使用LSGAN的损失:
$$ \begin{aligned} & \mathcal{L}_{Adv}(D;G)=\mathbb{E}_{(x,s)}\left[(D(x)-1)^2+(D(G(s)))^2\right] \\ & \mathcal{L}_{Adv}(G;D)=\mathbb{E}_s\left[(D(G(s))-1)^2\right] \end{aligned} $$
这里的dx是对真实原始波形进行判断。$(D(x)-1)^2$就是当样本为真时,判别器概率越接近1越好。后面的一项是输入样本为假时的,也就是越接近0越好。
生成网络则相反,也就是希望自己伪造的样本,判别网络判断越接近1越好。
其中x表示真实音频,s表示输入条件,即真实音频的梅尔谱图。
除了对抗损失作者还添加了梅尔谱损失。
$$ \mathcal{L}_{Mel}(G)=\mathbb{E}_{(x,s)}\left[||\phi(x)-\phi(G(s))||_1\right] $$
其实就是希望生成网络生成的原始波形,和原始波形的梅尔谱差距越小越好。我们都知道梅尔谱的特性,所以这个损失,就是希望生成网络可以生成高感知质量的音频。这就是梅尔谱重建损失。
这里的$\phi$是将原始波形转化为梅尔谱的函数。这里的x是输入的原始波形。G(s)是还原回的原始波形。
此外,还有一个特征匹配损失
$$ \mathcal{L}_{FM}(G;D)=\mathbb{E}_{(x,s)}\left[\sum_{i=1}^T\frac{1}{N_i}||D^i(x)-D^i(G(s))||_1\right] $$
希望各个层的特征具有相似性(只优化生成网络),是希望真实音频和伪造音频提取的特征也能越相似越好。
这里的T是判别器中的层数,$D^i$和$N_i$分别表示判别器i-th层的特征和特征数量。
$$ \begin{aligned} & \mathcal{L}_{G}=\mathcal{L}_{Adv}(G;D)+\lambda_{fm}\mathcal{L}_{FM}(G;D)+\lambda_{mel}\mathcal{L}_{Mel}(G) \\ & \mathcal{L}_{D}=\mathcal{L}_{Adv}(D;G) \end{aligned} $$
$\lambda_{fm}$和$\lambda_{mel}$分别是2和45。
语音合成
俩阶段,比如使用Tacotron2从文本中生成梅尔谱。把得到的梅尔谱送给生成网络, 得到原始波形实验不语音合成。
首先使用Tacotron2,可以将文字转成梅尔谱,把得到的梅尔谱送给生成网络,从而实现语音合成。
CycleGAN
[1703.10593] Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
论文中给出的模型的常用领域有
把莫奈的化和真实图片相互转换。普通的马和斑马,夏天和冬天的风景照 ,根据线条具象化物体等等
GAN的基本流程为假设有训练数据服从$P_{data}$分布,从训练数据中采样一张图像,送给判别网络D,让其判别真伪。
与此同时从标准正态分布中采样一组数据,然后发给判别器,并把这个数据送给生成网络G,生成网络生成一张图像,假设服从概率分布$P_g$然后将伪造的图像送给判别网络。判别真伪,当模型收敛$P_{data}$和$P_g$分布是相同的,也就是说判别器有百分之50概率判别为真,50%概率判别为假。此时网络生成的图像相当于从$P_{data}$中生成出来的。
要准备俩份训练数据,(不需要一一配对)

左边是意义配对的图像数据,右边则没有配对。传统的图像域转换是需要有配对的关系的,否则无法训练,而cycleGAN不需要。
要构造俩个生成网络跟判别网络,用于俩中风格化图像相互转换;生成网络记为G和F,判别器网络记为$D_x,D_y$。
假设我们有俩分数据记为X(夏天)Y(冬天),并且服从概率分布记为$P_{data}(x),P_{data}$

从训练数据中采样冬天的图像送给判别器,判断真伪。
接着从夏天的图像中采样X送给生成网络G(注意这里不再是噪音了)。生成网络将其转化为服从概率分布$P_g(Y)$的图像,然后送给判别网络判断真伪。
这个是由夏天转换为冬天的,还有从冬天转化为夏天的。
这来个相互转换流程,其实相当于俩个GAN模型,把夏天的图像X,送给生成网络G,得到冬天图像Y,让判别网络$D_Y$判断真伪。同时,也把冬天的图像Y送给生成网络F得到夏天的图像X,送给判别网络$D_X$判别真伪

$$ \mathcal{L}_{GAN}(G,D_{y},X,Y)=\min_{G}\max_{D_{y}}\mathbb{E}_{y\sim P_{data}(Y)}\left[\log D_{y}(y)\right]+\mathbb{E}_{x\sim P_{data}(X)}\left[\log(1-D_{y}(G(x))\right]\quad(5)\\ \mathcal{L}_{GAN}(F,D_{x},Y,X)=\min_{F}\max_{D_{x}}\mathbb{E}_{x\sim P_{data}(X)}\left[\log D_{x}(x)\right]+\mathbb{E}_{y\sim P_{data}(Y)}\left[\log(1-D_{x}(F(y))\right]\quad(6) $$
第一个式子是夏天转冬天,第二个是冬天转夏天。在CycleGAN中仅仅依靠这来个损失函数是不能实现季节的相互转化。
因为GAN模型中当模型收敛,$P_{data}$和$P_{g}$的概率分布相等。但是夏天的图像有很多,为什么要和左边的图像长得像呢?

比如图像变成了右边这样,这也是一种夏天的图像。此时转换后的图像已经不是简单的季节变换了,而是整体都变了。为了解决这个问题,作者提出了第三个损失函数。
循环一致性损(Cycle Consistency Loss)

当我们把x通过生成网络G转化为Y图像的时候,我们希望这张图像可以经过生成网络F可以转化回来。这将限制G在生成Y的时候保留结构信息,否则生成网络F将很难还原回来。右边部分是将Y转换成X然后还原的流程图。因此,我们就得到了下面的循环一致性损失。
把转换为Y的X还原为X的时候,还原的值越接近越好。
$$ \begin{aligned} & \mathcal{L}_{GAN}(G,D_{y},X,Y)=\min_{G}\max_{D_{y}}\mathbb{E}_{y\sim P_{\mathrm{dan}}(Y)}\left[\log D_{y}(y)\right]+\mathbb{E}_{x\sim P_{\mathrm{dan}}(X)}\left[\log(1-D_{y}(G(x)))\right]\quad(5) \\ & \mathcal{L}_{GAN}(F,D_{x},Y,X)=\min_{F}\max_{D_{x}}\mathbb{E}_{x\sim P_{\mathrm{dan}}(X)}\left[\log D_{x}(x)\right]+\mathbb{E}_{y\sim P_{\mathrm{dan}}(Y)}\left[\log(1-D_{x}(F(y)))\right]\quad(6) \\ & \mathcal{L}_{Cycle}(G,F)=\mathbb{E}_{x\sim P_{\mathrm{dan}}(X)}\left[\left[\left|F(G(x))-x\right|\right|_{1}\right]+\mathbb{E}_{y\sim P_{\mathrm{dan}}(Y)}\left[\left|\left|G(F(y))-y\right|\right|_{1}\right]\quad(7) \\ & \text{综合(5)、(6)、(7)可得最终损失函数} \\ & \mathcal{L}(G,F,D_{x},D_{y})=\mathcal{L}_{GAN}(G,D_{y},X,Y)+\mathcal{L}_{GAN}(F,D_{x},Y,X)+\lambda\mathcal{L}_{Gycle}(G,F)\quad(8) \\ & \text{其中}\lambda\text{是一个超参数,用于调节重要度的} \end{aligned} $$
作者还提到了另一个损失函数,但这个损失是非必要的,作者在论文中提到,当模型做绘画转图像的任务时,加入这个鉴别损失能够有效提高转换质量。
$$ \mathcal{L}_{\mathrm{identity}}(G,F)=\mathbb{E}_{y\sim P_{data}(Y)}\left[||G(y)-y||_1\right]+\mathbb{E}_{x\sim P_{data}(X)}\left[||F(x)-x||_1\right]\quad(9) $$
这个损失函数是用来保留图像的颜色信息的,如果没有这个损失函数,生成器G和F可以在不需要的时候自由修改图像的色彩我。比如画像的白天转化为图片后,会变成黄昏。

中间是不加这个损失函数,右侧是添加这个损失函数。