第 24 讲 · 音频理解与合成 · Audio Understanding and Synthesis

Generative AI · Lecture 24。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Matt Gormley),Lecture 24 · Mon 13-Apr · Audio understanding and synthesis(slides:lecture24-audio)。 阅读材料:Radford et al. (2023), Robust Speech Recognition via Large-Scale Weak Supervision(Whisper);Graves et al. (2006), Connectionist Temporal Classification;Zeghidour et al. (2021), SoundStream;Défossez et al. (2022), High Fidelity Neural Audio Compression(EnCodec);Borsos et al. (2023), AudioLM;Huang et al. (2018), Music Transformer;Copet et al. (2023), Simple and Controllable Music Generation(MusicGen);Liu et al. (2023), AudioLDM;Evans et al. (2024), Fast Timing-Conditioned Latent Audio Diffusion(Stable Audio);Das et al. (2024), SpeechVerse。 依据说明:本讲按原课第 24 讲公开的 slides 展开:处理音频数据(PCM、FFT、频谱图、梅尔频谱);语音转写(Whisper、Gemini、Parakeet);语音生成(AudioLM 的音频续写);音乐生成(Music Transformer、音频 token 化、MusicGen、AudioLDM、Stable Audio);把语音和文本模型结合起来(SpeechVerse);以及”下一讲:带音频的视频”(Veo 3)。CTC 的推导(§2.3)是本讲义补充的(slides 只在 Parakeet 那一页提到它)。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture24/(4 个脚本 + 1 个模块;03 第一次运行约 1 分钟,其余几秒到半分钟) 预计阅读时间:2 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说出数字音频的三个参数(采样率、位深、声道),算出码率;解释混叠和 6 dB / 位的规律。
  2. 从 DFT 推出 FFT 的思路;解释短时傅里叶变换、窗口长短的取舍、梅尔刻度和对数梅尔频谱。
  3. 描述 Whisper 的输入、结构和多任务格式;解释 CTC 的空白、塌缩规则和前向算法。
  4. 解释残差向量量化怎样把音频变成多层 token,以及码率怎么算。
  5. 说出音频生成的两条路:在 token 上做语言模型(AudioLM、MusicGen 和它的码本交错)、在隐空间里做扩散(AudioLDM、Stable Audio)。
  6. 说明音频语言模型(SpeechVerse)和视觉语言模型的对应关系。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,不展开 Previewed only
第 2 讲:Transformer;第 5 讲:卷积声码器(从梅尔频谱合成波形)的细节
第 8、12 讲:潜空间扩散、无分类器引导RNN-T、TDT 这类转导器的训练算法
第 9 讲:VQ-VAE;第 13、15 讲:CLIP、VLM 的适配器音频编解码器的对抗训练和感知损失

0.3 本讲地图 Map

§1  处理音频数据:PCM、FFT、频谱图、梅尔频谱                  ← 代码 01、02
§2  音频理解:Whisper、Gemini、Parakeet,以及 CTC              ← 代码 02、03
§3  音频合成:音频 token、AudioLM、Music Transformer、MusicGen   ← 代码 04
§4  扩散做音频:AudioLDM、Stable Audio
§5  音频语言模型:SpeechVerse;带音频的视频
§6–10  小结、误区、练习、延伸阅读、下一讲

所有信号都是代码合成的(正弦波、电话拨号音、简单的”乐器”),不下载任何音频;工具在 audio_lab.py 里,每一个都和 numpy / PyTorch 的标准实现逐位核对过。


1. 处理音频数据 · Working with audio data

1.1 PCM:声音在计算机里是一串数(代码 01)

slides:录音设备每秒采很多次气压(幅度),这叫脉冲编码调制(PCM)。一个原始音频文件有三个参数:

  • 声道数(立体声是 2);
  • 位深(每个幅度用几位表示);
  • 采样率(每秒采几次)。

例如 44.1 kHz、16 位的立体声录音:每秒 44,100 个采样,每个采样是两个 16 位整数——1,411 kbps,一分钟 10 MiB。Whisper 的输入是 16 kHz、单声道:每秒 16,000 个数。一分钟的语音有 96 万个采样,而一分钟的文字稿只有一千个字符左右。 直接在波形上做语言模型,序列长得没法处理——这是本讲所有方法要解决的第一个问题。

位深。 01 第 2 部分把满幅度的正弦波量化成 b 位整数:每多一位,台阶数翻倍、量化误差减半、信噪比提高约 6 dB(实测 8 位 50.1 dB、16 位 98.9 dB,理论 6.02b+1.766.02b + 1.76)。16 位已经超过大多数环境的本底噪声。

采样率与混叠。 采样率为 fsf_s 时,只能无歧义地表示 fs/2f_s/2 以下的频率(奈奎斯特频率)。01 第 3 部分:用 8 kHz 去采一个 5 kHz 的音,FFT 看到的峰在 3 kHz——它和一个真正的 3 kHz 音得到完全一样的采样点,之后再怎么处理也分不开。所以采样之前必须先低通滤波。电话用 8 kHz 采样、只传约 300–3400 Hz,这就是电话里声音发闷的原因。

1.2 傅里叶变换(代码 01 第 4 部分)

slides:如果录的是一个不变的声音,一次 FFT 就能找出组成它的那些正弦波。离散傅里叶变换的定义是

Xk=∑n=0N−1xn e−2πi kn/N,k=0,…,N−1,X_k = \sum_{n=0}^{N-1} x_n\, e^{-2\pi i\, kn/N},\qquad k = 0, \dots, N-1,

写成 N×NN\times N 的矩阵乘向量,O(N2)O(N^2)。快速傅里叶变换(Cooley–Tukey)把它拆成偶数项和奇数项两个长度 N/2N/2 的 DFT:

Xk=Ek+e−2πik/NOk,Xk+N/2=Ek−e−2πik/NOk,X_k = E_k + e^{-2\pi i k/N} O_k,\qquad X_{k+N/2} = E_k - e^{-2\pi i k/N} O_k,

递归 log⁡2N\log_2 N 层,每层 O(N)O(N),一共 O(Nlog⁡N)O(N\log N)。N = 4096 时,定义要 1,677 万次乘法,FFT 约 5 万次。01 的递归 FFT 和 numpy 的结果相差 1e-13;一个 C 大三和弦的 1 秒录音,FFT 幅度最大的三个频点正好是 262、330、392 Hz。

(第 21 讲的 S4 也用过 FFT:长卷积 = 频域里的逐点相乘。)

1.3 频谱图与梅尔频谱(代码 02)

slides:真实的声音随时间变化,所以要对重叠的短窗口做很多次 FFT,得到频谱图(spectrogram),可以当成一张图来看;再把频率经过一个”频率 → 梅尔”的映射,就是梅尔频谱。

短时傅里叶变换(STFT)。 每 hop 个采样取一帧(长 n_fft 个采样),乘上 Hann 窗(让帧的两端平滑地降到 0,减少”频谱泄漏”),做 FFT,只保留 n_fft/2 + 1 个非负频率。Whisper 的设置:16 kHz、n_fft = 400(25 ms)、hop = 160(10 ms),所以每秒 100 帧,每帧 201 个频率;30 秒是 3001 帧(Whisper 取前 3000 帧)。02 第 1 部分自己写的 STFT 和 torch.stft 相差 1.8e-14。

窗口长短的取舍。 02 第 2 部分:1000 Hz 和 1060 Hz 两个音同时响,中间有一下”咔哒”。

窗口相邻频点的间距900–1160 Hz 里看到几个峰“咔哒”在时间上占多宽
8 ms125 Hz0(分不开)4 ms
32 ms31 Hz216 ms
128 ms7.8 Hz264 ms

长窗口分得清相近的频率,但把短暂的事件摊得很宽;短窗口反过来。这是傅里叶分析的不确定性原理:时间和频率的分辨率不能同时任意好。语音用 20–30 ms 的窗口,是在”音素变化的速度”和”谐波之间的间距”之间的折中。

梅尔刻度。 m=2595log⁡10(1+f/700)m = 2595\log_{10}(1 + f/700):低频近似线性、高频近似对数(1000 Hz 是 1000 梅尔,8000 Hz 只有 2840 梅尔)。在梅尔刻度上等间距地放三角形滤波器,低频的滤波器窄、高频的宽——和人耳一样,对低频的音高差更敏感。Whisper 用 80 个滤波器把 201 个频点压缩成 80 个数。02 第 3 部分还发现一个细节:n_fft = 400 时相邻频点相隔 40 Hz,最低的 9 个通道各只覆盖 1 个频点、5 个通道和别的通道落在同一个频点上;通道数加到 128 时出现 4 个全空的通道,256 时 43 个——通道数要和 n_fft 一起选。

对数梅尔频谱。 最后取对数(人耳对响度的感知也近似对数),Whisper 再把动态范围限制在最大值以下 8 个数量级、缩放到大约 [−1, 1]。02 第 4 部分用字符画出了一段电话拨号音的对数梅尔”图”:每个按键是两条亮带(一个低频、一个高频),按键之间是暗的停顿。


2. 音频理解 · Audio understanding

2.1 Whisper

slides:语音转写就是把语音的音频变成文字稿。Whisper 是编码器-解码器的 Transformer:

  • 输入:30 秒一段的对数梅尔频谱(16 kHz、80 个通道、25 ms 的窗、10 ms 的步长);
  • 结构:和 Vaswani et al. (2017) 几乎一样。编码器先过两层一维卷积(核宽 3,步长 1 和 2——所以 3000 帧变成 1500 个位置,每秒 50 个)再加正弦位置编码;解码器用可学习的位置编码;编码器和解码器的块数相同(large 是 32 层);
  • 多任务格式:用特殊 token 指定任务和语言——转写还是翻译成英文、哪种语言、要不要时间戳;时间戳 token 让模型能生成和音频对齐的文字稿;
  • 规模:最大的模型 15 亿参数;训练数据大到只训练 2–3 个 epoch(68 万小时的网络音频,用”弱监督”——网上已有的字幕,而不是专门标注的数据)。

结果(slides 的几张图):

  • 鲁棒性:在 LibriSpeech(朗读的有声书)上训练的模型,在它自己的测试集上能达到甚至超过人类,但换到别的数据集,错误大约是人类的两倍——它们很脆弱;零样本的 Whisper 缩小了和人类鲁棒性的差距。
  • 在 25 段录音上,Whisper 的错误率接近专业的人工转写服务。
  • 高资源语言上表现强,低资源语言上弱:一种语言的错误率和这种语言的训练小时数在对数坐标下近似线性相关。
  • 能把很多种语言的语音翻译成英文。

Gemini 走了另一条路:一个仅解码器的多模态 Transformer,把每段音频转成 16 kHz、每秒 25 个 token,和文字 token 交错着输入;语音转写自然地成了”读音频 token、写文字 token”。Parakeet(NVIDIA)通常比 Whisper 快约 10 倍、识别质量仍然很高:它们都基于 FastConformer(卷积 + Transformer)结构,有几种不同的输出层——TDT(token 和时长转导器)、RNN-T(RNN 转导器)、CTC。

2.2 一个小小的”语音识别”(代码 03)

为了把”特征 → 声学模型 → 解码”这个流程完整地跑一遍,03 用电话拨号音(DTMF,ITU-T Q.23 标准)当”语音”:电话上的每个键是一个低频(697、770、852、941 Hz 之一)和一个高频(1209、1336、1477 Hz 之一)同时响。这是一门只有 12 个”音素”的语言;“转写”就是读出按了哪些键。每段录音 3–8 个键,每个键响 40–120 ms,键之间停 30–120 ms,频率有 ±1.5% 的偏差(标准允许的范围),音量随机,再加白噪声。

2.3 CTC:不知道对齐时怎样训练(补充)

声学模型每 20 ms 输出一个分布,但训练数据只告诉我们”按了 5 2 6”,没告诉每个键从哪一帧开始、到哪一帧结束。CTC(connectionist temporal classification,Graves et al., 2006)的办法:

  1. 每帧输出一个符号或者”空白”(记作 _);
  2. 输出序列按规则塌缩:先合并相邻的重复,再删掉空白。例如 __55__5_3__ → 553,_5555__33_ → 53;
  3. 训练目标:−log⁡p(y∣x)=−log⁡∑π: 塌缩(π)=y ∏tp(πt∣x)-\log p(\mathbf{y}\mid\mathbf{x}) = -\log \sum_{\pi:\ \text{塌缩}(\pi) = \mathbf{y}}\ \prod_t p(\pi_t \mid \mathbf{x})——把所有能塌缩成正确答案的对齐都加起来。

为什么需要空白? 55553 塌缩成 53:连续的同一个符号会被合并。要输出两个 5,中间必须隔一个空白。

前向算法。 对齐的条数随帧数指数增长(03 第 1 部分:6 帧、3 类时,能塌缩成 b a b 的路径就有 84 条),但可以用动态规划在 O(T⋅U)O(T\cdot U) 时间里加起来:在标签之间和两端插入空白 y′=(_,y1,_,y2,…,_)\mathbf{y}' = (\_, y_1, \_, y_2, \dots, \_),令 αt(s)\alpha_t(s) 为”走到第 t 帧、停在 y′\mathbf{y}' 第 s 个位置”的所有路径的概率之和,转移只能是留在原地、前进 1,或者跳过一个空白前进 2(只有当 ys′y'_s 不是空白、且和 ys−2′y'_{s-2} 不同时才允许——相同的标签之间必须有空白)。03 第 1 部分自己写的前向算法、暴力枚举、PyTorch 的 ctc_loss 三者到小数点后 6 位都相同。这和隐马尔可夫模型的前向算法是同一个思路。

训练。 声学模型:两层一维卷积(第二层步长 2,和 Whisper 编码器一样,每帧 20 ms)+ 双向 GRU(128 维)+ 每帧 13 类(12 个键 + 空白)。3200 段录音(信噪比 0–25 dB),10 个 epoch,约 50 秒。CTC 训练一开始常常停在”每一帧都输出空白”这个局部解上(损失约 2.85);这组超参数第 3 个 epoch 就跳了出来,而学习率太大或模型太小时可能 10 个 epoch 都出不来(code README 记录了几组失败的配置)。

和传统方法比。 电话交换机几十年来用 Goertzel 算法识别按键:每一帧只算 8 个标准频率上的能量,挑出低频组和高频组各最强的那个,够突出就认为是那个键,再按规则”去抖动”。我们在另外 80 段录音上网格搜索了它的阈值。

信噪比25 dB151050−5(训练时没见过)−10(没见过)
CTC 模型的错误率0.3%0.0%0.3%0.3%1.9%30.2%57.8%
传统解码器7.7%6.4%8.6%9.5%6.3%11.8%24.5%

(错误率 = 编辑距离 / 参考长度,就是语音识别的词错误率 WER。)在训练覆盖的范围内,学出来的模型远好于手工调参的解码器——固定的阈值和规则对付不了按键长短、音量、频率偏差的各种组合。但在训练时没见过的更吵的录音上,它反而更差,崩得很快;传统解码器靠的是”这两个频率上的能量占比”这条物理规律,噪声变大时慢慢变差。这正是 Whisper 论文强调的问题:模型在训练分布之外不一定稳健;他们的办法是把训练分布变得足够大、足够多样(68 万小时、各种录音条件),让真实世界的大多数情况都落在”训练范围之内”。

模型每一帧输出什么? 03 第 4 部分打印了逐帧的 argmax:·····5555··222222··6666····**··00000···111··(· 是空白)。每个按键对应一串连续的同一个符号,塌缩规则把每一串合并成一个键——没有人告诉模型每个键在哪里,它自己学会了对齐。(大模型的 CTC 输出常常是”尖峰”:每个符号只亮一帧、其余全是空白;两种对齐 CTC 都允许。)


3. 音频合成:在 token 上做语言模型 · Audio synthesis with tokens

3.1 音频编解码器与残差向量量化(代码 04)

slides:“很多模型用一个音频编解码器把音频信号变成离散的音频 token 序列;然后就可以在这些 token 上训练一个深度的语言模型,用来生成语音、音乐、自然声音等等。” 这和第 9 讲的 VQ-VAE、第 13 讲用离散 token 表示图像是同一个思路。

神经音频编解码器(SoundStream、EnCodec)是一个卷积自编码器:编码器把波形压缩成每秒几十帧的向量(SoundStream 在 16 kHz 下每 320 个采样一帧 = 50 帧/秒;EnCodec 24 kHz 版 75 帧/秒),量化成离散的码字,解码器再还原波形(训练时还用了对抗损失和感知损失,让声音听起来自然)。量化用残差向量量化(RVQ):

r0=x,cq=arg⁡min⁡c∈Cq∥rq−1−c∥,rq=rq−1−cq,x^=∑q=1Qcq.r_0 = x,\qquad c_q = \arg\min_{c\in\mathcal C_q}\|r_{q-1} - c\|,\qquad r_q = r_{q-1} - c_q,\qquad \hat x = \sum_{q=1}^{Q} c_q.

第 1 个码本量化原始向量,第 2 个量化”第 1 层没量化掉的残差”,以此类推。每帧变成 Q 个码字编号。码率 = 每秒帧数 × Q × log₂(码本大小):SoundStream 每个码本 1024 个码字(10 比特),12 层时 50 × 12 × 10 = 6 kbps;EnCodec 24 kHz 版用 2–32 层对应 1.5–24 kbps。对比:16 kHz、16 位的 PCM 是 256 kbps。训练时随机只用前几层,于是同一个模型可以在不同码率下工作。

04 第 1 部分对 200 段合成旋律的对数梅尔帧做 RVQ(简化:真实的编解码器在学出来的隐空间上做,这里直接量化梅尔向量,码本用 k 均值拟合,每个 64 个码字):

码本层数码率重建误差 / 方差比少一层好多少
1600 bps0.029334×
21200 bps0.01442.0×
42400 bps0.00711.3×
63600 bps0.00461.2×

第 1 层就抓住了主要的内容(8 个音被分进 64 个码字:同一个音在不同的衰减阶段、不同的音色下落到不同的码字),后面每一层的收益越来越小——前几层是”粗糙的”,后几层是”精细的”。

3.2 AudioLM:分层地续写音频

slides 的 AudioLM:

  • 输入:一段单声道音频(1 秒 = T = 16000 个采样);
  • 两种 token:声学 token 来自 SoundStream(码本 1024);语义 token 来自 w2v-BERT(一个自监督的语音模型,对它的中间表示做 k 均值,K = 1024),长度 T’ = T/640,即每秒 25 个;
  • 仅解码器的 Transformer,分三个阶段,每个阶段以上一阶段的输出为条件、各用一个单独的模型(让每个模型的序列短一些):语义建模(语义 token 的自回归,负责长程结构:说什么、旋律怎么走)→ 粗糙声学建模(RVQ 的前 Q’ 层,以语义 token 为条件)→ 精细声学建模(剩下的层);
  • 反 token 化:SoundStream 解码器把声学 token 变回波形。

slides 的演示:给 3 秒的提示,AudioLM 续写的语音保持了说话人的身份、韵律、口音和录音条件,内容在句法和语义上也通顺——它没有看过任何文字,全部是从音频 token 里学的。

04 第 3 部分做了一个缩小版:在第 1 层 token 上训练一个 2 层的小 GPT(20 秒)。

模型测试集上每个 token 的交叉熵
一元模型(只看频率)5.78 比特
二元模型(只看上一帧)1.50 比特
小 GPT(看前面最多 128 帧)1.28 比特

把续写的 token “读”成音符(每个码字最常对应哪个音),统计一个音持续多久:真实录音平均 10.6 帧(106 ms),小 GPT 的续写 10.3 帧,而按频率随机拼出来的序列只有 1.1 帧——每一两帧就换一个音。语言模型学到了”一个音会持续一段时间、然后跳到另一个音”。(读音符的映射本身不完美,连真实录音读出来也有 30% 的一两帧的碎片;三种序列用的是同一把尺子。)

3.3 Music Transformer

slides 的 Music Transformer(Huang et al., 2018)在符号音乐(MIDI:哪个音、什么时候按下、什么时候松开、多大力度)上做语言模型。音乐高度依赖重复(动机、乐句、ABA 这样的结构),而重复是相对的——同一个动机在不同的时间、不同的音高上出现。所以它用相对位置注意力:注意力分数里加上一个只依赖”两个位置相隔多远”的项。朴素的实现要为每一对位置存一个相对位置向量,内存 O(L2D)O(L^2D);论文提出了一个”歪斜”(skewing)技巧,把它降到 O(LD)O(LD),于是能生成几千步、一分钟长的作品。slides 的对比图:同样续写一段提示,Music Transformer 的样本里能看到重复的动机和结构,基线 Transformer 少得多,LSTM 更少。

3.4 MusicGen 与码本交错(代码 04 第 2 部分)

slides 的 MusicGen(Copet et al., 2023):

  • 音频 token 化:EnCodec(卷积自编码器);
  • 码本交错:多条 token 序列并行地预测;
  • 文本提示:T5、Flan-T5 或 CLAP 编码;旋律提示:一个”信息瓶颈”(只保留音高轮廓),让生成的音乐跟着给定的旋律走;
  • 解码器:最多 33 亿参数的 Transformer 语言模型。

每帧有 K 个码本时,语言模型怎样排列这些 token? 32 kHz 的 EnCodec 每秒 50 帧、每帧 4 个码本:

排列方式30 秒音乐要走几步依赖关系
摊平(flattening)6,000完全的自回归
并行(parallel)1,500同一帧的 4 个码本同时预测,彼此独立
先粗后细(coarse first)3,000先预测全部帧的第 1 层,再并行预测其余各层
延迟(delay)1,503第 k 层错开 k − 1 步,预测它时同一帧的前几层已经生成了

“并行”最快,但它假设同一帧的各层互相独立。04 用量化出来的 token 实测:第 2 层码字的熵是 5.56 比特,知道同一帧的第 1 层以后只剩 4.04 比特——两层之间有 1.52 比特的互信息,“并行”排列用不上这部分信息。“延迟”排列让第 k 层晚 k − 1 步预测,正好能看到同一帧的前几层,步数几乎和并行一样。MusicGen 论文的实验里,延迟排列的效果接近摊平,计算量却少得多。


4. 扩散做音频 · Diffusion for audio

4.1 AudioLDM

slides 的 AudioLDM(Liu et al., 2023)把第 12 讲的潜空间扩散搬到了音频上:

  • 任务:文本到音频(按提示生成);文本 + 音频到音频(风格迁移、续写);音频到音频(补全中间缺的一段);
  • 模型三部分:(A) 一个 VAE 把梅尔频谱编码到隐空间、再解码回来(压缩比 r = 4);(B) 隐空间里的 DDPM,用 DDIM 采样、无分类器引导(第 8、12 讲);(C) 条件来自 CLAP——像 CLIP 一样,用对比学习把音频和文字编码到同一个空间(第 13 讲);
  • 一个巧妙之处:训练时用 CLAP 的音频编码器给自己当条件(不需要成对的文字描述),生成时换成 CLAP 的文字编码器——因为两者在同一个空间里。训练时还用了混合(mixup)两段音频的数据增强。最后用一个声码器把生成的梅尔频谱变成波形。

4.2 Stable Audio

slides 的 Stable Audio:主要成果是可变长度的音频扩散生成。结构和 AudioLDM 类似(VAE + 扩散 U-Net + CLAP 文字编码器),但加了时间条件:训练时音频片段仍然被截断或补齐到固定长度,但模型同时得到”这一段从整首歌的第几秒开始、整首歌一共多少秒”两个数。于是它学会了”自己在一首歌的哪个位置”——生成时给定总时长,就能生成相应长度、有开头和结尾的音乐。


5. 音频语言模型 · Audio language models

5.1 SpeechVerse

slides:SpeechVerse 代表了很多音频语言模型(ALM)共同的结构——

  • 把音频送进一个预训练好的音频编码器,经过一维卷积降采样和一个适配器,变成向量;
  • 文字 token 用 LLM 自己的词嵌入矩阵;
  • 把两部分向量拼起来,送进一个预训练好的 LLM(LLM 也有自己的适配器,例如 LoRA)。

这和第 13、15 讲的视觉语言模型一模一样:把”图像编码器 + 投影 / Q-Former”换成”音频编码器 + 适配器”。slides 的例子:给一段语音,问”识别出音频里的关键词”,模型回答”1. 汽车 2. 保险”。语音转写、翻译、情感识别、关键词提取都变成了”读音频、写文字”。

5.2 下一讲:带音频的视频

slides 的最后一页:Veo 3 是一个视频扩散模型,但同时也扩散音频,生成的视频片段带着同步的声音。这把本讲和下一讲连起来了。


6. 小结 · Summary

  1. 数字音频 = 采样率 × 位深 × 声道;每秒的数据量远大于文字,所以要先压缩成频谱或 token。采样率决定能表示的最高频率(混叠),位深决定量化噪声(6 dB / 位)。
  2. FFT 用分治把 DFT 从 O(N2)O(N^2) 降到 O(Nlog⁡N)O(N\log N);STFT 对重叠的加窗短帧做 FFT;窗口长短在时间和频率分辨率之间取舍;梅尔滤波器组 + 对数得到对数梅尔频谱——Whisper 的输入。
  3. Whisper:编码器-解码器、多任务特殊 token、68 万小时弱监督数据,换来跨数据集的鲁棒性;Gemini 把音频变成每秒 25 个 token 交给仅解码器的模型;Parakeet 用 CTC / 转导器换来速度。
  4. CTC 用”空白 + 塌缩”让模型自己学对齐,前向算法高效地对所有对齐求和。学出来的模型在训练分布内远好于手工规则,分布外可能更差。
  5. RVQ 把每帧变成多层码字(粗 → 细),码率 = 帧率 × 层数 × 比特数;AudioLM 分语义 / 粗糙 / 精细三个阶段生成;MusicGen 的延迟排列用几乎并行的步数保留了层间依赖。
  6. AudioLDM / Stable Audio 在梅尔频谱的隐空间里做扩散,CLAP 提供文字条件;音频语言模型的结构和视觉语言模型一样。

7. 常见误区 · Common pitfalls

  • “采样率越高,模型越容易处理。” 采样率越高,每秒的数越多,序列越长;16 kHz 对语音已经足够(能表示 8 kHz 以下)。
  • “窗口越长,频谱图越好。” 频率分辨率变好,时间分辨率变差(§1.3)。
  • “梅尔通道越多越好。” 通道比 FFT 的频点还密时,会出现空的、重复的通道(§1.3)。
  • “CTC 需要每一帧的标签。” 它只需要整段的文字,对齐是在所有可能里求和(§2.3)。
  • “学出来的模型总比手工规则稳健。” 只在训练覆盖的范围内;超出范围可能崩得更快(§2.3)。
  • “RVQ 的每一层同样重要。” 第 1 层承担了绝大部分信息,后面每层的收益递减(§3.1)。
  • “并行预测一帧的多个码本没有损失。” 同一帧的各层之间有互信息,并行排列用不上(§3.4)。

8. 练习 · Exercises

练习 1(码率)。 (a) 48 kHz、24 位、立体声,一分钟多少 MiB?(b) 一个 32 kHz 的 EnCodec,每秒 50 帧、4 个码本、每个码本 2048 个码字,码率多少?压缩比相对于 32 kHz、16 位单声道 PCM 是多少?

参考答案

(a) 48000 × 24 × 2 = 2,304,000 bps = 288,000 字节/秒,一分钟 17,280,000 字节 ≈ 16.5 MiB。(b) 50 × 4 × 11 = 2200 bps = 2.2 kbps;PCM 是 32000 × 16 = 512 kbps,压缩约 233 倍。

练习 2(混叠)。 采样率 8 kHz 时,一个 6.5 kHz 的音会出现在哪个频率?一个 9 kHz 的呢?

参考答案

采样后频率 f 和 f ± k·f_s 无法区分,再折叠到 [0, f_s/2]。6.5 kHz → 8 − 6.5 = 1.5 kHz;9 kHz → 9 − 8 = 1 kHz。

练习 3(STFT 的形状)。 16 kHz、n_fft = 512、hop = 128、center = True,10 秒的音频,STFT 的形状是多少?每帧覆盖多少毫秒?相邻频点相隔多少赫兹?

参考答案

频率维 512/2 + 1 = 257;帧数 1 + 160000 // 128 = 1251。每帧 512 / 16000 = 32 ms,帧与帧之间 8 ms。相邻频点相隔 16000 / 512 = 31.25 Hz。

练习 4(CTC 的对齐)。 3 帧、类别 {_, a},标签是 “a”。列出所有能塌缩成 “a” 的路径。标签是 “aa” 呢?为什么 2 帧不可能输出 “aa”?

参考答案

“a”:a__、_a_、__a、aa_、_aa、aaa,共 6 条。“aa”:中间必须有空白,只有 a_a 一条。2 帧最多 aa,会被塌缩成 “a”——输出 U 个标签、其中有 r 对相邻重复,至少需要 U + r 帧。

练习 5(RVQ)。 一维的数据,码本 1 = {−2, 2},码本 2 = {−0.5, 0.5}。量化 x = 1.3:第 1 层、第 2 层各选哪个码字?用 1 层、2 层时的重建值和误差各是多少?

参考答案

第 1 层:离 1.3 最近的是 2,残差 1.3 − 2 = −0.7;第 2 层:离 −0.7 最近的是 −0.5,残差 −0.2。1 层重建 2,误差 0.7;2 层重建 2 − 0.5 = 1.5,误差 0.2。

练习 6(码本交错)。 每秒 75 帧、8 个码本,生成 10 秒音频。摊平、并行、延迟三种排列各要多少步?如果每一步的计算量相同,延迟比摊平快多少倍?

参考答案

T = 750。摊平 750 × 8 = 6000 步;并行 750 步;延迟 750 + 7 = 757 步。延迟约快 7.9 倍。

9. 延伸阅读 · Further reading

  • 信号处理:任何一本数字信号处理教材的 DFT / FFT / STFT 章节;Stevens, Volkmann & Newman (1937)(梅尔刻度)。
  • 语音识别:Graves et al. (2006), CTC;Graves (2012), Sequence Transduction with RNNs(RNN-T);Gulati et al. (2020), Conformer;Radford et al. (2023), Whisper;Rekesh et al. (2023), Fast Conformer。
  • 音频 token 与生成:van den Oord et al. (2016), WaveNet;Zeghidour et al. (2021), SoundStream;Défossez et al. (2022), EnCodec;Borsos et al. (2023), AudioLM;Wang et al. (2023), VALL-E;Huang et al. (2018), Music Transformer;Copet et al. (2023), MusicGen。
  • 扩散与音频语言模型:Liu et al. (2023), AudioLDM;Wu et al. (2023), CLAP;Evans et al. (2024), Stable Audio;Das et al. (2024), SpeechVerse;Google DeepMind (2025), Veo 3 技术报告。

10. 下一讲预告 · Next lecture

第 25 讲:视频生成模型。视频是”很多帧图像 + 时间上的连贯”。我们会看 3D U-Net 和视频 ViT 怎样在空间和时间上做注意力(以及为什么要把两者分开)、视频扩散模型怎样同时在图像和视频上训练、潜空间视频扩散、Sora 和 OpenSora,以及把视频生成变成”可交互”的 Neural OS。代码会在移动形状的小视频上训练一个带时间注意力的扩散模型,比较有和没有时间注意力时帧与帧之间的连贯性。

← 返回课程目录