arXiv'26 | StepAudio 3 Gen 把通用音频生成压成纯离散 token 预测,TTS 人味评测赢遍商业模型
arXiv’26 | StepAudio 3 Gen 把通用音频生成压成纯离散 token 预测,TTS 人味评测赢遍商业模型
原文:StepAudio 3 Gen Technical Report(arXiv 2609.12945,StepFun-Audio Team) 试听 demo:stepaudiollm.github.io/step-audio-3-gen
1. 前言:一段”三种声音混在一起”的音频,暴露了整条流水线的裂缝
设想一个很常见的需求:给 60 秒的短视频配一条音频,里面有两个人对话、有开门和脚步声、背景还要压一段不抢戏的钢琴。
今天你要做这件事,基本得拼三条流水线:对话走 TTS(text-to-speech,文字转语音),音效走 text-to-audio 模型,背景音乐走 text-to-music 模型。三条流水线各有各的输入表征(一条吃文本 + 说话人参考,一条吃 caption,一条吃风格描述)、各有各的生成方式(有的跑 diffusion,有的跑 flow matching)、各有各的时间控制接口(谁负责把这三个音轨对齐到时间轴上?最后往往是人手在 Audition 里拖)。
问题不在于”哪个模型不够好”。单看每一块,今天的专用模型都很能打。问题在于它们之间没有共同语言——所以你也拼不出一个”同一个模型、一句话进去、三种声音混着出来、时间关系都对”的东西。
这正是 StepAudio 3 Gen 想去的地方。它给出的答案很激进:
把通用音频全部表示成同一套离散 token,然后交给一个 LLM 自回归地预测——不做 diffusion,不做 flow matching,连 acoustic renderer 都不要。
这里的”通用音频”包括语音、歌声、音乐、音效,也包括它们混在一起的复杂场景;论文里还专门列了一类 vibe speech,指带环境氛围和背景声的语音——不是一条干巴巴的朗读,而是”咖啡馆里边喝东西边聊天气”那种有空间感的东西。
结果上,这份技术报告里最硬的数字是 TTS:在中文”像不像真人在说话”的 Arena 式主观评测(两两对打,让人盲选更像真人的那条)里拿到 Elo 1755.33,比第二名 Qwen-Audio-3.0-TTS-Plus(1544.3)高出 211 分,对五个商业 TTS 系统的直接对比胜率是 82.0%,单场胜率区间 73.0%–90.0%。Voice design(用自然语言描述音色和风格,让模型”捏”一个声音出来)同样是第一,Elo 1668.5,胜率 75.5%。
这篇文章按三层来拆:结构上它做了什么、数据上它怎么凑的、训练上它做了哪些事才换来这个结果。
2. 先搞清楚:为什么音频生成一直没长成一个”LLM 任务”
统一音频生成不是新目标,最近一两年不少工作在做。路线大致两条,各自都有说不出的苦。
第一条是连续 latent + diffusion / flow matching。用一个大 VAE 或者 codec encoder 把音频压成连续的 latent,然后在 latent 上跑 diffusion。好处是声学细节渲染得漂亮,多家通用音频模型(speech、sound、music 一起做的那种)走的是这条路。坏处是它和 LLM 天然不兼容:LLM 的词表是离散的 softmax,它的训练目标是 next-token prediction,它的上下文是文本和音频随意交错的序列。你没法把一个连续 latent 塞进 softmax 里。
第二条是离散 unit + LM 式序列建模,也就是先把音频变成 token(”音频 tokenizer”这个说法就是指做这件事的模块,它同时也要负责把 token 变回波形),再像语言模型那样预测。这条路天生和 LLM 兼容,但马上撞上一个长度问题:高保真的音频表示,每一帧不止一个 token。
具体说,现代音频 tokenizer(尤其是 “RVQ” 这一类)的做法是:对每一帧,先用第一个 codebook 做一次粗量化,然后把”原信号减去已量化部分”剩下的残差交给第二个 codebook 再量化,如此类推十几层。这里几个词得先说清楚:codebook 就是一本固定的向量字典,编码时在字典里找最接近的条目、记下条目编号(这个编号就是 token);RVQ 全称 residual vector quantization,残差向量量化,核心就是”一层层补残差”这个动作。好处是极少的比特就能还原相当高的保真度,代价是——一帧音频变成十几个 token id,而不是一个。
于是问题来了。如果把这十几个 id 沿时间轴展平,序列长度直接乘 15,一分钟音频就是上万个 token,训不动;如果只保留第一个(最粗的)codebook,那序列是短了,但声学细节全丢了,出来的是”意思对但音色很糙”的声音。两边都不行。
已有的绕法有两类。一类是 time-depth 结构:一个大的 Transformer 沿时间轴跑(管跨帧结构),一个小的 Transformer 管同一帧内部那十几个 codebook(管声学细节)。另一类是延迟模式(delayed pattern),MusicGen 用的就是它——把不同 codebook 的流在时间上错开,让一个 Transformer 一次性预测所有层。
StepAudio 3 Gen 选了 time-depth,而且论文把为什么不选 delayed pattern 说得很直白:延迟模式要求预训练的 LLM 自己直接预测每一层残差、并且接收所有声学损失,还得配一个多流音频输出接口。这两件事都是对 LLM 原结构的破坏。它宁愿让 LLM 只负责语义最集中的第一层,把声学残差和它的梯度一起关进一个小模块里。
这个选择,是理解全文的第一个支点。
3. 结构:一根时间轴管语义,一根深度轴管声学

3.1 表征:12.5 Hz、16 个码本,语义和声学不分家
StepAudio Tokenizer 是整套东西的地基,它的规格是:
- 12.5 Hz,也就是每帧 80 毫秒,一秒钟音频只有 12.5 个时间步;
- 每帧 16 个 codebook,每个 2048 项;
- 重建波形采样率 24 kHz。
关键在于它怎么把音频变成这 16 个 id。这里没有走”一个编码器只提语义特征、另一个只提声学特征然后挑一个”的老路,而是两个都提,然后融合:一个冻结的自监督(SSL)编码器提供语义特征,一个卷积编码器(配 SnakeBeta 激活)直接从原始波形、在 50 Hz 的速率上提取声学特征;两路沿通道维拼起来,用一个 strided convolution 在时间上压到 12.5 Hz,最后交给同一个共享量化器。
结果是每一层 codebook 里都同时有语义和声学信息,而不是前几层管语义、后几层管声音的硬分工。这个设计直接决定了后面 LLM 能怎么用它。
在此基础上,训练时还有两个小机关把信息往前面几层挤:
- 量化器 dropout 取 0.5。量化器 dropout 指的是训练时随机跳过若干层残差量化,逼前面的层自己去扛更多信息。0.5 这个比例是刻意选的——论文提到再大一点,前几层确实更强,但满深度重建质量会掉;
- 语义蒸馏分支,用一个回归目标把冻结 SSL 编码器的特征从量化后的 latent 里还原出来。
两个机关叠在一起,效果是时间规划需要的信息被集中到了最前面的 codebook 上。这就为下一节的”深度轴”铺好了路:第一层足够”语义”,才配交给 LLM 的大词表去预测。
另外两个工程细节值得记一笔。第一,量化用的是 16×2048 的 RVQ,codebook 查找是 factorized + 余弦相似度的形式,不是常见的欧氏距离 L2 最近邻。第二,解码器是全因果的:Vocos 风格的 Transformer 骨架,配 RoPE 位置编码和 25 帧滑窗注意力,最后用一个 iSTFT head 出 24 kHz 波形。全因果 + 无 look-ahead 意味着它能边出 token 边出声,这是能上实时在线服务的前提——很多走 diffusion 的通用音频模型,这块是绕不过去的坎。
3.2 生成:c0 交给 LLM,c1~c15 交给一个小 Transformer
有了统一表征,生成就被拆成了两根轴:
时间轴上,16 个 codebook 里的第 0 个(记作 c0)被提升进主语言模型的词表——2048 个连续的 audio token 直接接在文本词表后面。于是主 LM head 一个 softmax 就同时管了自然语言 token 和音频的顶层 token,两种模态可以自由交错。
深度轴上,剩下 15 层残差交给一个 4 层因果 Transformer,论文里叫 RVQ Code Predictor。它每一步收到两个条件:LLM 在这一帧的 hidden state $z_t$(线性投影到 predictor 的宽度),和主 LM 刚刚选出来的 c0。然后它自回归地吐出 c1、c2……直到 c15,每一层的输出再喂回去当下一步的输入。
写成分解式就是:
\[p(c_{t,0},\ldots,c_{t,15}\mid \mathbf{z}_{<t},\mathbf{c}_{<t}) = \underbrace{p(c_{t,0}\mid \mathbf{z}_{<t},\mathbf{c}_{<t})}_{\text{主 LM head}} \;\prod_{k=1}^{15}\;\underbrace{p(c_{t,k}\mid \mathbf{z}_{t},c_{t,0},\ldots,c_{t,k-1})}_{\text{RVQ Code Predictor}}\]论文特别强调这个分解是精确的而不是近似的,理由有点绕但值得品:因为一个音频帧的 16 个向量是先相加成一个帧向量再进 LLM 的,所以 $z_t$ 里已经通过 backbone 编码了历史帧的全部 16 层($\mathbf{c}_{<t}$),不存在”past 帧的残差没被 LLM 看到”的信息缺口。
它放弃的只是反方向:predictor 的输出不回灌给 backbone。而这恰恰是后面训练策略里那个 detach 操作的由来——因为两边既然不是必须联合优化,就可以分开、分阶段优化。

3.3 输入侧:RVQ Adaptor 这道”调压阀”
输出侧的设计已经够简洁了,输入侧还埋了一个更关键的模块。
一个音频帧不是一个向量,是 16 个向量。这 16 个 codebook 各自有一张 embedding 表,查出来的 16 个向量直接相加,得到这一帧的帧向量。然后这个帧向量过一道 RVQ Adaptor——一摞逐 token 作用的残差块(pre-norm + SwiGLU),输出只加在音频位置上,和 c0 那个 audio token 的 embedding 逐元素相加。
注意 c0 在这里被表示两次:一次在主词表里(作为那个 audio token),一次通过它自己的那张表混在帧向量里。
这道 adaptor 有两个细节决定了它到底管不管用:
- 位置门控:文本位置没有任何音频码,整条通路不参与,只加在音频位置;
- 下投影零初始化:这意味着训练刚开始时,adaptor 是一个恒等映射——音频通路对文本表征的扰动,在初始化那一瞬间严格是 0。
第二条是整套防干扰设计的源头。后面讲训练时会看到,正是靠它,第一阶段才敢只训 adaptor 而完全不做文本回放。
最后是损失函数:
\[\mathcal{L} = \mathcal{L}_{\mathrm{tok}} + \lambda\,\mathcal{L}_{\mathrm{sp}}, \qquad \mathcal{L}_{\mathrm{tok}} = -\sum \log p(c_{t,0}, x_t), \qquad \mathcal{L}_{\mathrm{sp}} = -\sum_t \sum_{k=1}^{15} \log p(c_{t,k}\mid\cdot)\]一个小到容易看漏、但后面会变成关键的设计:$\mathcal{L}_{\mathrm{sp}}$ 是对 15 层 codebook 求和(sum),而不是取平均。也就是说,声学损失的量级天然比 token 级损失大一个数量级。这个”债务”迟早要还——还的方式就是第 5 节里那个 $\lambda$。
4. 数据:预训练铺覆盖,后训练全靠自己造

整份报告的数据组织分成两段:预训练铺覆盖面(目标是建立一套统一的音频理解 + 生成能力),后训练按任务逐个打磨(目标是质量、自然度和可控性)。四个阶段加起来,LLM 侧一共吃了约 2.7T tokens。
4.1 预训练:一份”生成 + 理解 + 文本”的混合料
预训练的音频来源横跨语音、歌声、音乐和环境音,任务上分两类:
- 生成类:TTS、歌声合成、歌词条件音乐、caption 条件音效、语音到语音翻译;
- 理解类:ASR(自动语音识别)、语音到文本翻译、音频描述、副语言问答、口音 / 方言识别、交错的多轮语音对话。
理解类这一半很容易被忽略,但它其实是把 RVQ 表征锚在语言上的那根钉子。论文的原话是,这些 understanding 任务负责”暴露音色、情绪、口音这些可控属性”——模型要先能听懂”这是什么音色 / 什么情绪”,后面才谈得上按指令生成。
音频统一按 12.5 Hz × 16 codebook 编码,生成样本的排布方式是 1 个文本 token : 2 个音频帧交错。
采样配比有个很硬的比例,从第 2 阶段起生效:
- 从 Stage 2 开始,文本语料占每个 optimizer step 的一半;
- 生成阶段的配比固定为
text : TTS : 交错对话 = 3 : 1 : 2——文本份额恰好 50%,TTS 占每个 micro-batch 的 1/6,也就是音频生成流里的三分之一。
4.2 Tokenizer 自己的训练:700k 小时 + 两阶段
Tokenizer 不是白来的,它单独训了 约 70 万小时的语音 / 音乐 / 音效,用模态均衡的采样器保证不会偏向某一种。整个训练走 GAN 框架(多周期波形判别器 + 多分辨率频谱判别器),再配 feature matching、多尺度 mel 谱和 RVQ commitment 损失。
第二阶段的设计我觉得挺有意思:冻结编码器、量化器和语义分支,只练声学解码器和判别器。好处是重建质量涨了、但 token 空间一个字没动——所有已经在这些 token 上训过的模型依然兼容。说白了就是把”表示”和”渲染”彻底解耦,表示定稿之后,渲染可以慢慢调,不会连累下游。
4.3 后训练:约 5,000 小时,几乎每一块都是造出来的
预训练之后是 SFT(supervised fine-tuning,监督微调),语料约 5,000 小时,横跨音乐、音效、voice design、歌声和语音。这部分的构造细节比模型结构更能说明现在做通用音频模型的真实门槛——每一类数据背后都有一条用别的模型搭起来的流水线。挑几条看:
- TTS:为了”像人在说话”,单独精挑了 1,500 小时自然口语。筛选方式是用自家的 StepAudio R1.5 做面向 TTS 的音频 captioning,描述录音场景、底噪水平和说话人特征;再配一个专门优化过副语言现象的 ASR 做转写和校验,把语气、犹豫这类表达线索保住。
- speech → vocal(语音转歌声):语音-歌声成对数据极其稀缺,所以自己造伪配对。两条互补路线——TTS 音色克隆(拿一段歌声当条件,让 TTS 用它的音色说话),和歌声转换 SVC(把歌声换成目标说话人的音色,再和这个说话人的正常语音配对)。造完用三重指标筛:Audiobox Aesthetics 的 PQ / CE 两个分数(听感质量和内容愉悦度)、SingMOS 的歌声 MOS 预测(MOS 就是主观打分,1–5 分越高越好),加上合成音频与目标音频的音色相似度。音频质量和音色相似度两个门槛都得过才留。
- 音乐:干脆用自家的 StepAudio Music Model 按提示生成器乐素材,再给每条素材配三种粒度的中英条件——简短描述、细节描述(配器、节奏、制作风格)、口语化请求(用户偏好和使用场景)。三种粒度意味着同一段音乐在不同描述层级下都被监督到。
- 音效:真实音效库 + 合成混音两条腿。真实部分按”事件 / 声源 / 声学属性 / 场景 / 时间结构”做多层标注;混合场景则是先抽一个场景骨架(谁在说话、哪几段语音、哪些音效、什么环境声),让文本 LLM 去补台词、说话风格、音效描述、时长和时间关系,然后分 stem 合成(语音和音效各自独立生成),最后按声源显著度和距离调增益再混音——这一步是为了保住前景 / 背景的层次关系。
- Voice design:录制 + 合成两条来源,覆盖日常对话、角色对白、专业配音,以及各种录音环境,再把欠代表的”音色 × 说话风格 × 声学场景”组合用合成数据补上。
RL 阶段复用同一套任务分类和条件格式,只把指令模糊、难以客观核验的样本剔掉,减少奖励噪声。
5. 训练:四阶段课程,和它要挡的三件事

这是整份报告里最”值钱”的部分,也是最能解释”为什么结果这么好”的部分。
5.1 先看清敌人:给文本 LLM 加音频,有两条伤害路径
论文把这件事说得非常直接:往一个文本 LLM 里加音频 token,不是中性的操作。
伤害路径有两条,方向完全不同:
- 表征层面:一堆新初始化的 RVQ embedding 加起来,它的统计量跟预训练文本 embedding 的统计量本来就对不上。LLM 被迫去适应一个分布外的新输入;
- 目标层面:每个时间步要预测 16 个 code,而残差那 15 层的损失因为是求和的,量级远大于 token 级交叉熵。如果一上来就联合优化,backbone 会优先去吸收这份巨大的声学梯度——在音频模块还没变有用之前,先把继承来的语言能力花掉了。
这两条路各自对应了具体的对策,而”四阶段课程”就是这些对策在时间上的排布。
5.2 四个阶段各自在干什么

Stage 1 · 模态对齐。 数据是 ASR + 语音翻译,只监督文本输出,一个字音频都不生成。backbone、LM head、code predictor 全部零学习率,只训输入侧的 audio embedding 和 RVQ Adaptor。学习率 $2\times10^{-4} \to 2\times10^{-5}$ 走 cosine,batch 4.19M。
这一阶段有个很漂亮的论证:因为 adaptor 的下投影零初始化(恒等映射)+ backbone 冻结,文本能力的漂移严格等于 0,所以这一阶段根本不需要文本回放。另外 token embedding 给了 0.1× 的学习率——不是整块冻结,而是让新加的那 2048 行 audio-code 慢慢适应已有空间。
Stage 2 · 音频理解。 全部参数解冻,训理解类任务,仍然不监督任何音频生成目标。同时从这一阶段开始,原始文本语料占每个 step 的一半。学习率降到 $2\times10^{-5}$ 之后就走 constant——注意这个细节,后面几个阶段直接从这个平台接着跑,不再重新 warmup,也就不会再有”学习率从高往低冲一遍”带来的表征抖动。新加的模块学习率 ×10,并且排除在 weight decay 之外。
Stage 3 · 生成(detached)。 主预训练,生成能力从纯语音起步,配比 text : TTS : 对话 = 3 : 1 : 2。这一阶段的核心操作是:code predictor 的条件输入(backbone hidden state)被 detach,那 15 层残差的损失梯度不回流 backbone。
论文给的动机很实在:$\mathcal{L}_{\mathrm{sp}}$ 是对 15 个 codebook 求和而非平均,量级比 token 级损失高一个数量级;而 predictor 此刻还是随机初始化的。这两个条件凑在一起,那份梯度一上来就会把前两阶段辛苦建立的表征重新捏一遍。detach 之后,残差声学那部分只训 predictor,backbone 继续由 token 级目标驱动——把”学声学细节”和”学语义韵律规划”彻底拆开,这是保护文本能力的第二道保险。这一阶段 $\lambda = 1.0$。
Stage 4 · 长上下文联合 cool-down。 detach 解除,声学损失开始回流 backbone——于是 $z_t$ 除了要当好”语义条件”,还得被塑造成好的声学条件。同时 $\lambda$ 从 1.0 压到 0.1:既然 depth 损失现在能打到 backbone 了,就得把两项拉回同一量级,不能再让它高一个数量级。序列长度从 16,384 扩到 32,768(配 context parallelism),按 12.5 Hz 算,32,768 个时间步 ≈ 44 分钟音频,够覆盖长音频合成和多轮对话。batch 也翻倍到 25.17M。
为什么放到最后?论文两个理由都很实:一是这时 predictor 已经收敛,回流的是”有意义的声学梯度”而不再是随机噪声;二是 cool-down 阶段的低学习率本身就限制了它改动 backbone 表征的幅度。
把三道闸门并列看,会更清楚:
- 表征层面 · RVQ Adaptor——零初始化让它开局是恒等映射,音频通路先学会怎么进 LLM 的输入空间,再逐步放开扰动;
- 数据层面 · 50% text replay——文本能力不是”尽量少掉”,是每一批梯度里都还在被主动训练;
- 目标层面 · detach + λ——先挡住那份量级失衡的声学梯度,等 predictor 收敛、再放开并把 λ 从 1.0 压到 0.1。
5.3 后训练:SFT 全参微调 + GRPO
SFT 用的是全参数微调,把预训练末尾的联合配置直接继承下来(detach 保持关闭,$\lambda=0.1$ 的语音损失继续穿过 code predictor 打到 backbone)。序列长 16,384,batch 64,学习率从 $1.0\times10^{-5}$ 走 cosine 降到 $1.0\times10^{-6}$。audio embedding、adaptor、code predictor 这三个新模块保持 10× 学习率加成。
SFT 之后是 GRPO(Group Relative Policy Optimization)——这是 PPO 的一个变体,核心差别是不训 value model,而是对同一个指令采样一组输出,用组内相对好坏当优势值来更新策略。这里的几个设计值得单独看:
奖励是乘性的,不是加性的。 对每条生成的音频 $y_i$,先用一个音频理解模型写出 caption $c_i$,再让一个文本 LLM 比较 $c_i$ 和原始指令 $x$,给一个 0–100 的指令一致性分数。为了压评估方差,每个”指令-caption”对独立打 4 次分取均值 $\bar{s}_i$。对有目标文本的语音样本,再用 ASR 转出 $\hat{t}_i$,算错误率 $e_i$(中文按字算就是 CER,英文按词算就是 WER,都是”改多少个字才能变成标准答案”,越低越好):
\[R_i = \frac{\bar{s}_i}{100}\begin{cases}\exp(-\tau e_i), & e_i \leq 0.5,\\ 0, & e_i > 0.5,\end{cases} \qquad \tau = 3\]乘法的意义很直白:一段内容完全念错的音频,不能因为”风格很像指令描述的那样”就拿到高分。没有目标文本的任务(纯音效、纯音乐)就把 ASR 那一项设为 1。
动态采样滤掉”没信号”的组。 每条指令采 $G=16$ 个候选,优势 $\hat{A}_i=(R_i-\mu_R)/(\sigma_R+\eta)$。借鉴 DAPO 的做法,组内奖励标准差 $\sigma_R < \delta$($\delta=0.02$)的组直接丢掉——一组 16 个输出分数都差不多,说明这条指令对当前策略没区分度,留着重只会加噪声。
| 重要性比率是按 codebook 算的。 损失函数里对时间位置 $t$ 和 codebook 下标 $\ell \in {0,\ldots,15}$ 都算了 token 级的重要性比率 $\rho_{i,t,\ell}$,再除以 $16 | y_i | $ 做归一化,配一个很小的 KL 系数 $\beta$(主要靠 clip 约束更新),学习率 $10^{-6} \to 10^{-7}$。 |
这一步其实是个不太显眼但很实在的工程选择:GRPO 本来是给文本 token 设计的,这里把它直接铺到 16 层 codebook 上,让残差层也接受偏好信号的调教——而不是只训 c0、让 predictor 自生自灭。
6. 结果:每一块设计值多少分
报告里的实验组织得很干净,正好是三个问题:RVQ Adaptor 有没有用、干扰控制有没有用、最终生成质量如何。
6.1 RVQ Adaptor:不加它,音频根本没进到 LLM 的语义空间

几个指标先解释一下:CER / WER 是识别错误率,越低越好;MMAU 是音频理解与推理基准,报准确率;CoVoST 是语音到文本翻译基准,报 BLEU(衡量生成译文和参考译文的 n-gram 重合度,越高越好);SpeechMMLU 是语音形式的知识问答,准确率越高越好。
对比结果:
- ASR:AISHELL-1 的 CER 从 5.25 → 3.00,LibriSpeech 的 WER 从 6.00 → 3.41;
- MMAU 准确率 40.70 → 51.70;
- CoVoST BLEU:En→Zh 12.05 → 30.56,Zh→En 5.99 → 18.59;
- SpeechMMLU (T2S) 准确率 12.13 → 58.76。
最后那一行是重点。SpeechMMLU 的 12.13% 是什么概念——基本等于在瞎猜。这说明不加 adaptor 的时候,多 codebook 音频表征根本没有落进 LLM 的语义空间,模型只是勉强在做模式匹配;加了之后才跳到 58.76%。这不是”涨了几个点”,是两个状态。
6.2 干扰控制:文本能力不是”少掉一点”,而是全面反超

对照组是不用 RVQ Adaptor 的三阶段 baseline(ASR 训练 → 音频理解 + 生成训练 → cool-down),在 8 个文本基准上比:
- FinEval 65.86 → 71.68,C-Eval 66.34 → 71.92,MMLU 64.99 → 69.20,CMMLU 66.69 → 71.73
- MATH 36.62 → 45.07,GSM8K 67.94 → 74.05,BBH 59.61 → 67.03,HumanEval 47.56 → 54.27
八个基准全部反超,而且幅度不小。这比”文本能力只掉了 X%”有说服力得多——它说明这套课程不只是”少伤害文本能力”,而是在引入音频的同时顺带把文本能力也练上去了(毕竟 Stage 2 起一半的梯度就是纯文本)。
6.3 TTS:放弃 CER 和 SS,改问”像不像真人”
TTS 这块,报告的评测取向我觉得是全文最有意思的一处”反潮流”。
它明确说不用 CER 和 SS(speaker similarity,说话人相似度)这类客观指标,理由也站得住:一段语调平得像播报的音频,只要内容念对了,CER 照样很低;而 SS 反映的是说话人身份和音色,反映不了表达力。这两个指标恰恰测不出他们想要的”人味”。
所以他们搭了一个 Arena 式的成对主观评测:评者听两条音频,选”更像真人在自然说话”的那条,允许判平局。评测集是从真实人类语音里抽文本构造的中文 set,六个系统两两对比,一共 1,500 次比较,最后用 Elo 汇总(Elo 就是国际象棋那套评分,赢了涨分输了掉分,分数越高代表在这个池子里越被偏好)。


- StepAudio 3 Gen 1,755.3,比第二名 Qwen-Audio-3.0-TTS-Plus(1,544.3)高 211.1 分;
- 对五个商业系统的直接对比,总胜率 82.0%,单场从 73.0%(对 Qwen-Audio-3.0-TTS-Plus)到 90.0%(对 Inworld-TTS-2 和 Minimax-Speech-2.8-HD),每一场都是明显多数。
6.4 Voice design:指令遵循 + 盲测偏好双第一
Voice design 用了两个评测。
第一个是 InstructTTSEval 客观基准:2,000 条文本(中英各 1,000),每条在三种指令条件下各生成一遍——APS(声学参数指定,比如直接给音高语速)、DSD(描述性风格指令)、RP(角色扮演),一共 6,000 条音频,由 Gemini 3.1 Pro 判定风格一致性。

中文 AVG 85.2(APS 88.5 / DSD 91.5 / RP 75.5),英文 AVG 77.7(82.4 / 85.5 / 65.2),中英两边都排第一。三项里 RP 一致最低——角色扮演这类条件本身就最模糊,其它系统更低(Qwen3-TTS 的 RP 中文只有 56.2)。
第二个是盲测人类偏好,490 次中英对比,5 个模型:


Elo 1,668.5 排第一,领先 Qwen3-TTS-12Hz-1.7B-VoiceDesign(1,571.5)97 分;总胜率 75.5%,单场 65.3%–85.7%。
7. 我看到的几个点
第一,这篇真正的贡献是那套”隔离”思路,不是某个模块。
RVQ Adaptor 和 4 层 predictor 都不算新东西——time-depth 结构在音频 LLM 里已经用了好几年。真正少见的是把”加一个新模态会怎么伤害已有能力”这件事拆成两条具体路径、给每条配一个机制、再排成时间课程。零初始化 adaptor 管表征、50% text replay 管分布、detach + λ 管梯度量级——三个动作各自对应一个可诊断的问题,而不是笼统地”加个 LoRA 保一下”。
而且这套设计前后是自洽的:$\mathcal{L}_{\mathrm{sp}}$ 求和而非平均这件事,在 Stage 3 是必须 detach 的理由,在 Stage 4 是必须降 λ 的理由。全文的两处关键决策,都是从”损失量级天然失衡”这一个小小的事实推出来的。这种”从一个实现细节贯穿到底”的一致性,是读技术报告时最值得学的地方。
第二,TTS 评测从客观指标转向主观 Arena,这个方向我认同。
CER 和 SS 之所以流行,是因为它们便宜、可复现、能自动跑。但它们测的是”内容对不对”和”音色像不像”,而不是”听起来像不像人”。而通用音频模型发展到现在,剩下的差距恰恰主要在 CER 量不到的地方——韵律、节奏、呼吸、犹豫、什么时候该停顿。这篇选择用 Elo 和胜率来汇报,虽然主观、难复核,但至少测的是他们真正想优化的东西。它敢这么报,也是因为它赢得很明显(82% 胜率不是靠运气)。
第三,通用音频模型的门槛,已经从”模型架构”转移到了”数据构造流水线”。
把第 4 节的数据流水线再回顾一遍:TTS 数据要先用自家的 captioning 模型筛、再用自家的副语言 ASR 校验;speech→vocal 要用自家的 TTS 和 SVC 造伪配对,再用 Audiobox Aesthetics 和 SingMOS 三重筛;音乐数据直接用自家的音乐生成模型造;音效混合场景要靠文本 LLM 去补场景脚本。每一类数据的产出,都依赖另外几个已经训练好的模型。
这不是 StepFun 一家的特例,而是这个方向现在的普遍形态。它的含义是:一个团队想做通用音频生成,光有算力和架构不够,你还得先有一整套能互相当”数据生成器”的模型资产。这也直接解释了为什么这份报告里”数据”那一节的篇幅几乎和”训练”一样长。
第四,时间轴和深度轴的”权责划分”值得琢磨。
让 LLM 只管 c0,看起来是”降低了 LLM 的职责”,但换回来的是三件事:序列长度不膨胀、预训练的语言能力不被 15 层残差损失冲垮、以及 predictor 可以独立训练和独立 detach。在一个已经很重的 backbone 旁边加一个轻量、可隔离、可单独调度的模块,这个模式在别的模态扩展场景里大概率也能复用。
8. 局限
说几个报告里没解决、或者没说的:
- backbone 的规模完全没披露。 全文只给了 batch size、学习率、序列长度和 λ,没有一个字提参数量、层数、hidden 维度。作为一份技术报告,这个信息缺口比较大——你没法从这篇里学到”这套配方在不同规模的 LM 上是否同样有效”,而这恰恰是做多模态扩展时最关心的 scaling 问题。
- 数据构造的可复现性接近零。 前面说了,TTS captioning 用 StepAudio R1.5、副语言转写用自家 ASR、音乐数据用 StepAudio Music Model、音色筛选用 Audiobox 和 SingMOS。这套链条里除了 Audiobox 和 SingMOS,其余都是内部模型。外部团队能复现的只有”设计思路”,复现不了”数据”。
- 主观评测是自家的池子和流程。 Arena 式评测的评测集、评者构成、判定规则都会影响结果。1,500 次比较听起来不少,但对比的五个商业系统每家只用了一个音色——对 TTS 这种强依赖音色的任务,单音色对比的结论外推时要谨慎。
- 客观指标基本空缺。 只报主观 Elo 和胜率,一个 CER / SS / 相似度数字都没有。这在”强调人味”的框架下可以理解,但读者没法判断内容准确性上有没有代价——比如为了更自然的韵律,有没有牺牲字准。
- “通用”的覆盖面报得不均匀。 音乐只说了”能生成超过 60 秒、保持结构和风格一致”,没有和音乐专用模型做任何对比;音效、歌声、vibe speech 也都只有能力描述没有量化评测。相比之下 TTS 和 voice design 的评测完整得多。所以”general audio”这个说法目前更像是一个统一框架的存在性证明,而不是”在每个子领域都能打”的证明。
9. 总结
StepAudio 3 Gen 的核心思路可以压缩成一句话:用一套 12.5 Hz、16 层 codebook 的共享 RVQ 表征把语音、歌声、音乐、音效统一起来,然后让 LLM 管时间轴上的语义决策、让一个 4 层小 Transformer 管帧内的声学残差,整套生成过程完全在离散 token 空间里完成,不碰 diffusion。
它之所以能把结果做到这个水平,靠的不是某一个模块的新意,而是两件事的配合:
结构上,把”语义密集的 c0”和”声学密集的 c1–c15”分到两根轴、两个模块上,让 LLM 可以既参与音频生成、又不必承受全部声学损失;输入侧用零初始化的 RVQ Adaptor 把多 codebook 表征平滑地接进预训练 embedding 空间。
训练上,把”加新模态会伤害已有能力”拆成表征和目标两条路径,配三个机制(adaptor / 50% text replay / detach + λ),再排成四阶段课程。效果上,文本基准不是”少掉”,而是 MMLU +4.2、GSM8K +6.1、HumanEval +6.7 的全面反超。
要挑刺的话,信息透明度是这份报告最大的短板——模型规模不披露、数据链条不可复现、客观指标空缺。但就”离散自回归能不能撑起通用音频生成”这个问题而言,它给了一个相当有力的肯定答案:在 TTS 和 voice design 上,纯离散 token 的路线已经能在盲测里赢过一堆走连续 latent + diffusion 的商业系统。
参考资料
- StepAudio 3 Gen Technical Report(StepFun-Audio Team)— arXiv:2609.12945
- 试听样例 — stepaudiollm.github.io/step-audio-3-gen
- X-Codec: 语义 / 声学联合量化的音频 codec 系列工作(StepAudio Tokenizer 的路线参考)
- MusicGen(Copet et al., 2023)— delayed pattern 多流码本建模的代表
- DAPO: 动态采样思路的来源,本文用它滤掉低区分度的 GRPO 组
- Audiobox Aesthetics — PQ(Production Quality)/ CE(Content Enjoyment)打分模型
顺带扯一句题外话。这篇里有个我读的时候愣了一下的小设计:RVQ 是”第一层粗量化、后面每层补上一层没还原出来的残差”,而书里讲 LLM 压缩时聊到的量化(把权重从 FP16 压到 INT8 / INT4),数学动作其实是同一族的——都是”用有限的离散候选去逼近一个连续量,然后逐层 / 逐通道补偿误差”。方向完全不同(一个是输入的表征、一个是权重的存储),但看 RVQ 的残差补偿那几行时,手上刚翻过敏捷量化那部分的话,会觉得挺熟。
另外第 5 节那套”先冻结对齐、再逐步放开、最后联合 cool-down”的课程,和书里 NAS 搜索策略那部分讲的 warm start、渐进式搜索空间放宽,也是同一种工程直觉在起作用:一次只放开一个自由度。我们把手头关于 AutoML / NAS 和大模型压缩的积累整理成了《动手学 AutoML:从 NAS 到大语言模型优化实战》,上面这两块对应的章节里都有,感兴趣可以翻翻。
