神经音频编解码:EnCodec、SNAC、Mimi、DAC 与语义-声学分离 本节摘要:2026 年的音频生成几乎全是 token。EnCodec、SNAC、Mimi、DAC 把连续波形变成 Transformer 可以预测的离散序列。语言模型在离散 token 上工作,音频是连续的——要做语音/音乐的 LLM 风格模型(MusicGen、Moshi、Sesame CSM、VibeVoice、Orpheus),你首先需要一个神经音频编解码器:学一个编码器把音频离散化成小词表的 token,再配一个解码器重建波形。
本节摘要:2026 年的音频生成几乎全是 token。EnCodec、SNAC、Mimi、DAC 把连续波形变成 Transformer 可以预测的离散序列。语言模型在离散 token 上工作,音频是连续的——要做语音/音乐的 LLM 风格模型(MusicGen、Moshi、Sesame CSM、VibeVoice、Orpheus),你首先需要一个神经音频编解码器:学一个编码器把音频离散化成小词表的 token,再配一个解码器重建波形。两大家族已经浮现:重建优先(EnCodec、DAC,优化感知质量,token 是「声学」的,包含一切);语义优先(Mimi、SpeechTokenizer,强制第一码本编码语言/语音内容,常通过蒸馏 WavLM 实现)。2024-2026 年的核心洞见:纯重建编解码器在从文本生成时会得到模糊的语音——LLM 不得不同时学语言结构和声学结构,无法规模化;把两者分离(语义码本 0、声学码本 1-N)正是 Moshi 与 Sesame CSM 能工作的关键。本节将讲透残差向量量化(RVQ)、四种主流编解码器、帧率对语言建模的影响、语义 vs 声学 token 的因子分解,以及为什么传统 Opus 在每比特感知质量上仍胜出但赢不了「可生成性」。读完本节,你能为生成式任务与压缩任务分别选对编解码器,并理解「丢失码本 0 毁可懂度,丢失码本 7 几乎无感」的非对称性。
阅读完本节,你应当能够:
语言模型在离散 token 上工作,音频是连续的。如果你想要语音/音乐的 LLM 风格模型——MusicGen、Moshi、Sesame CSM、VibeVoice、Orpheus——你首先需要一个神经音频编解码器:学一个编码器把音频离散化成小词表的 token,再配一个解码器重建波形。
两大家族已经浮现:
2024-2026 年的核心洞见:纯重建编解码器在从文本生成时会得到模糊的语音。编解码器 token 上的 LLM 必须在同一个码本里同时学语言结构与声学结构,无法规模化。把它们分离——语义码本 0、声学码本 1-N——正是 Moshi 与 Sesame CSM 能工作的关键。
与其用一个巨大的码本(高质量需要几百万个码),所有现代音频编解码器都用 RVQ:一串级联的小码本。第一码本量化编码器输出;第二码本量化残差;依此类推。每个码本 1024 个码。8 个码本 = 有效词表 1024^8 = 10^24。推理时,解码器把每帧所有选中的码求和来重建。
EnCodec(Meta, 2022):基线。波形上的编码器-解码器,RVQ 瓶颈。24 kHz,可达 32 码本,默认 4 码本 @ 1.5 kbps。架构是 1D 卷积 + transformer + 1D 卷积。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 秒 = N 帧 | 适合 |
|---|---|---|---|
| EnCodec-24k | 75 Hz | 75 | 音乐、通用音频 |
| DAC-44.1k | 86 Hz | 86 | 高保真音乐 |
| SNAC-24k(粗) | ~12 Hz | 12 | AR-LM 高效 |
| Mimi | 12.5 Hz | 12.5 | 流式语音 |
12.5 Hz 下,10 秒话语只有 125 个编解码器帧——Transformer 能轻松预测。
frame_t → [semantic_token_t, acoustic_token_0_t, acoustic_token_1_t, ..., acoustic_token_6_t]
AR LM 先(以文本为条件)预测语义 token,再(以语义 + 说话人参考为条件)预测声学 token。这种因子分解正是现代 TTS 能零样本克隆声音的原因:语义模型管内容,声学模型管音色。
💡 RVQ 的精妙在于它把「高质量需要巨大词表」这个难题,转化成「多个小码本的级联」——每个码本只学一个 1024 类的子问题,但级联起来的有效表达力指数增长。这与子词 tokenization 的哲学异曲同工:用有限的小部件组合出无限的大表达。
| 编解码器 | 码率 | PESQ | ViSQOL |
|---|---|---|---|
| Opus-20kbps | 20 kbps | 4.0 | 4.3 |
| EnCodec-6kbps | 6 kbps | 3.2 | 3.8 |
| DAC-6kbps | 6 kbps | 3.5 | 4.0 |
| SNAC-3kbps | 3 kbps | 3.3 | 3.8 |
| Mimi-4.4kbps | 4.4 kbps | 3.1 | 3.7 |
传统编解码器如 Opus 在每比特感知质量上仍胜出。神经编解码器赢在离散 token(Opus 不产出)与生成模型质量(LM 能用这些 token 做什么)。
from 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 位)。
with torch.no_grad(): wav_recon = model.decode([(codes, scale)]) import torch.nn.functional as F mse = F.mse_loss(wav_recon[:, :, :wav.shape[-1]], wav).item()
from 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——词表比直接到音频小得多。然后一个独立的「声学到波形」解码器以说话人参考为条件。
设计要点:语义-声学分离让生成任务「分而治之」——语义 LM 只关心「该说什么」,词表小、易学;声学解码器只关心「用什么声音说」,可独立训练与替换。这种解耦正是零样本克隆能工作的根源:把任意说话人参考喂给声学解码器,语义内容不变,音色即换。
对一段 10 秒语音,Mimi 12.5 Hz × 8 码本:
N_tokens = 10 * 12.5 * 8 = 1000 个 token
1000 个 token 对 Transformer 是微不足道的上下文。一个 256M 参数的 Transformer 能在现代 GPU 上毫秒级生成 10 秒语音。
问题 → 编解码器映射:
| 任务 | 编解码器 |
|---|---|
| 通用音乐生成 | EnCodec-24k |
| 最高保真重建 | DAC-44.1k |
| 语音上的 AR LM(TTS) | SNAC 或 Mimi |
| 流式全双工语音 | Mimi(12.5 Hz) |
| 带文本的音效库 | EnCodec + T5 条件 |
| 细粒度音频编辑 | DAC + 内补 |
经验法则:搭生成模型,从 Mimi 或 SNAC 起步;搭压缩流水线,用 Opus。
⚠️ 四类坑:① 码本过多——加码本线性提升保真度,但也线性拉长 LM 序列,停在 8~12 个;② 帧率失配——在 12.5 Hz Mimi 上训 LM,然后在 50 Hz EnCodec 上微调,会静默失败;③ 假设各码本等价——Mimi 里码本 0 承载内容,丢了毁可懂度,丢码本 7 几乎察觉不到;④ 只用重建质量评估——一个编解码器可能重建很好但语义结构差,对基于 LM 的生成毫无用处。
本节产出技能文档(原课程 outputs/skill-codec-picker.md),为生成式或压缩任务选择编解码器。决策表:
基础:运行 code/main.py。它实现一个玩具标量 + 残差量化器,测量随码本增加的重建误差。
进阶:装 encodec,在留出语音片段上对比 1、4、8、32 码本,画 PESQ 或 MSE 对码率曲线。
挑战:加载 Mimi。编码一段片段,把码本 0 替换成随机整数后解码;再把码本 7 同样替换。对比两种损坏——码本 0 损坏应毁可懂度,码本 7 损坏应几乎无变化。
下一节,我们聚焦流水线里一个不起眼却决定生死的组件——语音活动检测与轮次切换,从能量 VAD、Silero 神经 VAD 讲到端点检测与对话轮次预测,理解「用户说完了吗」这道判断为何如此难。