神经音频编解码器 —— EnCodec、SNAC、Mimi、DAC 与语义-声学拆分

Learn~60 minutesPython先修要求: Phase 6 · 02 (Spectrograms), Phase 10 · 11 (Quantization), Phase 5 · 19 (Subword Tokenization)
2026 年的音频生成几乎全是 token。EnCodec、SNAC、Mimi 和 DAC 把连续波形变成 Transformer 可以预测的离散序列。语义 token 与声学 token 的拆分——第一个码本作语义、其余作声学——是自 Transformer 以来音频领域最重要的架构转变。

问题

语言模型处理的是离散 token。音频是连续的。如果你想为语音或音乐构建 LLM 风格的模型——MusicGen、Moshi、Sesame CSM、VibeVoice、Orpheus——你首先需要一个神经音频编解码器(neural audio codec):一个把音频离散化成小词表 token 的学习型编码器,以及一个与之匹配、能重建波形的解码器。

已经出现了两个家族:

  1. 重建优先的编解码器——EnCodec、DAC。优化感知音频质量。token 是「声学」的——它们捕获一切,包括说话人身份、音色、背景噪声。
  2. 语义优先的编解码器——Mimi(Kyutai)、SpeechTokenizer。强制第一个码本编码语言/音素内容(通常通过从 WavLM 蒸馏)。后续码本是声学细节。

2024-2026 年的洞见是:纯重建编解码器在你尝试从文本生成时会得到模糊的语音。 在编解码器 token 上训练的 LLM 不得不在同一个码本里同时学习语言结构和声学结构,这无法扩展。把二者分开——语义码本 0、声学码本 1-N——正是 Moshi 和 Sesame CSM 能工作的原因。

概念

四种编解码器全景:EnCodec、DAC、SNAC(多尺度)、Mimi(语义+声学)

核心技巧:残差向量量化(RVQ)

现代音频编解码器都使用 RVQ,而不是一个巨大的码本(那需要数百万个码才能达到好的质量):一串小码本的级联。第一个码本量化编码器输出;第二个量化残差;依此类推。每个码本有 1024 个码。8 个码本 = 有效词表 1024^8 = 10^{24}。

推理时,解码器把每帧所有选中的码相加来重建。

2026 年重要的四个编解码器

EnCodec(Meta,2022)。 基线。波形上的编码器-解码器,RVQ 瓶颈。24 kHz,最多 32 个码本,默认 4 码本 @ 1.5 kbps。使用 1D conv + transformer + 1D conv 架构。被 MusicGen 使用。

DAC(Descript,2023)。 RVQ 配 L2 归一化码本、周期激活函数、改进的损失。在所有开源编解码器中重建保真度最高——12 码本时有时与原始语音无法区分。44.1 kHz 全频带。

SNAC(Hubert Siuzdak,2024)。 多尺度 RVQ——粗码本比细码本以更低的帧率运行。有效地分层建模音频:约 12 Hz 的粗「草图」加上 50 Hz 的细节。被 Orpheus-3B 使用,因为这种分层结构很好地映射到基于 LM 的生成。

Mimi(Kyutai,2024)。 2026 年的游戏规则改变者。12.5 Hz 帧率(极低),8 码本 @ 4.4 kbps。码本 0 从 WavLM 蒸馏——训练来预测 WavLM 的语音内容特征。码本 1-7 是声学残差。这一拆分支撑了 Moshi(第 15 课)和 Sesame CSM。

帧率对语言建模很重要

帧率越低 = 序列越短 = LM 越快。

编解码器帧率1 s = N 帧适合
EnCodec-24k75 Hz75音乐、通用音频
DAC-44.1k86 Hz86高保真音乐
SNAC-24k(粗)~12 Hz12AR-LM 高效
Mimi12.5 Hz12.5流式语音

在 12.5 Hz 下,一段 10 秒的话语只有 125 个编解码器帧——Transformer 可以轻松预测它们。

语义 token 与声学 token

frame_t → [semantic_token_t, acoustic_token_0_t, acoustic_token_1_t, ..., acoustic_token_6_t]
  • 语义 token(Mimi 中的码本 0)。 编码说了什么——音素、词、内容。通过辅助预测损失从 WavLM 蒸馏。
  • 声学 token(码本 1-7)。 编码音色、说话人身份、韵律、背景噪声、细节。

AR LM 先预测语义 token(以文本为条件),再预测声学 token(以语义 + 说话人参考为条件)。这种因式分解正是现代 TTS 能零样本克隆声音的原因:语义模型处理内容,声学模型处理音色。

2026 年的重建质量(每秒比特数,比特率越低越好)

编解码器比特率PESQViSQOL
Opus-20kbps20 kbps4.04.3
EnCodec-6kbps6 kbps3.23.8
DAC-6kbps6 kbps3.54.0
SNAC-3kbps3 kbps3.33.8
Mimi-4.4kbps4.4 kbps3.13.7

像 Opus 这样的传统编解码器在每比特的感知质量上仍然胜出。神经编解码器赢在离散 token(Opus 不产生这些)和生成模型质量(LM 能用这些 token 做什么)上。

rvq-codec-cascade静态版本未包含此交互图

构建它

第 1 步:用 EnCodec 编码

pythonfrom encodec import EncodecModel
import torch

model = EncodecModel.encodec_model_24khz()
model.set_target_bandwidth(6.0)  # kbps

wav = torch.randn(1, 1, 24000)
with torch.no_grad():
    encoded = model.encode(wav)
codes, scale = encoded[0]
# codes: (1, n_codebooks, n_frames), dtype=int64

6 kbps 时 n_codebooks=8。每个码是 0-1023(10 比特)。

第 2 步:解码并测量重建

pythonwith torch.no_grad():
    wav_recon = model.decode([(codes, scale)])

from torchaudio.functional import compute_deltas
import torch.nn.functional as F

mse = F.mse_loss(wav_recon[:, :, :wav.shape[-1]], wav).item()

第 3 步:语义-声学拆分(Mimi 风格)

pythonfrom moshi.models import loaders
mimi = loaders.get_mimi()

with torch.no_grad():
    codes = mimi.encode(wav)  # shape (1, 8, frames@12.5Hz)

semantic = codes[:, 0]
acoustic = codes[:, 1:]

语义码本 0 与 WavLM 对齐。你可以训练一个文本到语义的 Transformer——词表比直接到音频小得多。然后一个单独的声学到波形解码器以说话人参考为条件。

第 4 步:为什么基于编解码器 token 的 AR LM 有效

对于 Mimi 的 12.5 Hz × 8 码本下 10 秒的语音片段:

N_{\text{tokens}} = 10 \times 12.5 \times 8 = 1000 \text{ tokens}

1000 个 token 对 Transformer 来说是一个很普通的上下文。一个 2.56 亿参数的 Transformer 可以在现代 GPU 上几毫秒内生成 10 秒语音。

使用它

把问题映射到编解码器:

任务编解码器
通用音乐生成EnCodec-24k
最高保真重建DAC-44.1k
基于语音的 AR LM(TTS)SNAC 或 Mimi
流式全双工语音Mimi(12.5 Hz)
带文本的音效库EnCodec + T5 条件
细粒度音频编辑DAC + 修补(inpainting)

经验法则:如果你在构建生成模型,从 Mimi 或 SNAC 开始。如果你在构建压缩管线,用 Opus。

陷阱

  • 码本太多。 增加码本会线性提高保真度,但也会线性增加 LM 序列长度。停在 8-12 个。
  • 帧率不匹配。 在 12.5 Hz 的 Mimi 上训练 LM,再在 50 Hz 的 EnCodec 上微调,会静默失败。
  • 假设所有码本等价。 在 Mimi 中,码本 0 承载内容;丢失它会摧毁可懂度。丢失码本 7 几乎察觉不到。
  • 把重建质量当作唯一指标。 一个编解码器可以有很好的重建,但如果语义结构很差,对基于 LM 的生成就毫无用处。

交付它

保存为 outputs/skill-codec-picker.md。为给定的生成或压缩任务挑选一个编解码器。

练习

  1. 简单。 运行 code/main.py。它实现一个玩具标量 + 残差量化器,并测量增加码本时的重建误差。
  2. 中等。 安装 encodec,在一个留出的语音片段上比较 1、4、8、32 个码本。绘制 PESQ 或 MSE 与比特率的关系。
  3. 困难。 加载 Mimi。编码一个片段。把码本 0 替换为随机整数;解码。然后同样替换码本 7。比较两种损坏——码本 0 损坏应该摧毁可懂度;码本 7 损坏应该几乎不改变任何东西。

关键术语

术语人们怎么说实际含义
RVQ残差量化一串小码本的级联;每个量化前一步的残差。
Frame rate编解码器速度每秒多少 token 帧。越低 = LM 越快。
Semantic codebook码本 0(Mimi)从 SSL 特征蒸馏的码本;编码内容。
Acoustic codebooks其余所有音色、韵律、噪声、细节。
PESQ / ViSQOL感知质量与 MOS 相关的客观指标。
EnCodecMeta 编解码器RVQ 基线;被 MusicGen 使用。
MimiKyutai 编解码器12.5 Hz 帧率;语义-声学拆分;支撑 Moshi。

进一步阅读

示意图共 1 张

codec-comparison diagram
codec-comparison

“Stay hungry, stay foolish.”

— Steve Jobs

esc
↑↓切换↵打开esc关闭