Neural Audio Codec

RVQ:逐层量化“还没解释掉的误差”

Residual Vector Quantization 为什么使用多个码本、每一层究竟输入什么,以及离散 Token 如何仍能端到端训练。

M 层码本每一层只量化上一层尚未解释的残差,最终将选中向量求和。

普通向量量化用一个码本向量近似 encoder 输出;RVQ 则先给出一个粗近似,再让第二个码本量化第一层留下的误差,第三层继续量化新的误差。最终重建向量是所有层向量之和。

这和逐位写一个小数很像:第一位解释最大尺度,后面的位只负责修正。区别是每一“位”不是标量数字,而是从一个可学习的向量码本中选出的向量。

一、逐层残差量化公式

设 encoder 将第 t 个音频帧映射为 z_t ∈ R^d,第 m 层码本为 C^(m)={e_1^(m),...,e_Km^(m)}。初始化残差就是原向量:

z_t = Eθ(x)_t
r_t^(0) = z_t

m 层从自己的码本选择与当前残差最近的向量:

k_t^(m) = arg min_k || r_t^(m-1) - e_k^(m) ||²
q_t^(m) = e_(k_t^(m))^(m)

选中后,从当前残差中减掉这一层已经解释的部分:

r_t^(m) = r_t^(m-1) - q_t^(m)

经过 M 层后,量化结果是所有选中向量之和:

ẑ_t = Σ_(m=1)^M q_t^(m) = z_t - r_t^(M)

如果后续码本有效,残差范数通常逐层减小。不过每层是独立有限码本,不能保证每个样本都严格单调改善;训练目标优化的是总体重建与感知质量。

二、RVQ 在神经音频 Codec 中的位置

残差向量量化架构音频经过 encoder 得到连续向量,三个示意码本逐层量化残差,选中向量求和后通过直通估计器送入 decoder,同时输出离散索引。 波形 x24 kHz Encoderz = E(x) Codebook 1输入 r⁽⁰⁾ = z选择 q⁽¹⁾r⁽¹⁾ = z - q⁽¹⁾ Codebook 2输入 r⁽¹⁾选择 q⁽²⁾r⁽²⁾ = r⁽¹⁾ - q⁽²⁾ Codebook M输入 r⁽ᴹ⁻¹⁾选择 q⁽ᴹ⁾留下 r⁽ᴹ⁾ 求和ẑ = Σq⁽ᵐ⁾ Decoderx̂ = D(ẑ) 离散 Token 流(k⁽¹⁾, k⁽²⁾, …, k⁽ᴹ⁾) 反向传播:最近邻索引不可导,训练时用 straight-through estimator 把 decoder 梯度传回 encoder。码本则用 codebook loss、EMA 或两者之一更新,具体取决于实现。
图中画出三个代表性阶段;实际 SoundStream、EnCodec、Mimi 可使用更多码本,并通过 quantizer dropout 改变启用层数。

三、离散最近邻不可导,为什么还能训练?

argmin 的输出是整数索引,微小改变输入通常不会改变索引,因此不能直接求有效梯度。VQ-VAE 系列方法使用直通估计器:前向传播仍使用量化向量,反向传播则近似把量化器当作恒等映射。

z̃ = z + sg(ẑ - z)

sg 是 stop-gradient。前向数值为 ,对 z 的反向导数近似为 1。常见的逐层量化损失还包含码本项与 commitment 项:

L_RVQ = Σ_t Σ_m [ ||sg(r_t^(m-1)) - q_t^(m)||²
+ β ||r_t^(m-1) - sg(q_t^(m))||² ]

第一项把码本向 encoder 残差拉近,第二项约束 encoder 不要在码本间剧烈漂移。真正的音频 Codec 还会组合波形、频谱、对抗和 feature matching 损失;只优化均方误差往往会得到数值接近但听感发闷的输出。

四、码率由帧率、码本数和码本大小决定

若每秒有 f_r 帧,第 m 个码本有 K_m 个向量,不考虑熵编码时:

R = f_r Σ_m log₂(K_m) bit/s

若所有码本同为 K:R = M · f_r · log₂(K)

例如每秒 12.5 帧、8 个码本、每个码本 2048 个向量:

R = 12.5 × 8 × log₂(2048)
= 12.5 × 8 × 11 = 1100 bit/s = 1.1 kbit/s

如果训练时随机只启用前若干层,部署时就可通过截断码本数切换码率:前几层保证可懂,追加层逐步改善音色和细节。这是 SoundStream 与 EnCodec 里 quantizer dropout 的工程价值。

五、“第一层是语义,后几层是声学”不是 RVQ 的数学保证

第一层面对完整向量,通常解释能量最大的粗结构;后续层处理较小残差。但如果训练目标只有波形重建,第一层可能优先保存任何最有助于重建的信息,包括音色、基频或环境声,并不会自动变成音素 Token。

SpeechTokenizer 将 HuBERT 表示蒸馏到第一层,Mimi 也使用语义蒸馏,才更明确地把首码本推向语言内容。这个设计有利于 Speech LM 用较低序列宽度建模语义,同时让后续码本恢复声学细节;代价是语义与声学仍不可能完全解耦。

设计首层倾向适用目标
纯重建 RVQ最大化总体重建收益压缩与高保真重建
语义蒸馏 RVQ对齐 SSL/文本相关表示Speech LM、语音对话
单码本语义 Tokenizer高度压缩内容信息语言推理;需生成式 decoder 补声学

因此选型时先问清目标:如果需要编辑、生成和推理,Token 的可预测性可能比波形 SNR 更重要;如果只做透明压缩,则不必强迫首层承担语言语义。

评论加载中...