上一篇语音 tokenizer 结尾的地图上,右下角有个显眼的名字:MOSS-Audio-Tokenizer——12.5Hz、32 层 RVQ、16 亿参数、纯 Transformer。当时只给了它一句话的定位:「低帧率 + 大模型换质量」。这篇把它单独拎出来讲透。

材料来自 OpenMOSS(MOSI.AI)2026 年 2 月的技术报告《MOSS-Audio-Tokenizer: Scaling Audio Tokenizers for Future Audio Foundation Models》(arXiv:2602.10934),以及官方开源的代码仓库模型权重——论文正文没细说的结构超参,我们直接翻它发布的 config.json 补上。

一句话概括这篇论文的立场:别再给 tokenizer 打补丁了,把它当成大模型来训。 过去的音频 tokenizer 靠「巧」——外挂预训练编码器、请自监督模型当语义老师、精心设计 CNN 结构;MOSS 认为该靠「力」——同构的纯 Transformer 架构、从零开始、端到端联合优化、300 万小时数据,剩下的交给 scaling。

一、三条捷径,和它们共同的天花板

先复述一下问题。上一篇讲过,音频 tokenizer 有个根本矛盾:token 既要保真(听起来像,音色韵律都在),又要有语义(和文本对得齐,语言模型才好学)。要「既能听又能懂」,业界走出了三条捷径:

  1. 语义蒸馏:训练时让第一层码本去对齐 HuBERT/WavLM 这类自监督模型的特征——SpeechTokenizer、Mimi、Qwen3-TTS-Tokenizer 都是这一路;
  2. 预训练模型打底:干脆拿现成的 SSL 或 ASR 编码器当 tokenizer 的编码器,再往上插量化器——XCodec2.0、Higgs-Audio-Tokenizer、DualCodec 是代表;
  3. 音频-文本多任务监督:不请老师,用大规模「音频-转写」配对数据直接教 token 认字——Baichuan Audio Tokenizer、XY-Tokenizer、MiMo-Audio-Tokenizer 走的这条。
捷径一 · 语义蒸馏HuBERT / WavLM外部老师蒸馏codec 第一层码本SpeechTokenizer · MimiQwen3-TTS-Tokenizer老师的上限= 语义的天花板捷径二 · 预训练打底SSL / ASR 编码器别人练好的直接当编码器+ 量化器 / 解码器XCodec2.0 · HiggsDualCodec外部依赖难以联合 scale捷径三 · 音文监督音频-文本对大规模配对数据多任务监督codec + 文本任务XY-TokenizerMiMo-Audio-Tokenizer方向对,但架构混合、训练非端到端CAT 的笨路300 万小时音频+ 文本标注端到端纯 Transformer codec从零训练 · 全部件联合MOSS-Audio-Tokenizer没有外援、没有先验把宝押在 scaling 上外挂与蒸馏带来依赖和天花板——CAT 全拆掉:架构同构、从零开始,模型、数据、量化容量一起 scale
三条捷径与 CAT 的笨路:蒸馏受制于老师的天花板,预训练打底带来外部依赖,音文监督方向对了但架构和训练还没跟上;CAT 把三样全拆掉——纯 Transformer、从零训练、端到端

论文对前两条的批评很直接:外挂和蒸馏都会引入额外依赖与架构约束,让模型、数据、量化容量没法一起 scale——你的语义上限被老师锁死,你的编码器结构被别人的预训练决定。第三条方向对了(MOSS 自己就属于这一派),但论文认为它们还没做绝:架构仍是 CNN 与 Transformer 的混合体,训练也常常分阶段、非端到端。

论文第 1 张表把主流 tokenizer 摆在一起对照,每一家都至少缺一角(摘录自原文 Table 1):

tokenizer帧率架构(编 / 解)流式语义音效 / 音乐免预训练编码器端到端联合
EnCodec75HzCNN / CNN✅ / ✅
SpeechTokenizer50HzCNN / CNN❌ / ❌
Mimi12.5Hz混合 / 混合✅ / ❌
XY-Tokenizer12.5Hz混合 / 混合❌ / ❌
MiMo-Audio-Tokenizer25Hz混合 / 混合✅ / ✅
Qwen3-TTS-Tokenizer12.5Hz混合 / 混合未报告
MOSS-Audio-Tokenizer12.5HzTransformer / Transformer✅ / ✅

规律很清楚:会听的不懂,懂的靠外援,靠外援的没法端到端。 论文由此提出四条设计原则——一个面向「音频基础模型」的 tokenizer 应该:

  1. 统一表示:一套 token 同时覆盖语音、音效、音乐,既存声学细节又带语义结构;
  2. 简单可扩展:架构同构、少特殊组件,参数和数据才能一起往上堆;
  3. 严格因果:每个 token 只看过去不看未来,和自回归生成天然对齐,也保证低延迟;
  4. 低帧率 + 码率鲁棒:帧率低让下游序列短,同一个模型还要在很宽的码率区间都能用。

这四条的出处,论文说得很坦白:从 LLM 的成功里抄作业——简单高效的架构加大规模数据,胜过精巧的先验设计。

二、CAT:一台纯 Transformer 的 codec

答卷叫 CATCausal Audio Tokenizer with Transformer,因果音频 Transformer 分词器)。它最扎眼的特征是 CNN-free:自 SoundStream 以来,神经 codec 的编码器几乎清一色是卷积或卷积混合结构,CAT 把这层「祖传先验」整个拆掉,编码器、解码器全部由因果 Transformer 块堆成,直接吃原始波形、直接吐原始波形,中间连 mel 谱都不过。

问题来了:24kHz 的波形每秒 24000 个采样点,Transformer 的注意力是平方复杂度,直接算不动。CAT 的办法是 patchify——和 ViT 把图像切成 16×16 的 patch 一模一样:把相邻的采样点打包成一个向量,当作一个「词」。而且不是一次打包到位,而是逐级下采样:在 Transformer 块之间插入 patchify 操作,每过一级,序列砍半、通道翻倍。

论文正文只说到这里,具体数字得翻官方 config.json。编码器一共四级:

24kHz 原始波形24000 采样/秒patchify ×240:每 240 个点打包成 1 帧(像 ViT 切 patch)100Hz 序列 · 240 维/帧因果 Trm ×12 · d=768patchify ×2:相邻两帧并一帧50Hz 序列因果 Trm ×12 · d=768patchify ×225Hz 序列因果 Trm ×12 · d=768patchify ×212.5Hz一帧 = 80ms因果 Trm ×32 · d=1280主力大栈,只处理最短的序列RVQ ×32码本 1024/层总下采样 240×2×2×2 = 1920 倍,24000 ÷ 1920 = 12.5Hz——帧率每砍一半,模型加大一号解码器完全镜像:先过 32 层大栈,再逐级 ×2 上采样回 24kHz 波形
CAT 编码器的 patchify 金字塔(数字来自官方 config.json):24kHz 波形先按 240 点打包成 100Hz 序列,随后每过一级 Transformer 就 ×2 下采样,帧率 100→50→25→12.5Hz;序列越短,模型越大,最贵的 32 层 d=1280 大家伙只处理最短的 12.5Hz 序列。解码器完全镜像。
输入帧率该级 Transformer之后的 patchify
024000 采样/秒—(先打包)×240 → 100Hz
1100Hz12 层,d=768×2 → 50Hz
250Hz12 层,d=768×2 → 25Hz
325Hz12 层,d=768×2 → 12.5Hz
412.5Hz32 层,d=1280→ 量化器

总下采样率 240×2×2×2 = 1920,24000 ÷ 1920 = 12.5Hz,一帧正好 80 毫秒。注意算力的排布:帧率每砍一半,模型就加大一号——三级 12 层 d=768 的「小」栈在高帧率段做粗加工,压到 12.5Hz 之后才上 32 层、d=1280 的主力大栈。最贵的注意力花在最短的序列上,这是纯 Transformer 方案能算得动的关键。解码器完全镜像:先过同样的 32 层大栈,再逐级 ×2 上采样回 24000 点波形。全程因果注意力 + RoPE 位置编码,官方实现的注意力上下文为 10 秒,流式编解码的最小分块恰好是一帧(1920 个采样点,80ms)。

编码器出口接的是老朋友 RVQ(残差向量量化),规格拉满:32 层量化器,每层码本 1024 条目(10 比特),量化在 512 维的低维空间进行,查表更是压到 8 维——上一篇讲过的 DAC 因子化技巧,码本利用率高,还能直接用梯度学码本、不需要 EMA。训练时开 quantizer dropout(随机只保留前几层),于是一个模型天然支持可变码率。用上一篇的比特率公式一算就对上了:

比特率 = 帧率 × 码本数 × log₂(码本大小)
       = 12.5 × N × 10 = 125N bps,N ∈ {1, …, 32}
       → 从 0.125kbps(1 层)到 4kbps(32 层),一层 125bps,随用随取

官方仓库里那行「只用前 8 层解码」的示例代码,就是这么来的——model.decode(enc.audio_codes[:8]),1kbps 的重建当场可取。

三、训练:六项损失一锅端

架构说完,重头戏是训练。CAT 的编码器、量化器、解码器、判别器、外加一个语义 LLM,全部部件在一条流水线里联合优化,没有预训练、没有蒸馏、没有分阶段。

重建损失:多尺度 mel L1(窗口 2⁵…2¹¹)原始波形语音·音效·音乐24kHz因果 Transformer编码器patchify 金字塔 →12.5HzRVQ ×32码本 1024/层quantizer dropout因果 Transformer解码器镜像逐级上采样重建波形量化后的音频表示+ [任务标签]decoder-only LLM(0.5B)ASR · 多说话人 ASR · 音频字幕转写 / 字幕交叉熵 = 语义损失原始波形作真样本参照判别器组对抗 + 特征匹配L = λ·语义 + λ·重建 + λ·承诺 + λ·码本 + λ·对抗 + λ·特征匹配编码器 · 量化器 · 解码器 · 判别器 · LLM——全部件一锅端联合训练,无预训练、无蒸馏、无分阶段
CAT 的端到端训练全景:波形过编码器压到 12.5Hz,经 32 层 RVQ 量化后由解码器还原;重建损失(多尺度 mel)与判别器(对抗 + 特征匹配)管『像不像』,挂在量化器输出上的 0.5B decoder-only LLM 用转写/字幕任务管『懂不懂』——六项损失加权求和,所有部件(含判别器和 LLM)联合训练

语义从哪来?不蒸馏,用文本任务逼出来。 这是 CAT 训练配方里最有意思的一味药:在量化器输出上挂一个 0.5B 参数的 decoder-only LLM,把量化后的音频表示当前缀喂给它,让它自回归地预测文本——任务包括 ASR(语音转写)、多说话人 ASR 和音频字幕(audio captioning),每条样本用一个固定的任务标签 T 开头。损失就是标准交叉熵:

L_sem = − Σₜ log p_LLM( sₜ | T, q, s_<t )
        s = 目标文本序列,q = 量化后的音频表示,T = 任务标签

梯度从 LLM 一路穿过量化器流回编码器:token 要是不带语义,LLM 就转写不出来,损失就下不去。语义不是从某个老师那里「蒸」来的,是被文本任务硬「逼」出来的——没有老师,也就没有老师的天花板,语义质量随数据和算力一起涨。

量化器的两条经典损失。 承诺损失把编码器往码本上拉,码本损失把码本往编码器上拉(sg 是 stop-gradient,上一篇讲 VQ 时展开过这对搭档):

L_cmt  = Σ_c ‖ z_c − sg(q_c(z_c)) ‖²      ← 管住编码器,别乱跑
L_code = Σ_c ‖ sg(z_c) − q_c(z_c) ‖²      ← 更新码本,追上编码器

声学保真:多尺度 mel 损失。 重建波形和原始波形各算 7 个尺度的 mel 谱(STFT 窗口从 2⁵ 到 2¹¹,hop 为窗口的 1/4),逐尺度取 L1 距离求和——小窗口抓瞬态、大窗口抓音色,各个时间粒度都不放过:

L_rec = Σ (i=5…11) ‖ Sᵢ(x) − Sᵢ(x̂) ‖₁     Sᵢ = 窗口 2^i 的 mel 谱

对抗训练补最后一口气。 mel 损失管「数值像」,判别器管「听感真」:多个判别器对真假波形打分,配上对抗损失和特征匹配损失,架构与训练目标沿用 XY-Tokenizer 的方案。

最后全部加权求和,一锅端:

L_G = λ_sem·L_sem + λ_rec·L_rec + λ_cmt·L_cmt + λ_code·L_code + λ_adv·L_adv + λ_feat·L_feat

在这套配方上,MOSS-Audio-Tokenizer 用了 16 亿参数(编码器 + 解码器合计)、300 万小时混合语音/音效/音乐数据从零训练。为什么敢把所有东西放一锅里炖、而不是像前人那样分阶段各自为政?这个问题论文用实验回答了,放在第六节——那是全文真正的题眼。

四、重建:一个模型吃遍所有码率

先看作为 codec 的本职成绩。评测按码率分三档(低 750–1500、中 1500–2500、高 2500–6000 bps),语音在 LibriSpeech test-clean(英)和 AISHELL-2(中)上测 SIM(说话人相似度)、STOI(可懂度)、PESQ(感知质量),音效和音乐分别在 AudioSet 和 MUSDB 上测谱距离。摘录关键几行(完整表见原文 Table 2):

模型码率帧率码本数SIM ↑(英/中)PESQ-WB ↑(英/中)
XCodec2.080050Hz10.82 / 0.742.43 / 1.96
XY-Tokenizer100012.5Hz80.85 / 0.792.50 / 2.12
Mimi110012.5Hz80.74 / 0.592.25 / 1.78
MOSS(8 层)100012.5Hz80.88 / 0.812.87 / 2.43
Qwen3-TTS-Tokenizer220012.5Hz160.95 / 0.883.19 / 2.62
MiMo-Audio-Tokenizer225025Hz120.89 / 0.833.05 / 2.71
MOSS(16 层)200012.5Hz160.95 / 0.893.41 / 2.96
Mimi440012.5Hz320.94 / 0.833.43 / 2.78
DAC600075Hz80.89 / 0.843.41 / 3.20
MOSS(32 层)400012.5Hz320.97 / 0.933.69 / 3.30

注意读法:表里所有 MOSS 行是同一个模型,只是解码时用的 RVQ 层数不同;对手们则各是各的模型。同架构的 Mimi 全开 32 层(4.4kbps)的成绩,MOSS 用 16 层(2kbps)就全面超过;论文首页那张「SIM–码率」曲线图上,MOSS 的曲线在整个 0–4kbps 区间压着所有开源 codec 走。语音之外也得说句公道话:音效/音乐上 MOSS 是「有竞争力」而非全面第一——比如 DAC 在 6kbps 下的 Mel 距离(0.65)仍略优于 MOSS 4kbps(0.68),MiMo 在中档也有强项;论文自己的口径也是语音 SOTA、通用音频 competitive。

五、CAT-TTS:第一个打赢非自回归的纯自回归 TTS

tokenizer 好不好,最终要看下游。论文用 CAT 的 token 训了一个纯自回归 TTS,顺手拿下一个「第一次」:纯离散自回归系统首次超过此前的非自回归(NAR)与级联方案

主干是上一篇讲过的「主干 + 深度小模型」方案(Moshi 同款):Temporal Transformer 沿时间轴走,从 Qwen3-1.7B 初始化;Depth Transformer 只有 4 层、随机初始化,在每个时间步内部沿「深度」方向把 32 层 RVQ token 逐层补全。每个 token 只依赖之前的时间步和本时间步更浅的层,严格因果。训练数据约 20 万小时(开源的 VoxBox 加内部数据),在 Seed-TTS-Eval 上评测。

真正的新东西是训练策略 Progressive Sequence Dropout(渐进序列丢弃):tokenizer 侧的 quantizer dropout 让解码器适应了「层数不满」的输入,但生成模型如果训练时永远看全 32 层、推理时却只给它生成 8 层的预算,训练和推理就对不上了。解法是让 TTS 在训练时也「见过世面」:

z ~ Bernoulli(p)                  # 这条样本要不要截断
K ~ Uniform{1, …, 31}             # 截到第几层
K̂ = (1−z)·32 + z·K                # 实际保留的层数(不触发就全保留)
ẽₜ = Σ (k=1…K̂) Emb_k(q_{t,k})     # 输入 embedding 只叠加前 K̂ 层
L  = − Σₜ Σ (k=1…K̂) log p( q_{t,k} | 文本, q_{<t}, q_{t,<k} )   # loss 同样只算前 K̂ 层
训练:随机截断(概率 p)RVQ 层(深度)时间步 → Temporal Transformer 沿此走保留前 K 层(K=3)K+1…32 层整段丢弃K ~ Uniform{1,…,31};输入叠加与 loss 都只算前 K 层不改一行架构、不加一个参数推理:自选深度 K_inferK_infer = 8→ 1kbps · 低成本快合成K_infer = 32→ 4kbps · 高保真全席CAT解码器层数不满照样还原同一个模型,码率随用随选论文默认 p=1.0:每条样本都截断,还省显存训练时见过所有深度,推理时才能在任意码率下都稳——p=0 的模型一降码率就崩
Progressive Sequence Dropout:训练时以概率 p 把每条样本的 RVQ 层随机截断到前 K 层,深层整段丢弃,输入叠加与损失都只算保留的前缀;推理时自选生成深度 K_infer——同一个模型,8 层就是 1kbps 快餐,32 层就是 4kbps 全席

不改一行架构、不加一个参数,只动训练时的数据形态。推理时想要什么码率,就让 Depth Transformer 只生成 K_infer 层,再交给 CAT 解码器还原——解码器早就被 quantizer dropout 练出了「层数不满照样还原」的本事,两边严丝合缝。消融实验很干脆:不开 dropout(p=0)的模型在低码率下相似度和错词率一起崩;开了之后(p=0.25/0.5/1.0)各档码率全稳,而且 p 取多少影响不大——于是干脆取 p=1.0,每条样本都截断,还能省不少训练显存。

Seed-TTS-Eval 上的成绩(摘录自原文 Table 3,WER/CER 为错词/错字率、越低越好,SIM 为说话人相似度、越高越好):

系统范式码率可控英 WER ↓英 SIM ↑中 CER ↓中 SIM ↑
CosyVoice3-1.5B级联2.2272.01.1278.1
GLM-TTS级联1.9168.10.8976.4
F5-TTSNAR2.0067.01.5376.0
VoxCPM连续 AR1.8572.90.9377.2
SparkTTS离散 AR1.9858.41.2067.2
HiggsAudio-v2离散 AR2.4467.71.5074.0
CAT-TTS离散 AR1.8973.11.2378.5

读这张表要分两条线:错词率这条线上,头部系统全都压在 2% 以下,CAT-TTS(1.89/1.23)在第一梯队但不是唯一——GLM-TTS 的中文 CER(0.89)就更低;真正拉开差距的是说话人相似度:中英双语 SIM 都是开源对比里最高,把此前离散 AR 阵营的老大难(SparkTTS 只有 58.4)直接抬到了超过级联和 NAR 的水平。这正是论文想证明的事:过去纯自回归 TTS 音色不像,怪的不是自回归,是 token 不行。 另外它也是表里唯一能在推理时指定合成码率的系统。

理解侧也顺手测了一笔:CAT 的 token 直接喂给 LLM 做 ASR,不用另配音频编码器,成绩与「专用编码器 + LLM」的方案持平或更好(细节在论文附录)。

六、三组 scaling 实验:论文真正想说的话

如果只看前五节,MOSS-Audio-Tokenizer 是「又一个更强的 codec」。第六节这三组实验才是论文的题眼——它想证明的不是某个技巧,而是一个命题:tokenizer 也服从 scaling law,但前提是你得把它做成能 scale 的样子。

实验一:端到端是 scaling 的入场券。 前人常用的「部分优化」协议——冻结编码器和量化器,只训解码器和判别器——和 CAT 的全端到端对照。结果:部分优化早早进入平台期,端到端则在所有指标上持续爬升、不见饱和。冻住的部件会锁死表示的上限,这正是「预训练打底」那条捷径 scale 不动的实验注脚。

实验二:参数和码率必须一起拧。 把模型从 319M 一路加到 1169M(隐层 256→768,量化器固定 32 层):参数越大整体越好,但有个反直觉的细节——低码率下,大模型可能打不过跑在高码率上的小模型。码率给的比特不够时,参数再多也没处使;反过来小模型在高码率下也吃不满预算。

码率(kbps)重建质量(示意)0.5124低码率:曲线贴在一起比特不够,参数再多也没处使高码率:参数拉开差距小模型吃不满预算,早早饱和大模型(1169M)小模型(319M)参数规模与量化深度是共生的——谁短谁是瓶颈,得一起拧
参数 × 码率协同 scaling(示意,定性复现原文 Figure 5 的结论):高码率区大模型持续拉开差距,低码率区两者贴在一起——瓶颈在码率不在参数。参数规模与量化深度是共生的,得一起加

论文的结论是一句值得记住的话:参数规模与量化深度从根本上是共生的(fundamentally co-dependent),单独 scale 任何一个都会撞上另一个的瓶颈。

实验三:算力直接换保真度。 固定训练步数,把全局 batch size 从基准的 1 倍加到 256 倍(2⁰→2⁸):任何一个训练时刻,batch 更大的曲线都严格更高,而且到 25 万步仍在上扬、没有饱和迹象。数据吞吐加多少,重建质量就涨多少——可预测,这正是当年 LLM scaling law 给人的那种底气。

三组实验合起来,就是标题里那句「Scaling Audio Tokenizers」的完整论证:端到端让 scale 成为可能(实验一),参数与量化容量要协同着 scale(实验二),scale 的回报稳定可预测(实验三)。

七、放回地图

回到上一篇那张地图,现在可以把 MOSS-Audio-Tokenizer 的完整答卷填上了。面对语音 tokenizer 的三大老问题,它的回答分别是:

  • 语义 vs 声学? 不选边、不请老师——挂一个 LLM 用转写任务把语义「逼」进 token,声学交给多尺度 mel 和判别器,端到端一起炼;
  • 多码本 vs 自回归 LM? 帧率压到 12.5Hz 把序列缩到文字级,32 层码本的「账」用 Depth Transformer 还,再用 Progressive Sequence Dropout 让一个生成模型通吃所有码率;
  • 架构怎么选? 把神经 codec 祖传的 CNN 先验整个拆掉,换成可以无脑加大的因果 Transformer 金字塔——大算力压在低帧率的短序列上。

三个收束:

  1. 这篇论文的主角不是某个模型,是一条路线。 它论证的是 tokenizer 应该从「精巧的手工艺」变成「可 scale 的基础设施」:同构架构、端到端、数据算力堆上去,质量可预测地涨——tokenizer 界迟到的 GPT 时刻。
  2. 端到端不是洁癖,是前提。 部分优化早饱和、参数与码率互为瓶颈这两个实验说明:外挂预训练组件、分阶段训练这些「捷径」,恰恰是过去 tokenizer scale 不动的原因。
  3. token 好了,下游会自己证明。 纯自回归 TTS 的音色短板一直被归咎于「自回归不行」,CAT-TTS 用双语最高的说话人相似度给出了另一个答案:不是范式不行,是 token 不行。OpenMOSS 后续的 MOSS-TTS 全家桶、48kHz 立体声的 v2、20M 参数的 Nano,都建在这套 token 上。

Qwen3-TTS 的「给不同场景各配一把刀」,到这篇的「一把刀磨到能砍一切」,两条路线正面相遇——语音 token 这台造币厂接下来怎么造,值得接着看。

参考