LangFlow: Continuous Diffusion Rivals Discrete in Language Modeling

  • 论文标题:LangFlow: Continuous Diffusion Rivals Discrete in Language Modeling
  • 论文链接:https://arxiv.org/abs/2604.11748
  • github:https://github.com/nealchen2003/LangFlow
  • huggingface:https://huggingface.co/papers/2604.11748

LangFlow 关注一个长期没有被充分解决的问题:连续扩散模型在图像、视频等连续模态上很强,但在语言建模中一直落后于离散扩散。作者认为问题不在于连续扩散本身不可行,而在于 embedding-space diffusion 的训练目标、似然评估和噪声调度设计还不够清楚。

这篇论文的核心结论是:如果把 embedding-space diffusion 重新表述为 Flow Matching,并用 Bregman divergence 解释交叉熵训练目标,再配合 ODE-based NLL 上界、Gumbel 噪声调度和 self-conditioning,连续扩散语言模型可以在 LM1B 和 OpenWebText 上接近甚至追平主流离散扩散语言模型。LangFlow 在 LM1B 上达到 PPL 30.0,在 OpenWebText 上达到 PPL 24.6,并且在 7 个 zero-shot 迁移评测中有 4 个超过自回归 Transformer。

1. 背景:为什么语言里的连续扩散一直难做?

扩散模型天然适合连续空间,因此在图像和视频生成中非常成功。但语言是离散 token 序列,扩散语言模型通常有两条路线:一类是直接在离散状态上做扩散,例如 absorbing-state 或 uniform-state discrete diffusion;另一类是在 token embedding 空间中做连续扩散。后者理论上保留了连续扩散的优点,比如可编辑轨迹、ODE/SDE 采样、未来可做少步蒸馏,但过去在 PPL 和生成质量上没有真正追上离散扩散。

LangFlow 的切入点是 embedding-space diffusion。给定词表嵌入矩阵 \(E \in \mathbb{R}^{V \times d}\),一个 token 序列 \(y=(y_1,\ldots,y_L)\) 会先被映射成连续嵌入序列 \(x_1 = E[y]\)。模型不是在 one-hot simplex 上扩散,而是在连续 embedding 空间中从高斯噪声逐步移动到 clean embedding。

可以把 LangFlow 的生成过程抽象为一个 ODE:

\( \frac{d x_t}{d t}=v_\theta(x_t,t), \quad x_0 \sim \mathcal{N}(0,I), \quad x_1 \sim p_{\mathrm{data}} \)

其中 \(v_\theta\) 是模型学习到的 velocity field。训练和采样的关键,不是直接回归某个 embedding,而是让模型在噪声状态下预测 clean token 的概率分布。

2. LangFlow 的模型设计

LangFlow 的主干结构使用与强离散扩散基线相同的 modified DiT-style Transformer,并加入 RoPE 位置编码。正文实验配置为约 130M 参数、12 层、hidden size 768、12 个 attention heads。这样设计的好处是:实验对比时,LangFlow 与 SEDD、MDLM、Duo 等基线的网络容量基本对齐,性能提升更能归因于连续扩散框架和训练策略,而不是模型规模。

模型输入是 noisy embedding \(x_\gamma\),时间条件不直接使用普通时间 \(t\),而使用 log noise-to-signal ratio:

\( \gamma = \log \frac{\sigma^2}{\alpha^2} \)

在 variance-preserving 路径下,噪声状态可以写成:

\( x_\gamma = \alpha_\gamma x_1 + \sigma_\gamma \epsilon,\quad \alpha_\gamma = \frac{1}{\sqrt{1+e^\gamma}},\quad \sigma_\gamma = \sqrt{\frac{e^\gamma}{1+e^\gamma}} \)

当 \(\gamma\) 很大时,状态接近纯噪声;当 \(\gamma\) 很小时,状态接近 clean embedding。这样做的直觉是:语言 denoising 的难度主要由噪声强度控制,而不是由任意定义的时间变量控制。

LangFlow 还做了三个小但重要的工程修改:第一,将 self-conditioning 的输入并入主输入;第二,把 token embedding 归一化到单位球面后再缩放,使数据方差与噪声方差更匹配;第三,在 logits 上加入 tokenwise bias,改善训练初期的概率预测。这些修改没有显著改变参数量,但会影响训练稳定性。

3. 训练目标:用 Bregman divergence 解释交叉熵

过去一些连续扩散语言模型会直接用 MSE 回归 clean embedding,但论文指出这种做法可能导致 embedding collapse:不同 token 的 embedding 被错误地拉近,削弱语言表示的可分性。LangFlow 改为预测 clean token 的类别分布,并使用交叉熵训练。

作者的理论贡献是说明:交叉熵不是一个临时技巧,而可以看成 Bregman-divergence Flow Matching 在 categorical data 上的一个特殊形式。Bregman divergence 定义为:

\( D_F(q,p)=F(q)-F(p)-\langle \nabla F(p), q-p\rangle \)

当选择与负熵相关的凸函数时,token-level 交叉熵可以自然恢复出来。LangFlow 的训练目标可以简化写为:

\( \mathcal{L}_{\mathrm{CE}}(\theta) = \mathbb{E}_{\gamma,\,y,\,\epsilon} \left[-\log p_\theta(y \mid x_\gamma,\gamma)\right] \)

模型输出的是 \(p_\theta(\cdot \mid x_\gamma,\gamma)\),即 clean token 的概率分布。采样时,再把这个概率分布映射回连续 denoised embedding:

\( \hat{x}_1 = \sum_{i=1}^{V} p_\theta(i \mid x_\gamma,\gamma) E_i \)

这样就把两个世界连起来了:训练在 token space 中用交叉熵优化,采样在 embedding space 中沿 ODE 做连续移动。

4. ODE-based NLL:让连续扩散也能认真评估 PPL

语言模型的核心指标是 perplexity,但 embedding-space diffusion 过去主要依赖 SDE-based bound,和实际 ODE 采样并不完全一致。LangFlow 选择只用 deterministic ODE 采样,因为 ODE 保留从噪声到数据的确定性映射,也更适合未来做 flow-based distillation 和 few-step generation。

论文推导了一个 ODE-based NLL 上界。博客里可以把它理解为:沿着反向 ODE 轨迹积分概率密度变化,再加上末端 token 解码概率,从而得到可用于 PPL 评估的上界:

\( -\log p_\theta(y) \le \mathcal{L}_{\mathrm{ODE}}(y) \)

其中 \(\mathcal{L}_{\mathrm{ODE}}\) 包含 ODE trajectory 上的 divergence term。论文实验中,PPL 评估使用 128-step Heun-2 solver,并用 Hutchinson trace estimator 估计 divergence。这一点很关键,因为它让连续扩散语言模型不再只能报告生成样本的 Gen. PPL,而可以和离散扩散在 PPL 上更公平地比较。

5. Gumbel 噪声调度:语言不是图像

论文最有启发性的经验发现是:图像扩散里常用的均匀噪声调度,直接搬到语言上会浪费大量训练与采样步骤。作者观察到,在某些噪声区间,模型的 CE loss 几乎为 0,说明模型已经能轻松预测正确 token,这些区间继续分配大量 step 没有太多信息增益。

LangFlow 提出 information-uniform principle:噪声采样密度应该匹配每单位噪声水平带来的信息增益。直观写法是:

\( p(\gamma) \propto \left|\frac{d H(y \mid x_\gamma)}{d\gamma}\right| \)

这里 \(H(y \mid x_\gamma)\) 可以理解为在噪声状态 \(x_\gamma\) 下 clean token 的后验熵。作者发现这个信息增益曲线很适合用 Gumbel 分布拟合:

\( p(\gamma;\mu,\beta) = \frac{1}{\beta} \exp\left( -\frac{\gamma-\mu}{\beta} -\exp\left(-\frac{\gamma-\mu}{\beta}\right) \right) \)

实践中,LangFlow 让 Gumbel scheduler 的参数可学习。训练时从该分布采样 \(\gamma\),采样时按 Gumbel 分布分位点安排 ODE step。论文报告,这一设计能把 LangFlow 的 Gen. PPL 从 1000 级别显著降到 154.2,说明噪声调度不是细枝末节,而是连续扩散语言建模能否工作的关键。

6. Self-conditioning:连续扩散和离散扩散的效果不同

Self-conditioning 的做法是把上一步预测结果作为额外输入喂回模型。训练时随机开启,采样时始终开启。LangFlow 训练中 self-conditioning 概率为 0.25。

有意思的是,论文发现 self-conditioning 对离散扩散和连续扩散的作用不一样。在 LM1B 消融中,MDLM 加入 self-conditioning 后 Gen. PPL 从 103.9 降到 94.9,但 PPL 从 31.0 变差到 32.7;LangFlow 则从 Gen. PPL 154.2、PPL 49.0 改善到 Gen. PPL 81.5、PPL 30.0。也就是说,对 LangFlow 来说,self-conditioning 同时提升生成质量和似然上界,是把连续扩散追到离散扩散水平的关键组件。

7. 实验设置与关键结果

论文主要在 LM1B 和 OpenWebText(OWT)上评测。LM1B 使用 context length 128 和 bert-base-uncased tokenizer;OWT 使用 context length 1024 和 gpt2-large tokenizer。模型训练 1M steps,batch size 512。Gen. PPL 通过生成 1024 个样本并用 GPT2-Large 计算平均 perplexity 得到;PPL 则报告各扩散模型的上界。

LM1B:LangFlow 的 PPL 为 30.0,是表中扩散语言模型里最好的结果;Gen. PPL 为 92.2,低于 MDLM 的 103.9、SEDD Absorb 的 115.9、UDLM 的 99.8 和 Duo 的 97.6,仅略弱于 Plaid 的 77.3。相比早期连续方法 Diffusion-LM 的 PPL 118.6,LangFlow 的提升非常明显。

OpenWebText:LangFlow 的 Gen. PPL 为 36.5,是表中最优;PPL 为 24.6,接近 MDLM 的 23.2 和 SEDD Absorb 的 24.1,并优于 SEDD Uniform 的 29.7、UDLM 的 27.4 和 Duo 的 25.2。这说明 LangFlow 不只是小数据集上有效,在更接近真实网页语料的 OWT 上也有竞争力。

Zero-shot 迁移:用 OWT 训练后的模型在 PTB、Wikitext、LM1B、Lambada、AG News、PubMed、Arxiv 上评测。LangFlow 在 PTB 为 81.20、Wikitext 为 32.28、Lambada 为 46.93,均为扩散模型中的第一;Arxiv 为 38.47,仅略弱于 MDLM 的 37.37。论文总结为:LangFlow 在 7 个任务中有 4 个超过自回归 Transformer,并在 3 个任务中超过 MDLM。

采样步数:在 LM1B 上,LangFlow 的 NFE 从 128 降到 64、32、16 时,Gen. PPL 分别为 92.24、104.83、127.32、179.60,质量随步数减少而下降,但没有经过专门 few-step 蒸馏。OWT 上,在 1024 NFE 时 LangFlow Gen. PPL 为 36.53,明显优于 Duo 77.69、SEDD Uniform 99.90、MDLM 104.85 和 SEDD Absorb 105.03;即使 128 NFE,LangFlow 仍有 60.09。

8. 关键创新点总结

  • 把 embedding-space diffusion 接到 Flow Matching:LangFlow 用连续 ODE 视角重新组织语言扩散,而不是把连续扩散当作简单的 embedding 回归。
  • 交叉熵目标有理论解释:通过 Bregman divergence,作者说明 token-level CE 是 categorical Flow Matching 的合理目标,避免了 MSE 带来的 embedding collapse 风险。
  • ODE-based NLL 上界:让连续扩散语言模型可以用更贴近 ODE 采样的方式评估 PPL,这是论文的核心理论贡献之一。
  • information-uniform 噪声调度:根据后验熵变化分配噪声密度,并用可学习 Gumbel 分布实现,显著改善生成质量。
  • self-conditioning 训练协议修正:论文证明 continuous DLM 中 self-conditioning 不只是改善 Gen. PPL,也能大幅改善 PPL,这和离散扩散中的现象不同。
  • 公平对比离散扩散:模型规模、训练步数和主干结构尽量对齐,使 LangFlow 与 SEDD、MDLM、Duo 等方法的比较更有说服力。

9. 局限

LangFlow 证明连续扩散语言模型有机会追上离散扩散,但它还不是对自回归语言模型的全面替代。首先,AR Transformer 在 LM1B 和 OWT 的 PPL 仍更低,例如 LM1B 为 22.8、OWT 为 17.5。其次,LangFlow 的高质量采样仍需要较多 ODE steps,少步生成还依赖未来的 distillation。第三,OWT 生成样本的 entropy 偏低,作者也承认这可能反映全局词频偏置,仍需要更细的质量分析。

这篇论文最值得学习的地方,不是某一个指标刷新,而是它把连续扩散语言建模中几个原本分散的问题连成了闭环:如何训练、如何评估、如何调度噪声、如何采样、如何避免 embedding collapse。对于关注 diffusion LLM、非自回归生成、可编辑文本生成和少步生成的人来说,LangFlow 是一篇值得重点看的基础论文。

Dolphin-CN-Dialect汉语多方言语音识别模型

  • Github:https://github.com/DataoceanAI/Dolphin
  • ModelScope:https://modelscope.cn/organization/DataoceanAI
  • HuggingFace:https://huggingface.co/DataoceanAI
  • 技术报告: http://arxiv.org/abs/2605.08961

Dolphin-CN-Dialect 是由 Dataocean AI 与清华大学联合开发的多方言语音识别(ASR)模型,专注于中文方言识别及实际部署场景。相较于之前的 Dolphin 系列,Dolphin-CN-Dialect 在分词器设计、方言均衡训练、流式处理能力、热词偏置以及部署效率等方面均实现了显著改进。

该模型支持普通话及 22 种中文方言,同时保留了 Dolphin 系列原有的多语言 ASR 能力。Dolphin-CN-Dialect 同时支持流式与非流式推理,可在实时转录和工业级语音识别系统等对延迟敏感的应用中实现高效部署。

通用语音识别模型在普通话上表现越来越好,但面对四川话、吴语、闽南语、上海话、温州话等方言或强口音语音时,错误率仍然很高。Dolphin-CN-Dialect 的目标不是单纯堆大模型,而是在较小参数规模下,把中文多方言识别、流式推理、热词增强和部署效率做成一个实用系统。

论文的核心结论可以概括为:通过温度采样缓解方言数据长尾,通过中文字符级 tokenizer 改善 CTC-AED 对齐,通过流式/非流式统一推理与热词增强提升落地能力,Dolphin-CN-Dialect-0.4B 在多方言平均 CER 上达到 5.74%,在 sub-1B 模型组里明显优于 Paraformer、SenseVoice、Qwen3-0.6B 和 FunASR-Nano。

1. 背景:中文 ASR 的难点不只是普通话

近几年 ASR 的主流路线大致包括三类:自监督语音模型、LLM 集成式模型,以及 Whisper 风格的大规模监督或弱监督序列到序列模型。这些模型在公开普通话测试集上已经很强,但真实应用中的中文语音远比标准普通话复杂:说话人可能带有明显地区口音,甚至直接使用方言;语音长度、录音设备、噪声环境、说话风格也高度不一致。

报告指出,一个关键问题是训练数据的长尾分布。标准普通话数据通常占主导,低资源方言数据远少于普通话。如果按原始数据比例训练,模型会过度偏向普通话;如果简单平均采样每个方言,又会过度重复少量方言样本,带来过拟合。Dolphin-CN-Dialect 的数据采样策略就是围绕这个矛盾设计的。

2. 方法总览:不是换骨干,而是补齐中文方言工程链路

Dolphin-CN-Dialect 基本沿用 Dolphin 的核心 CTC-AED 架构与训练配置。真正的改动集中在几个工程层面:数据采样、tokenizer、训练稳定性、流式推理、热词增强和部署优化。这个取向很重要,因为报告关注的是“能不能在真实中文多方言场景中稳定工作”,而不是只在某一个标准 benchmark 上刷分。

作者列出的关键改进包括:用温度采样平衡普通话和低资源方言;将词表从 40,000 缩减到 18,173;中文采用字符级建模,英文和其他拼音文字采用 BPE subword;额外设计方言/地区 token;支持 streaming 和 non-streaming;提供 encoder-level contextual biasing 与 prompt-based hotword biasing 两种热词方案。

3. 数据采样:用温度系数处理长尾方言

论文先定义了两种极端采样策略。第一种是自然采样,即第 i 个数据集的采样概率与它的数据量成正比:

\( p_i=\frac{n_i}{\sum_j n_j} \)

这种方式保留了原始分布,但会导致普通话占比过高,低资源方言曝光不足。第二种是均匀采样,每个方言或数据集概率相同:

\( p_i=\frac{1}{N} \)

均匀采样能显著增加低资源方言的训练机会,但会反复采样极小数据集,容易过拟合,也可能损害普通话和整体泛化。Dolphin-CN-Dialect 采用第三种折中方式:温度采样。

\( p_i=\frac{n_i^{\alpha}}{\sum_j n_j^{\alpha}} \)

其中 n_i 是第 i 个数据集大小,α 位于 0 到 1 之间。α=1 时退化为自然采样,α=0 时变成均匀采样。取中间值可以提升低资源方言采样概率,同时保留高资源普通话数据的影响。报告称,这一策略带来了 38% 的方言识别准确率提升和 16.3% 的整体 CER 相对下降,普通话性能只出现约 0.2% 的边际退化。

4. Tokenizer:中文用字符级,方言用可扩展 token

Tokenizer 是这篇报告里容易被低估的一部分。Dolphin-CN-Dialect 将词表从 40,000 降到 18,173。对中文,报告采用字符级建模,因为中文字符天然适合 CTC-AED 的单调对齐;对英文和其他拼音文字,则继续采用 BPE subword,以平衡词表规模和表达能力。

此外,模型引入了结构化特殊 token,包括任务 token、结束 token、时间戳 token、方言/地区 token,并预留 80 个额外方言 token 槽位。这意味着后续如果要支持更细粒度的地区变体,不需要完全重做 tokenizer。这是一个明确面向可扩展部署的设计。

5. 热词增强:同时做 encoder-level 和 prompt-based biasing

实际 ASR 系统经常需要识别专有名词、人名、地名、产品名、术语等热词。报告将热词增强分为两条路线。第一条是 encoder-level contextual biasing,用上下文 embedding 在编码器侧引导模型;第二条是 prompt-based hotword biasing,把热词以提示形式交给解码器,使模型在生成时更偏向这些词。

这两种方式各有取舍。encoder-level 方法更稳定、可控,适合常规热词增强;prompt-based 方法更直接,尤其适合长尾或罕见热词,但也更依赖解码器对提示的利用能力。报告分别在 AISHELL 和 CommonVoice 构造热词测试集,并统计 WER、BWER、UWER 和 RER。

6. 实验结果:0.4B 模型在方言上很有竞争力

多方言 CER 是这篇报告最关键的结果之一。下表摘取平均 CER 与几个代表模型,数值越低越好。

模型参数量多方言平均 CER说明
Paraformer_zh220M22.76传统中文 ASR baseline
SenseVoice-S234M18.80小型开源 ASR 模型
Dolphin-CN-Dialect-0.1B0.1B10.46小参数版本
Dolphin-CN-Dialect-0.4B0.4B5.74sub-1B 组最佳
Qwen3-0.6B0.6B12.74更大但方言平均不如 Dolphin-CN-Dialect
FunASR-Nano-25120.8B12.73sub-1B 对比模型
FireRed-AED1.2B6.85billion-scale 组最佳之一
Qwen3-1.7B1.7B10.04大模型对比
FireRed-LLM8.3B7.17大参数 LLM-ASR 对比
多方言平均 CER 摘要。Dolphin-CN-Dialect-0.4B 在 sub-1B 组取得最低平均 CER,甚至优于部分 billion-scale 模型。

从分方言结果看,Dolphin-CN-Dialect-0.4B 在台湾普通话、四川话、吴语、闽南语、上海话、甘肃、山东、云南、河北、安徽、辽宁、福建、湖南、温州、湖北、河南、天津、陕西、宁夏等多数方言/地区测试上都取得 sub-1B 组最优。它不是只在少数方言上提升,而是整体降低了中文区域语音识别错误率。

7. 开放测试集:KeSpeech 和 Common Voice tw

报告还在 KeSpeech 和 Common Voice 的台湾中文子集上做了比较。Dolphin-CN-Dialect-0.4B 在两个测试集上分别达到 5.04 和 5.62 CER,在 sub-1B 组中最好。

模型参数量KeSpeech CERCV-tw CER
Dolphin-CN-Dialect-0.1B0.1B8.7978.964
SenseVoice-S234M17.8419.41
Paraformer_zh220M14.468.18
Dolphin-CN-Dialect-0.4B0.4B5.045.62
Qwen3-0.6B0.6B7.075.92
FunASR-Nano-25120.8B7.855.64
FireRed-AED1.2B3.971.61
Qwen3-1.7B1.7B5.733.92
FireRed-LLM8.3B3.584.20
KeSpeech 和 Common Voice tw 结果。Dolphin-CN-Dialect-0.4B 在 sub-1B 模型中表现最强。

8. 热词结果:降低 BWER,但可能牺牲少量 UWER

热词实验中,报告区分整体 WER、热词相关错误 BWER,以及非热词错误 UWER。一个典型现象是:加入热词后,BWER 会显著下降,但 UWER 可能略微上升。这说明热词 biasing 会把模型注意力推向热词,提升专名和关键词召回,但也可能带来少量非热词误识别。

数据集方法无热词 WER有热词 WERRER
AISHELLDolphin-CN-Dialect encoder-level attention1.201.099.20%
AISHELLDolphin-CN-Dialect encoder-level rescoring1.231.1010.6%
CommonVoiceDolphin-CN-Dialect encoder-level attention7.546.957.8%
CommonVoiceDolphin-CN-Dialect encoder-level rescoring7.637.037.9%
AISHELLDolphin-CN-Dialect prompt-based1.261.1111.9%
CommonVoiceDolphin-CN-Dialect prompt-based7.116.0814.5%
热词增强结果摘要。prompt-based 方法在 CommonVoice 长尾热词场景上相对收益更高。

9. 工程问题:流式模型的 CTC 删除错误

报告专门提到一个工程问题:流式模型在 WenetSpeech 上出现 CTC decoding degradation,表现为删除错误率偏高,也就是模型更容易漏掉 token。作者通过消融发现,根因与训练和测试语音长度分布不匹配有关:训练集中短语音不足,而测试集包含大量短音频。

解决办法不是改网络,而是改数据:增强短语音样本覆盖,使模型在训练时见到更多短时长输入。这一点很工程化,但很重要。ASR 系统的真实性能经常被数据分布问题限制,而不是被模型结构本身限制。

Dolphin-CN-Dialect 的贡献不在于提出一个全新的 ASR backbone,而在于把中文多方言 ASR 里容易被忽略的实际问题系统处理了一遍:长尾采样、中文字符级对齐、方言 token 扩展、流式推理、热词增强、短语音覆盖和部署优化。对中文 ASR 来说,这些问题往往比单纯扩大模型更关键。

从结果看,0.4B 版本是一个比较实用的平衡点。它在多方言平均 CER 上达到 5.74,在 KeSpeech 和 CV-tw 上也明显优于其他 sub-1B 模型。对需要中文普通话、方言、口音、热词和低延迟同时兼顾的应用,这类设计比一个单纯“更大”的模型更有部署价值。

11. 总结

Dolphin-CN-Dialect 是一个面向中文多方言真实场景的 ASR 技术报告,它用温度采样解决方言数据不均衡,用中文友好的 tokenizer 改善对齐和表达,用热词增强覆盖专名长尾,并在较小参数规模下取得了很有竞争力的多方言识别效果。

基于 OpenRLHF 的大模型强化训练

OpenRLHF代码细节

https://zhuanlan.zhihu.com/p/12871616401

训练入口

ppo_ray相关的训练入口在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/cli/train_ppo_ray.py

在main中我们启动了driver进程,并执行训练函数train(args),这里主要做了如下几件事:

  • 在ray集群上部署Actor/Ref/Critic/RM实例
  • 在ray集群上部署vllm_engines实例
  • 配置Actor和vllm_engines之间的通讯,用于传递权重
  • 训练Actor和Critic模型

我们依次来解读这几个关键步骤。同时为了在表述上消除歧义,我们接下来谈到“Actor”时,会使用Ray-Actor和PPO-Actor来做区分,从之前的介绍中可知,Ray-Actor是指部署在Ray集群中的远端class,PPO-Actor/Ref/Critic/RM都属于Ray-Actor。

部署Actor/Ref/Critic/RM实例

(1)非共同部署

针对多个node的情况,我们以PPO-Actor为例,看代码是如何将其部署到Ray集群上的。

  • PPORayActorGroup创建在driver进程上,可将它理解成一种部署方案,专门负责部署PPO中的4类模型
    • PPORayActorGroup中维护着self._actor_handlers,它是一个List[ray.actor.ActorHandle],列表中每个元素表示某个远端Ray-Actor的引用,而这个远端Ray-Actor可以是PPO-Actor/Ref/Critic/RM实例。如前文所说,我们可以在ray集群中的任何位置调用这个handler,来对相应的远端Ray-Actor执行操作。
    • 在本例中,我们创建了4个Ray-Actor(1个master-actor,3个worker_actor)。每个Ray-Actor都运行在一个worker进程中。在创建Ray-Actor的同时,我们也会去修改worker进程的环境变量。后续当我们在这些worker进程中启动ds_zero相关的分布式配置时,ds会读取这些环境变量信息,这样我们就知道哪些Ray-Actor同时又构成ds中的数据并行组。
    • 使用PPORayActorGroup部署模型实例的代码如下:
model = PPORayActorGroup(
        # 为部署该模型的全部实例,我们想用多少台node,例如本例中为2
        args.actor_num_nodes,
        # 为部署该模型的全部实例,我们每台node上想用多少gpu,例如本例中为2
        args.actor_num_gpus_per_node,
        # Actor/Critic/Reward/ReferenceRayActor
        ActorModelRayActor, 
        # pg可理解为,在ray cluster中锁定/预留一片资源,然后只在这片资源上部署该模型全部实例。
        # (pg维护在Head Node的GCS上,参见3.3)
        # 例如本例中,pg锁定的资源为node0 gpu0/1, node1 gpu0/1,
        # 我们只在上面部署ActorModelRayActor全部实例
        pg=pg,
        # 当我们在pg指向的预留资源中分配模型实例时,再进一步指定每个实例占据一张gpu的多少部分
        # 等于1说明每个实例占满一张gpu,即“非共同部署”
        # 小于1说明每个实例只占部分gpu,即“共同部署”,例如PPO-Actor/Ref共同部署在一张卡上
        num_gpus_per_actor=0.75 if pg else 1,
    )

ActorModelRayActor创建在远端worker进程上,是Ray-Actor。它包含了设置ds_zero分布式环境、加载模型权重、数据集准备、optimizer/scheduler准备、训练等一系列操作。

共同部署

针对下图的情况,我们以PPO-Actor为例,看代码是如何将其部署到Ray集群上的

  • PPORayActorGroup:在driver进程上创建2个PPORayActorGroup,分别管理PPO-Actor,PPO-Ref的部署
  • 使用actor_model = PPORayActorGroup(..., pg = pg, num_gpus_per_actor=0.75)创建PPO-Actor部署方案实例;使用ref_model = PPORayActorGroup(..., pg = pg, num_gpus_per_actor=0.25)创建PPO-Ref部署方案实例
  • 这里,两个方案实例使用的pg都是同一个,即这个pg都指向“1台node,每台node 8张卡”这片预留好的资源。
  • num_gpus_per_actor = 0.75/0.25是一种创建trick,虽然我们的最终目的是为了让PPO-Actor和PPO-Ref对半分一张卡(对半=共享,不是指显存上对半分),但是:
    • 假设设置为0.5,当我们实际部署ActorModelRayActor时,Ray先在单卡上部署1个ActorModelRayActor实例,当它准备部署第二个ActorModelRayActor实例时,它发现由于每个实例只占0.5块卡,因此完全可以把第2个实例接着第1个实例在同一张卡上部署,这样就导致最终无法让PPO-Actor和PPO-Ref共享一张卡
    • 假设设置0.75,当我们在单卡上部署完1个ActorModelRayActor实例后,ray发现单卡剩下的空间不足以部署第2个ActorModelRayActor实例,所以就会把第二个实例部署到别的卡上,这样最终实现PPO-Actor和PPO-Ref共享一张卡
    • 所以,这个设置是为了达到不同类型模型的实例共享一张卡的目的,而并非真正指模型实际占据的单卡显存空间。
  • 最后,在这一步中,我们对全部ActorModelRayActor共创建8个worker进程,对全部RefenreceModelRayActor共创建8个worker进程,一共创建16个工作进程。

相关代码依然在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/launcher.py#L143

部署vllm_engines实例

  • create_vllm_engines:在driver端,我们通过运行该函数来创建vllm_engines,过程相似于4.2节中的介绍,信息都在图中,这里不赘述。
  • LLMRayActor:worker端Ray-Actor,它主要是把vllm实例进行了一些包装,包装的目的是为了让ds_rank0和all vllm ranks间可以进行PPO-Actor的权重通讯(参见2.1(3))
  • 在上面的例子中,我们会创建4个worker进程(不占gpu资源,只占cpu资源),用于运行管理4个vllm_engine。在每个worker进程内,vllm实例还会创建属于自己的worker进程做分布式运行(这些worker进程会实际占据gpu资源)。

相关代码参见:
https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_engine.py


https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py

ds_rank0与vllm_ranks之间的通讯

PPO-Actor的ds_rank0需要和all_vllm_ranks进行通讯,传递最新的PPO-Actor权重,例如以下ds_rank0要把完整的权重broadcast给16个vllm_ranks:

我们分成如下几步实现这个目标:

(1)创建通信组

Step1:

代码来自:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L58
这段代码执行在PPO-Actor0(ds_rank0)所在的worker进程中。这个worker进程将通过handler引用,触发远端每个vllm_engine上的init_process_group操作,并将ds_rank0纳入通讯组

 # Create torch group with deepspeed rank 0 and all vllm ranks
        # to update vllm engine's weights after each training stage.
        #
        # Say we have 3 vllm engines and eache of them has 4 GPUs,
        # then the torch group is:
        # [    0,      1, 2, 3, 4,  5, 6, 7, 8,  9, 10, 11, 12]
        # |ds rank 0 |  engine-0  |  engine-1  |   engine-2   |
        #
        # For ZeRO-1/2:
        #   1. Broadcast parameters from rank 0 to all vllm engines
        # For ZeRO-3:
        #   1. AllGather paramters to rank 0
        #   2. Broadcast parameters from rank 0 to all vllm engines
        if self.vllm_engines is not None and torch.distributed.get_rank() == 0:
            ...
            # world_size = num_of_all_vllm_ranks + 1 ds_rank0
            world_size = vllm_num_engines * vllm_tensor_parallel_size + 1
            ...
            # =====================================================================
            # 遍历每个vllm_engines,将其下的每个vllm_rank添加进通讯组中,这里又分成两步:
            # 1. engine.init_process_group.remote(...):
            #    首先,触发远程vllm_engine的init_process_group方法
            # 2. 远程vllm_engine是一个包装过的vllm实例,它的init_process_group
            #    方法将进一步触发这个vllm实例下的各个worker进程(见4.4图例),
            #    最终是在这些worker进程上执行“将每个vllm_rank"添加进ds_rank0通讯组的工作
            # =====================================================================
            refs = [
                engine.init_process_group.remote(
                    # ds_rank0所在node addr
                    master_address, 
                    # ds_rank0所在node port
                    master_port,
                    # 该vllm_engine的第一个rank在"ds_rank0 + all_vllm_ranks“中的global_rank,
                    # 该值将作为一个offset,以该值为起点,可以推算出该vllm_engine中其余vllm_rank的global_rank
                    i * vllm_tensor_parallel_size + 1, 
                    world_size,
                    "openrlhf",
                    backend=backend,
                )
                for i, engine in enumerate(self.vllm_engines)
            ]
            # =====================================================================
            # 将ds_rank0添加进通讯组中
            # =====================================================================
            self._model_update_group = init_process_group(
                backend=backend,
                init_method=f"tcp://{master_address}:{master_port}",
                world_size=world_size,
                rank=0,
                group_name="openrlhf",
            )
            # =====================================================================
            # 确保all_vllm_ranks都已添加进通讯组中
            # =====================================================================
            ray.get(refs)

Step2:

代码来自:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py#L11
这段代码实际运行在每个vllm_engine(即每个包装后的vllm实例)下的worker进程内。例如tp_size=2,那么每个vllm实例下就有2个worker进程,这两个worker进程都会运行这段代码

class WorkerWrap(Worker):
    def init_process_group(self, master_address, master_port, rank_offset, world_size, group_name, backend="nccl"):
        """Init torch process group for model weights update"""
        assert torch.distributed.is_initialized(), f"default torch process group must be initialized"
        assert group_name != "", f"group name must not be empty"
        # =====================================================================
        # torch.distributed.get_rank(): 在当前vllm_engine内部的rank,
        #                               例如在tp_size = 2时,这个值要么是0,要么是1
        # rank_offset:当前vllm_engine中的第一个rank在“ds_rank0 + all_vllm_ranks"中的global_rank
        # 两者相加:最终得到当前rank在“ds_rank0 + all_vllm_ranks"中的global_rank
        # =====================================================================
        rank = torch.distributed.get_rank() + rank_offset
        self._model_update_group = init_process_group(
            backend=backend,
            init_method=f"tcp://{master_address}:{master_port}",
            world_size=world_size,
            rank=rank,
            group_name=group_name,
        )
        ...

(2)_broadcast_to_vllm

构建好通讯组,我们就可以从ds_rank0广播PPO-Actor权重到all_vllm_ranks上了,这里也分成两步。

Step1:PPO-Actor ds_rank0发送权重

代码在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L146
这段代码运行在ds_rank0对应的worker进程中

    def _broadcast_to_vllm(self):
        # avoid OOM
        torch.cuda.empty_cache()
        model = self.actor.model.module
        count, num_params = 0, len(list(model.named_parameters()))
        for name, param in model.named_parameters():
            count += 1  # empty_cache at last param

            # Fire all vllm engines for broadcast
            if torch.distributed.get_rank() == 0:
                shape = param.shape if self.strategy.args.zero_stage != 3 else param.ds_shape
                refs = [
                    # 远端vllm_engine的每个rank上,初始化一个尺寸为shape的empty weight张量,
                    # 用于接收广播而来的权重
                    engine.update_weight.remote(name, dtype=param.dtype, shape=shape, empty_cache=count == num_params)
                    for engine in self.vllm_engines
                ]

            # For ZeRO-3, allgather sharded parameter and broadcast to all vllm engines by rank 0
            # ds_rank0发出权重(视是否使用zero3决定在发出前是否要做all-gather)
            with deepspeed.zero.GatheredParameters([param], enabled=self.strategy.args.zero_stage == 3):
                if torch.distributed.get_rank() == 0:
                    torch.distributed.broadcast(param.data, 0, group=self._model_update_group)
                    ray.get(refs) # 确保所有vllm_ranks接收权重完毕

Step2: 各个vllm_ranks接收权重

代码在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py#L29
代码运行在每个vllm_engine(即每个包装后的vllm实例)下的各个worker进程中。例如tp_size = 2,那么每个vllm实例下有2个worker进程,这2个worker进程都会运行这段代码。

 def update_weight(self, name, dtype, shape, empty_cache=False):
        """Broadcast weight to all vllm workers from source rank 0 (actor model)"""
        if torch.distributed.get_rank() == 0:
            print(f"update weight: {name}, dtype: {dtype}, shape: {shape}")

        assert dtype == self.model_config.dtype, f"mismatch dtype: src {dtype}, dst {self.model_config.dtype}"
        # 创建同尺寸空张量用于接收ds_rank0广播来的权重
        weight = torch.empty(shape, dtype=dtype, device="cuda")
        # 接收权重
        torch.distributed.broadcast(weight, 0, group=self._model_update_group)
        # 使用接收到的权重进行更新
        self.model_runner.model.load_weights(weights=[(name, weight)])

        del weight

 PPO-Actor/Critic Training

正如2.1(4)中所说,我们将部署在ray集群上的PPO-Actor/Ref/Critic/RM实例们进行分组,每组分别负责一份micro-batch的训练,上图刻画了某个组内的训练流程。一组内的训练流程发起自PPO-Actor实例(fit方法),注意不同颜色的worker0表示的是不同工作进程。共分成如下步骤执行。


Step1:发送prompts,并从vllm_engine上收集(prompt, response)。

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L627



Step2:从Ref/Reward/Critic上收集并处理exps

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L492



Step3: 确保将处理后的exps传送给Critic,并行执行Actor和Critic的训练

将exps传送给Critic:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L470
Actor训练:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L125
Critic训练:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L122
我们在Actor实例所在的worker进程上出发Actor和Critic的训练。以上代码只给出了训练入口,更多细节需要顺着入口去阅读。



Step4:vllm_engine权重更新。

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L130

RLHF-PPO算法细节

整个RLHF-PPO训练过程大致分成2步:

  • Stage1:收集exps
  • Stage2:使用收集到的exps计算actor_loss和critic_loss,用于训练actor和critic

在OpenRLHF中的核心代码为:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_trainer.py#L19

下面我们分别解读这2个stage的过程

 Stage2:Training

ASR大模型GRPO训练

从一个 SFT(监督微调)得到的 Qwen3-ASR语音识别模型 出发,用 Ray + DeepSpeed + vLLM 缺省(此处未启用 vLLM,由 actor 自身 generate 的方式做 PPO/GRPO 强化学习: 对每条音频采样多个转写结果 → 用一个 远程 Python 奖励函数(CER、关键词、语言一致性、平滑度等多维打分)给每个结果打分 → 用 group_norm(GRPO 组内归一化) 计算优势 → 用 PPO 策略损失 更新 actor(冻结音频 encoder,只训 LLM/adapter 部分)→ 周期性保存 HuggingFace 权重。

整体调用链:

run_train_v2_from_sft.sh                    # 启动脚本:起 Ray 集群 + 提交 job
  └─ openrlhf.cli.train_ppo_ray             # 入口:解析参数、建 Ray actor 组、驱动训练
       └─ ActorModelRayActor (ray/ppo_actor.py)   # actor 进程:建模型、数据、优化器
            └─ ActorPPOTrainer.fit → PPOTrainer.fit  # PPO 主循环
                 ├─ RemoteExperienceMaker            # 采样 rollout + 打分 + 算优势
                 │    ├─ actor.generate               # 生成转写(rollout)
                 │    ├─ reward_func (远程 py)         # 多维奖励打分
                 │    └─ group_norm 优势               # GRPO 组内归一化
                 └─ PPOTrainer.ppo_train              # 用 PolicyLossV3 更新 actor

ASR语音识别-MOE架构论文

MOE- Conformer :

MoE Adapter: https://arxiv.org/pdf/2601.02967

论文:Mixture-of-Expert Conformer for Streaming Multilingual ASR

这篇论文 Mixture-of-Expert Conformer for Streaming Multilingual ASR 讨论的是一个更偏工业部署的问题:如何让一个流式端到端 ASR 模型同时支持多种语言,又不把推理成本推到端侧设备难以承受的程度。作者选择的路线是把 Mixture-of-Experts 放进 Conformer,把模型总容量做大,但每次推理只激活一小部分参数。

摘要:容量变大,激活参数不线性变大

论文提出的模型是在流式多语种 Conformer 中加入 MoE 层。MoE 层由多个 FFN 专家和一个 softmax gate 组成,每个输入帧只选择权重最高的两个专家参与计算。这样,专家总数可以增加,模型总容量也可以增加,但推理时激活的专家数固定,因此计算和激活参数不会随专家数量线性增长。

论文中的 gate 先对第 l 层输入 x 做线性映射,再通过 softmax 得到专家权重:

\( g_l=\mathrm{Softmax}(W_l\cdot x) \)

随后只取 top-2 expert,并把两个 expert 的输出按 gate 权重加权求和:

\( y=\sum_{i=1}^{2}g_{l,i}\cdot e_{l,i} \)

实验覆盖 12 个语言 locale。相对于 180M 参数的多语种 cascaded Conformer baseline,MoE-End 模型把平均 WER 从 11.33 降到 9.98,约 11.9% 相对改善。与同等总规模的 dense baseline 相比,MoE 达到类似 WER,但推理激活参数约为 211M,对比 dense 的 400M 更省。再结合多语种 neural LM 做 shallow fusion,平均 WER 还能进一步相对降低约 3%。

引言:多语种统一模型的容量问题

多语种端到端 ASR 的吸引力很直接:用一个模型识别多种语言,降低维护和部署复杂度。过去几年,CTC、LSTM、attention-based 模型以及流式 RNN-T 都在多语种 ASR 上取得了进展。尤其是端侧流式场景,模型既要有识别质量,又要满足低延迟和低计算。

经验上,模型容量越大,多语种 ASR 越容易受益。Whisper、USM 等大型模型也说明了大数据和大模型对语音识别质量的推动作用。但大模型的代价是训练和推理成本。对端侧应用来说,不能简单把模型扩大到数十亿参数。

已有一些效率方案依赖语言相关组件,比如按语言选择 adapter 或二阶段模型。但流式场景里,稳定预测语言信息本身就不容易,还可能引入错误传播。本文的 MoE 路线更直接:由输入表示动态选择专家,不需要显式语言标签,也不需要 ground-truth language information。

相关工作:专家模型与语言信息

论文把自己的方法放在几类工作之间比较。第一类是 ASR 中已有的 MoE 模型,但许多工作偏单语种,或者需要额外的共享 embedding 网络来做专家路由。第二类是 NLP 和视觉中的 MoE,比如 Switch Transformer 或 DeepMoE,不过这些结构在 ASR 尤其是流式多语种 ASR 中的直接效果并不确定。

第三类是 informed-expert:模型根据已知语言信息选择某个语言专家、adapter 或二阶段模块。这种做法在有可靠语言标签时很自然,但部署中会遇到两个麻烦:语言信息要么来自外部,要么需要模型先预测;一旦预测错了,后面的专家选择也会受影响。本文的 MoE 不显式使用语言信息,routing 由模型从声学表示中学出来。

MoE Conformer:把专家放在 FFN 位置

基础模块是 Conformer。一个 Conformer layer 通常包含两个 FFN、中间的 self-attention 和 convolution。作者把 MoE 主要用于替换 Conformer 里的 FFN,尤其是 end FFN。每个 MoE 层包含多个 FFN 专家和一个 router。

对每一帧表示,router 通过 softmax 计算各专家权重,然后选出 top-2 专家。两个专家的输出按路由权重加权求和,得到该 MoE 层输出。训练和推理都使用 top-2。为了防止专家使用不均衡,论文加入辅助负载均衡损失,让不同专家都有机会被训练到。

这个设计的关键是稀疏激活。比如总共有 8 个、16 个或 24 个专家时,每帧仍只走两个专家。总参数代表模型潜在容量,激活参数代表推理成本;MoE 的优势就在于让这两者不再完全绑定。

实验设置

模型训练使用 RNN-T loss,并额外加入专家负载均衡项。论文中的 auxiliary loss 写成:

\( l_{\mathrm{aux}}=\frac{1}{N}\sum_{i=1}^{N}c_i\cdot m_i \)

其中 m_i 是第 i 个 expert 的平均 gate,c_i 是 top-2 路由中该 expert 被选择的计数。

数据

实验使用 12 个语言 locale:美式英语、中文、法语、德语、日语、美式西班牙语、西班牙西班牙语、阿拉伯语、意大利语、印地语、葡萄牙语和俄语。训练数据来自 Voice Search、YouTube 等多个域,总计约 139.4M 条人工转写匿名语音。不同语言数据量差异很大,从 0.5M 到 25.2M utterances 不等。

测试集来自 Voice Search 流量,每个语言大约 1.4K 到 10K 条 utterances,与训练集不重叠。评价指标是 WER;对中文等语言,论文按字符计算错误率。

模型细节

baseline 是一个语言无关的多语种 transducer 模型,包含 7 层 causal Conformer encoder 和 10 层 non-causal cascaded encoder。causal 部分保证流式,non-causal cascaded 部分提供约 0.9 秒右上下文。模型使用 separate decoders 分别服务 causal 和 non-causal encoder,以获得更好质量。baseline 总参数约 180M。

MoE 改造主要发生在 cascaded encoder。作者尝试替换 start FFN、end FFN 或两者都替换。最多使用 24 个专家,但每次训练和推理只选 top-2。输入特征为 128 维 log-Mel filterbank,经连续帧堆叠形成 512 维输入,并下采样到 30ms 帧率;训练中使用 SpecAug 增强鲁棒性。

结果与比较

消融实验

首先看 MoE 放在哪里。baseline 平均 WER 为 11.33。把 MoE 放在 start FFN,平均 WER 为 10.10;放在 end FFN,平均 WER 为 9.98;两处都放,平均 WER 最好,为 9.54。不过两处都放会增加推理激活参数。作者最终更多采用 MoE-End,因为它在质量和效率之间更均衡。

专家数量方面,8 experts 的 MoE-End 平均 WER 为 9.98;减少到 4 experts 后为 10.40;减少到 2 experts 后为 10.58。由于推理始终激活 top-2,专家总数减少主要影响总容量而不是激活参数。结果说明,额外专家确实被模型利用了。

MoE 层数也很重要。只在隔层使用 MoE,平均 WER 退到 10.50;只在第一个 Conformer 层使用 MoE,为 10.88。即便只加一个 MoE 层也比 baseline 好,但完整地在 end FFN 位置加入 MoE 才能发挥主要效果。

与 dense baseline 和 adapter 比较

与 180M baseline 相比,MoE-End 模型总参数约 400M,推理激活约 211M,平均 WER 从 11.33 降到 9.98。为了排除“只是模型变大”的因素,作者构造了一个同为 400M 的大 dense baseline。这个 dense 模型平均 WER 也是 9.98,但推理需要激活 400M 参数;MoE 只激活 211M,约为 dense 的 53%。

与基于 ground-truth language information 的 adapter 模型相比,MoE 的意义更明显。Adapter 模型依赖真实语言信息选择对应模块;MoE 不需要语言标签,只根据输入动态路由。把 FFN multiplier 调小并增加专家数后,16 或 24 experts 的 MoE 在平均 WER 上接近 adapter,但部署上少了语言信息依赖。

Shallow Fusion 进一步提升

作者还训练了一个 128M 左右的多语种 neural LM,并在解码时做 shallow fusion。文本数据来自 12 种语言的监督训练文本和额外 text-only 数据。加入 LM 后,MoE 模型平均 WER 从 9.98 进一步降到 9.68,约 3% 相对改善。

不过改善并非所有语言都一致。法语收益最大,中文和印地语出现退化。作者推测,中文退化可能与 text-only 数据里混入粤语转写有关;印地语则可能因为 text-only 数据规模很大但与 Search 域不完全匹配,需要更好的过滤策略。

结论:MoE 的部署价值在于“不需要语言标签”

这篇论文展示了 MoE 在流式多语种 ASR 中的一个清晰用途:用更大的总容量提升多语种识别质量,同时通过 top-2 稀疏激活控制推理成本。最重要的是,模型不依赖语言标签完成专家选择,这比 adapter 或 per-language expert 在真实部署中更省心。

从结果看,MoE-End 相对于 baseline 有 11.9% 平均相对 WER 改善;与同规模 dense 模型相比,达到类似质量但只激活约 53% 参数;与语言标签 adapter 相比,质量接近但路由更自动。对端侧、流式、多语种这三个约束同时存在的场景,这种“动态容量”思路很值得继续跟进。

快手论文:Parameter-Efficient Conformers,利用MOE进行模型裁剪

这篇论文 Parameter-Efficient Conformers via Sharing Sparsely-Gated Experts for End-to-End Speech Recognition 关注一个非常实际的问题:Conformer 在端到端语音识别里效果很好,但模型层数和参数量上来之后,训练、部署、端侧运行都会变重。作者的思路不是简单砍层,也不是只做普通的参数共享,而是把“共享 Conformer 块”和“稀疏门控专家”结合起来,让少量参数被重复使用,同时用 MoE 保住表示容量。

摘要:少参数,不想少能力

论文的核心目标是构造一个参数高效的 Conformer 编码器。传统跨层权重共享可以减少参数,但也会压缩模型容量,导致识别性能下降。作者提出的方案是在共享的 Conformer 块中加入 sparsely-gated MoE:第二个前馈网络不再是单一路径,而是一组专家,由路由器选择其中一个专家参与计算。这样总参数增加了一些,但每次前向只激活一个专家,计算量基本保持在非 MoE 模型的水平。

为了让共享块在不同深度位置仍能适配不同层级的表示,论文还让路由器和归一化层保持独立,而不是所有内容都共享。最后,作者用全参数模型作为 teacher,通过隐藏层表示的知识蒸馏进一步弥补共享模型的能力损失。实验显示,在 AISHELL-1 上,最终模型用约三分之一的编码器参数取得了接近全参数模型的 CER。

引言:Conformer 很强,但部署不轻

端到端 ASR 中,Transformer 和 Conformer 已经是很常见的编码器选择。Conformer 在 Transformer 的全局建模基础上加入卷积模块,更适合语音这种既有长程依赖、又有局部结构的序列。相对位置编码、Macaron 风格 FFN、卷积增强等设计,都让它在语音识别中表现稳定。

问题在于,这类模型往往参数冗余。直接堆很多层可以换来更强表达,但也带来显存、存储和推理成本。已有工作会通过跨层共享参数降低模型规模,类似让同一个 block 被重复调用多次。这个办法省参数,但副作用也明显:自由参数少了,模型容量下降,性能容易掉。

作者的切入点是:既然共享会损失容量,那就在共享块内部引入 MoE 来补容量;既然 MoE 可以稀疏激活,那就只让少数专家参与一次前向,避免计算量跟着总参数线性增长。这个组合特别适合“参数少、计算不能太贵”的场景。

背景:Conformer Seq2Seq ASR

论文使用的是 attention-based encoder-decoder 框架。编码器把声学特征序列变成高层表示,解码器按 token 逐步生成文本序列,训练时优化负对数似然,推理时用 beam search 找更可能的输出。

论文中先把 AED 的逐 token 预测概率写成下面这个形式,其中 y<s 表示当前位置之前的 token 前缀:

\( P(y_s \mid y_{<s}, x)=\mathrm{Trfm}(y_{<s},x) \)

对应的最大似然训练目标,也就是负对数似然损失为:

\( L_{\mathrm{nll}}(\theta)=-\frac{1}{S}\sum_{s=1}^{S}\log P(y_s\mid y_{<s},x) \)

Conformer 块由两个 FFN、一个多头自注意力模块和一个卷积模块组成。两个 FFN 采用半步残差风格,注意力负责长程依赖,卷积负责局部模式。本文的 MoE 改造发生在第二个 FFN:作者把它替换成一个稀疏门控的专家集合,也就是 MoE-Conformer block。

论文把一个 MoE-Conformer block 的计算写成四步。最后一步中,第二个 FFN 被替换成 MoE 版本:

\( \begin{aligned} z_t^{(1)} &= z_t + \frac{1}{2}\mathrm{FFN}(z_t),\\ z_t^{(2)} &= z_t^{(1)} + \mathrm{MHSA}(z_t^{(1)}),\\ z_t^{(3)} &= z_t^{(2)} + \mathrm{Conv}(z_t^{(2)}),\\ \hat{z}_t &= \mathrm{LayerNorm}\left(z_t^{(3)}+\frac{1}{2}\mathrm{FFN}^{(\mathrm{MoE})}(z_t^{(3)})\right). \end{aligned} \)

方法:共享稀疏门控专家

Conformer 参数共享

作者把连续的 C 个 Conformer 块看作一组,再堆叠 G 组。不同组中相同位置的块共享参数,相当于一组块被递归调用 G 次。这样做的好处很直接:如果想要 12 次变换,不一定真的保存 12 套编码器参数,可以用更少的块反复计算。

但是共享不是白来的。共享块在浅层和深层面对的表示分布不一样,如果完全用同一套参数、同一套路由、同一套归一化统计,模型会很难同时适配不同深度的表示。因此后面两个设计,也就是独立路由器和独立归一化,就变得很关键。

MoE 动态路由

MoE 模块由 E 个并行 FFN 专家和一个 router 组成。对每个时间步的表示,router 输出各专家的概率,论文采用 top-1 选择,只激活得分最高的专家。也就是说,虽然模型里存着多个专家参数,但每次计算只走其中一个 FFN。

top-1 MoE 的路由过程如下。router 先产生各 expert 的 gate 分数,再选择最大分数对应的 expert:

\( \begin{aligned} g &= [g_0,\cdots,g_{E-1}]=\mathrm{softmax}(\mathrm{router}(z_t^{(3)})),\\ i^* &= \arg\max_{0\le i\le E-1} g_i,\\ \mathrm{FFN}^{(\mathrm{MoE})}(z_t^{(3)}) &= g_{i^*}\mathrm{FFN}_{i^*}(z_t^{(3)}). \end{aligned} \)

这个设计把“容量”和“计算”部分解耦:总参数更多,潜在表达空间更大;但激活参数不增加太多,推理计算仍接近普通 FFN。为了避免所有样本都挤向同一个专家,作者加入 load balancing loss,同时在训练时给 router 加高斯噪声,让专家选择更分散。

负载均衡损失用于鼓励 expert 被更均匀地使用:

\( L_{\mathrm{balance}}=E\sum_{i=0}^{E-1}f_i\bar{g}_i \)

独立路由器与归一化

论文没有把所有 MoE router 都一起共享,而是让每个 MoE 模块拥有自己的 router。直觉上,同一个共享块在第 1 次、第 6 次、第 12 次递归调用时,输入表示已经处在不同层级;如果路由路径完全一致,就会限制专家选择的灵活性。

归一化层也类似。LayerNorm、BatchNorm 的统计和缩放偏移参数对表示分布很敏感。作者让归一化模块保持独立,使不同层级的表示能够维持各自合适的统计状态。论文还把归一化中的 scale 和 offset 看作一种轻量 adapter,用很少参数增强共享块的适配能力。

隐藏层知识蒸馏

共享模型再聪明,毕竟参数少。作者用全参数 Conformer 编码器作为 teacher,让共享模型的编码器输出尽量接近 teacher 的隐藏表示。这里不是只蒸馏最终预测分布,而是直接约束隐藏 embedding 的 L2 距离。这样做的目的,是让小模型学习 full model 的中间表征轨迹。

hidden embedding 蒸馏损失直接约束 student encoder 输出 h_t 与 teacher encoder 输出 h_t' 的距离:

\( L_{\mathrm{kd}}=\frac{1}{T}\sum_{t=0}^{T-1}\lVert h_t-h_t’\rVert_2 \)

训练目标

最终损失由三部分组成:主任务的负对数似然、MoE 的负载均衡损失、隐藏层知识蒸馏损失。负载均衡项负责让专家不塌缩,蒸馏项负责让共享模型贴近全参数 teacher。论文还在实验中加入 CTC loss 来辅助对齐。

\( L=L_{\mathrm{nll}}+\frac{\alpha}{C}\sum L_{\mathrm{balance}}+\beta L_{\mathrm{kd}} \)

这里 C 是 MoE module 的数量,αβ 分别控制负载均衡损失与蒸馏损失的权重。

与已有工作的关系

MoE 常被用来扩大模型容量,尤其是在 NLP 大模型里,通过条件计算扩展到很大的参数规模。但这篇论文不是追求超大规模,而是把 MoE 当作参数高效工具:共享专家、重复使用专家,让少量模块发挥更大作用。

跨层权重共享也不是新想法,ALBERT、Universal Transformer 以及若干 ASR 工作都用过类似机制。本文的不同点在于,它没有只做朴素共享,而是在共享结构里加入稀疏专家,同时让 router 和 normalization 独立,从而减少共享带来的容量和分布适配问题。

实验:

实验设置

实验使用 AISHELL-1 普通话语音识别数据集:约 150 小时训练语音、18 小时开发集、10 小时测试集。输入特征为 80 维 FBANK,窗口 25ms、步长 10ms,并使用全局 CMVN、速度扰动、SpecAugmentation 和 time stretch 等增强手段。词表包含 4235 个中文字符以及起止符号。

模型前端是两层 CNN subsampling,把帧率降到 25Hz。编码器维度为 256,MHSA 使用 4 个头,卷积核大小 15,FFN 中间维度 1024。MoE-Conformer 的第二个 FFN 使用 4 个专家,解码器是 4 层 Transformer。训练 80 个 epoch,使用 PyTorch 和 FastMoE 实现。

结果与分析

主表里,全参数 C12 编码器参数量为 21.58M,测试集 CER 为 4.93。最终的 C2-MoE4-G6-KD 只有 6.95M 编码器参数,测试集 CER 为 5.03。换句话说,它用大约三分之一的编码器参数,做到了非常接近 full-parameter 模型的结果。

消融实验显示,单独减少块数会明显损伤效果,例如 C2 的测试 CER 为 6.50;加入 MoE 后,C2-MoE4 降到 6.22,说明专家机制确实补了一部分容量。再加入跨层共享递归计算后,C2-G6 为 5.62,而 C2-MoE4-G6 达到 5.08,说明“共享 + MoE”的组合比任一单独机制更有价值。

独立路由器和归一化的作用也很明显。C2-MoE4-G6 如果全部共享,测试 CER 为 6.00;只让归一化独立,降到 5.21;归一化和 router 都独立后,进一步到 5.08。这说明共享模型最怕的不是参数少本身,而是不同深度表示被迫使用完全相同的适配路径。

知识蒸馏带来的提升相对温和,但在 C2-MoE4-G6 上仍把测试 CER 从 5.08 推到 5.03。作者还通过输入输出 L2 距离观察模型内部变化:带独立 router 和 normalization 的共享模型更接近全参数 C12 的变化曲线,而全共享模型曲线更不稳定。

结论与未来方向

这篇论文的价值在于,它给出了一个较完整的参数高效 Conformer 方案:用跨层共享压缩参数,用稀疏 MoE 恢复容量,用独立路由器和归一化适配不同深度表示,再用隐藏层蒸馏补齐小模型表现。最终模型在 AISHELL-1 上以约三分之一编码器参数接近全参数模型。

它也留下了自然的后续问题:方法是否能在更大规模、多语种或更复杂的 ASR 数据集上保持优势?能否迁移到 RNN-T、CTC 或其他端到端 ASR 架构?从工程角度看,这类方案的吸引力很强,因为它不是单纯追求小模型,而是在“参数、计算、表达容量”之间做更细的拆分。

MoEAdapter for Large Audio Language Models: Sparsity, Disentanglement, and Gradient-Conflict-Free

这篇论文 MoE Adapter for Large Audio Language Models: Sparsity, Disentanglement, and Gradient-Conflict-Free 的问题意识很明确:大语言模型要理解真实世界,不能只看文本,音频是很重要的输入模态。但音频并不是一种均匀信号。语音、音乐、环境声承载的信息结构不同,如果用一个 dense adapter 把所有音频都压进同一个文本 embedding 空间,很容易出现参数更新方向互相冲突。

摘要:用专家分工处理异质音频

论文提出 MoE-Adapter,用稀疏 Mixture-of-Experts 替代传统的 dense audio adapter。它不是让所有音频 token 都通过同一套 FFN,而是用动态门控把 token 路由到若干专门专家,同时保留一定共享能力来捕捉全局上下文。这样,语音、音乐、环境声等不同属性可以在不同专家子空间中被建模,从而减轻梯度冲突。

实验基于 Qwen3-1.7B 骨干,音频前端使用 Whisper-VQ tokenizer 和 Whisper Encoder。作者在相同参数预算下比较 dense adapter 和 MoE-Adapter:两者总参数约 94.4M,但 MoE 因稀疏激活,推理时只激活约 70.8M 参数。结果显示,MoE-Adapter 在 MMSU、OBQA、MMAU 等音频理解和推理任务上均优于 dense baseline,并减少音频输入与文本输入之间的 modality gap。

引言:音频不是一种单一分布

大语言模型在文本推理上已经非常强,但只处理文本会限制它们感知现实世界的能力。音频包含人类说话、环境声音、音乐和情绪韵律等信息,是多模态智能绕不开的一环。当前许多大音频语言模型的主流做法,是加一个 adapter,把声学特征投影到 LLM 的文本语义空间里。

问题在于,很多 adapter 是 dense、参数共享的:所有音频都经过同一套投影层。这隐含一个假设,即不同音频类型可以被同一种映射均匀处理。作者认为这个假设过强。语音主要承载语义和语言结构,音乐更关注节奏、旋律和情感,环境声又有自己的声学模式。它们在表示空间中可能位于不同流形。

如果一个 dense adapter 同时学习这些相互差异很大的目标,不同数据类型的梯度可能朝相反方向更新同一组参数。这就是论文强调的 gradient conflict。MoE-Adapter 的贡献,就是用动态专家路由把这些冲突拆开:相似属性共享专家,冲突属性进入不同专家。

相关工作

大音频语言模型

早期音频问答或语音交互系统常采用级联管线:先 ASR 转文字,再交给 LLM。这样的系统容易受到识别错误传播影响,也会丢失语调、情绪、音乐和环境声等非文字信息。后来的端到端 LALM 通过可学习 adapter,把声学特征映射到文本空间,让 LLM 直接条件化在音频表示上。

现有 adapter 大致分为 Q-Former 类和 linear projector / MLP projector 类。后者结构简单、效率高,因此被许多最新模型采用。但这种全局共享投影层难以面对音频内部的分布差异。本文正是针对这个瓶颈,把稀疏 MoE 引入 audio-text alignment 阶段。

MoE 架构

MoE 的基本思想是让不同专家处理不同样本或不同 token,通过稀疏门控实现条件计算。它已经在语言模型、多模态模型、视觉语言模型等方向证明了对异质数据和任务冲突的缓解能力。音频领域也开始出现 MoE 相关工作,例如生成、医疗音频特征选择等。

不过,在通用 audio-text alignment 这个环节,主流 LALM 仍大量依赖静态、共享参数 adapter。本文的 MoE-Adapter 不只是借用 MoE 扩容量,而是把 MoE 作为一种“解耦工具”,专门处理音频属性之间的冲突。

方法

整体框架

模型采用类似 Kimi-Audio 的 dual-stream 音频前端:一条路径用冻结 tokenizer 提取离散语义 token,另一条路径用 speech encoder 提取连续声学特征。两类表示经过投影和融合后,进入 adapter。

传统方案会用 dense adapter 把融合音频特征映射到 LLM embedding 空间。本文则用 MoE-Adapter 完成这一步。最终,adapted audio embeddings 与文本 token embeddings 拼接,作为 LLM 的输入,并用标准自回归 next-token prediction 训练。

稀疏 MoE Adapter

Dense adapter 可以看作一个单体 FFN:所有音频 token 都通过同一组权重。作者指出,这种设计强制同一组参数同时容纳异质音频,会形成不必要的优化干扰。

论文先把 dense adapter 写成单体 FFN 投影。给定音频 token x,输出 embedding 为:

\( y=\mathcal{N}\left(W_{d2}\cdot\sigma\left(W_{d1}\cdot\mathcal{N}(x)\right)\right) \)

MoE-Adapter 把单体 FFN 替换成专家集合。每个专家都是轻量 FFN,router 根据输入 token 计算各专家得分,并通过 Top-k 选择保留若干活跃专家。被选中的专家输出按门控权重聚合,形成中间表示。随后再经过输出投影和 LayerNorm,对齐到 LLM embedding 维度,用来替换输入序列中的音频占位 token。

每个 expert 本身也是一个轻量 FFN:

\( E_i(x)=W_{e2}^{(i)}\cdot\phi\left(W_{e1}^{(i)}\cdot\mathcal{N}(x)\right) \)

router 根据 logits s=xW_g 做 Top-k 稀疏选择,再 softmax 得到门控概率:

\( G(x)=\mathrm{softmax}\left(T_k(s)\right),\quad s=xW_g \)

被选中的 expert 输出按 gate 权重聚合,并经过最终投影对齐到 LLM embedding 空间:

\( h_{\mathrm{MoE}}=\sum_{i\in I}G(x)_i\cdot E_i(x) \) \( y_{\mathrm{MoE}}=\mathcal{N}\left(W_P\cdot h_{\mathrm{MoE}}\right) \)

这套机制有两个效果:一是稀疏激活降低推理成本,二是专家分工让不同音频属性进入不同子空间。对于语音、音乐、环境声这种天然异质输入,第二点尤其重要。

训练目标

训练目标由 next-token prediction loss 和 auxiliary load-balancing loss 组成。前者让模型基于音频上下文预测后续文本 token,是主任务;后者用于避免 expert collapse,即所有 token 都涌向少数专家。

总训练目标为 next-token prediction 与负载均衡项的加权和:

\( L=L_{\mathrm{NTP}}+\lambda L_{\mathrm{aux}} \)

其中主任务 NTP loss 写成:

\( L_{\mathrm{NTP}}=-\sum_{t=1}^{T}\log P(y_t\mid y_{<t},X;\theta) \)

负载均衡损失会同时考虑专家的重要性和实际负载,让不同专家都被充分训练。这里有一个微妙的取舍:过强的均衡可能压制某些自然形成的专家偏好,但完全不均衡又会损害高层语义推理的泛化。论文后面的消融和分析专门讨论了这个矛盾。

论文将 expert importance 与 expert load 分别定义为:

\( \bar{P}_e=\frac{1}{B}\sum_{b=1}^{B}p_{b,e} \) \( \bar{f}_e=\frac{1}{B}\sum_{b=1}^{B}r_{b,e} \)

最终 auxiliary loss 为:

\( L_{\mathrm{aux}}=|\mathcal{E}_R|\sum_{e\in\mathcal{E}_R}\bar{P}_e\cdot\bar{f}_e \)

实验

实验设置

LLM 骨干是 Qwen3-1.7B,音频前端使用 Whisper-VQ tokenizer 和 Whisper Encoder。训练语料规模为 40B token,优化器为 AdamW,学习率调度采用 Warmup-Stable-Decay。为了公平比较,dense adapter 与 MoE-Adapter 的总参数预算都限制在约 94.4M。

评测覆盖几类能力。MMAU 用于音频感知和副语言理解,覆盖 speech、sound、music 等场景;VoiceBench 中的 MMSU 和 OpenBookQA 子集用于世界知识和语义推理,它们是从文本推理基准改造来的音频版本。所有评测采用 greedy decoding,避免采样随机性干扰比较。

主结果

在知识推理任务上,MoE-Adapter 明显超过 dense baseline。MMSU 的 audio accuracy 从 35.03 提升到 38.19,OBQA 从 50.10 提升到 53.85。对比文本输入准确率,音频输入仍存在明显 gap,但 MoE 把这个差距分别缩小了约 3.16 和 3.75 个点。

在 MMAU 这类副语言和音频感知任务上,MoE-Adapter 也从 59.79 提升到 61.50。这个提升说明专家路由不仅对知识推理有用,也能帮助模型捕捉更复杂的声学线索。论文强调,MoE 的收益不是单纯参数变多,而是在相近总参数预算下更合理地分配表示能力。

消融实验

专家配置方面,默认的 “8 choose 4” 表现最均衡:MMAU 61.50、MMSU 38.19、OBQA 53.85。把专家数扩大到 “16 choose 4” 反而变差,说明专家总数不是越多越好。把路由变得过稀疏,例如 “8 choose 1”,也会显著伤害音频推理。论文的结论是,专家数量、激活数量和专家容量之间需要平衡,而不是盲目扩某一个维度。

负载均衡损失的消融更有意思。去掉 EBL 后,MMAU 从 61.50 升到 63.01,但 MMSU 和 OBQA 分别下降到 37.37 和 52.31。作者解释说,MMAU 很异质且含有大量低层声学感知样本,不加均衡时 router 会集中使用少数“强专家”,反而有利于这类感知任务;但这会减少专家多样性,损害需要世界知识和语义推理的任务

专家分工与优化动态分析

专家均衡如何影响路由

作者在 MMAU 上分析 speech、sound、music 三类样本的专家激活热力图。结果显示,模型确实学出了模态相关的专家分工:有些专家主要服务单一类别,有些专家在 sound 与 speech 或 sound 与 music 之间共享。值得注意的是,几乎没有专家同时专门服务 speech 和 music。

这个现象符合直觉:环境 sound 和 speech/music 都可能共享一些低层声学特征,因此可以作为“桥”;但 speech 和 music 在时间结构、语义组织上差异更大,不适合强行塞进同一个专家。EBL 并不会消灭这种分工,而是防止少数专家过度支配,保留一定均衡。

梯度冲突与缓解机制

论文用两个指标分析优化过程。第一个是不同音频类别梯度之间的 cosine similarity。dense adapter 中,不同类别的梯度经常出现负相似度,意味着一个类别的更新方向可能伤害另一个类别。MoE-Adapter 则把这些相似度推向更正的方向,说明专家路由减少了破坏性干扰。

第二个是 gradient influence score,用来衡量基于某一任务梯度做更新后,对另一个任务损失是帮助还是伤害。dense adapter 中,speech 的更新会明显伤害 music 和 sound;MoE-Adapter 中,影响分数更多为正,说明它不是简单隔离任务,还能通过共享专家保留有益迁移。例如 speech 对 sound 的更新可以产生正向帮助,而 music 的冲突被更好地隔开。

结论

这篇论文把 MoE-Adapter 定位为解决 LALM 音频异质性的结构工具。相比 dense adapter,它用动态专家分工缓解语音、音乐、环境声之间的梯度冲突,在相近参数预算下提升音频知识推理、副语言理解和跨模态对齐表现。更重要的是,论文不仅给出指标提升,也通过路由热力图、梯度相似度和影响分数解释了为什么 MoE 有效。

局限性

作者也明确指出了几个限制。第一,实验目前只在 Qwen3-1.7B 骨干上验证,方法是否适用于其他 LLM 家族或更大规模模型,例如 70B,还需要实验。第二,论文没有系统研究稀疏路由随训练数据规模增长的 scaling law。第三,当前任务集中在音频理解与推理,没有扩展到生成式音频任务。

附录:超参数和工程含义

附录强调,dense baseline 与 MoE-Adapter 在总参数预算上被严格对齐,约为 94.4M。MoE-Adapter 的活跃参数约为 70.8M,大约是 dense baseline 的 75%。共同音频前端包含 speech encoder、audio hidden projection 和 feature fusion;MoE 端则包含专家集合、gate network 和 aggregation block。

从工程角度看,这个设置很关键。它把论文的结论从“MoE 参数更多所以更强”拉回到“在可比预算下,稀疏专家分工更适合异质音频”。如果未来大音频语言模型要同时处理语音问答、环境声推理、音乐理解和情绪韵律,adapter 层可能不该再是一个单体投影器,而应该具备更细粒度的路由和分工能力。

开源ASR优化指南

文章来源:每周一个大模型应用

Whisper、SenseVoice、sherpa-onnx……开源 ASR 选择越来越多,但真正上线后,你很可能遇到两个经典抱怨:「专有名词老读错」和「实时跟不上说话」。本文把优化手段整理成可执行的决策树与分层机制,帮你少踩坑、少试错。

结论先行:「不够准」和「不够快」是两条优化路线,但底层机制有重叠。准确率优先从音频质量、热词、语言模型、换中文基座到领域微调;速度优先从小模型、INT8 量化、合适运行时(流式用 sherpa-onnx,离线用 faster-whisper)入手。二者通常互相拉扯——没有「又准又快又免费」的万能方案。

一、先分清:你要优化的是哪一类问题

很多团队一上来就换更大的模型,结果延迟翻倍、GPU 成本飙升,准确率却只涨一点点。

其实 ASR 的「不准」和「不快」,背后是完全不同的瓶颈。

▎ 常见现象对照表

●  专有名词、行业词错 → 训练数据里没有,优先热词 / 微调 / 语言模型

●  噪声、远场、混响 → 前端音频差,优先降噪 + VAD + 换模型

●  方言、口音 → 基座覆盖不足,换中文/方言模型或微调

●  延迟高、跟不上说话 → 流式配置或模型太大,小模型 + INT8 + 真流式

●  长音频转写慢 → 非批处理或 CPU 推理,faster-whisper / GPU / 分段并行

准确率和速度通常互相拉扯:模型越大越准但越慢;beam 越大越准但越慢;INT8 更快但可能略损精度。优化前先明确你的主 KPI 是 CER 还是 RTF。

二、五层优化框架:从输入到后处理

不管用哪套开源 ASR,都可以按五层来思考优化路径。

自下而上分别是:改输入、改模型、改解码、改部署、改后处理。

①  改输入:16 kHz 单声道、降噪、VAD 切静音——零成本,often 被忽略

②  改模型:换更强基座(SenseVoice / Qwen3-ASR)或领域微调

③  改解码:beam size、热词偏置、LM 重打分

④  改部署:ONNX + INT8、sherpa-onnx 流式、faster-whisper 批处理

⑤  改后处理:标点模型、ITN 数字规整、自定义词典替换

很多「模型不准」其实是输入音频和训练分布不一致。

先把音频标准化做好,再谈换模型,往往事半功倍。

三、提升识别率的六大机制

下面按「不改模型 → 换模型 → 微调 → 解码 → 后处理」的顺序,从易到难梳理提升准确率的手段。

 1. 热词 / 上下文偏置(最快见效)

机制:在解码时提高特定词(公司名、产品名、人名)的得分权重。

FunASR、WeNet、sherpa-onnx 等均支持,几乎不用重训,改配置即可。

适合词表固定、领域术语多的场景。

▎ 2. 语言模型重打分(LM Rescoring)

机制:ASR 先出 N 个候选(beam search),再用 N-gram 或神经网络 LM 选更「像人话」的结果。

适合同音字、语法约束(如「在/再」「的/地/得」)。

icefall / WeNet 训练链里常见,可导出到 sherpa-onnx 部署。

▎ 3. Prompt / 上下文(大模型 ASR)

Qwen3-ASR、Fun-ASR-Nano 等支持在输入里加提示,例如「语音转写成英文:」或「Speech transcription without text normalization:」。

利用 LLM 的语义先验,约束输出格式和领域。

▎ 4. VAD + 分段

先切掉静音和无效段,只对有效语音做识别,减少「把噪声当字」的幻觉。

FunASR 自带 FSMN-VAD;本地实时工具 asr_tool 用 endpoint 检测句末。

▎ 5. 音频前端处理

●  重采样到 16 kHz 单声道:与模型训练分布一致

●  降噪(RNNoise、DeepFilterNet):远场、会议场景

●  AGC / 音量归一化:避免过小或削波

▎ 6. 领域微调(ROI 通常最高)

用你自己的「音频 + 标注」把模型拉向目标分布。

数据 < 10h 建议热词 + LM;10~100h 可 LoRA / adaptor 微调;100~1000h 微调 encoder + adaptor;> 1000h 可考虑全参。

同一套医疗/法律语料微调后,专有名词准确率 often 明显提升。

四、提升识别速度的五条路径

速度优化和准确率往往是反向的。

实时场景要的是首字延迟和 RTF(实时率),离线场景要的是吞吐。

别用离线大模型硬做流式——延迟会非常高。

模型侧:变小、变轻

●  蒸馏(distil-whisper):大模型教小模型,6~10× 加速,精度略降

●  量化 INT8:权重 8bit,CPU 友好,2~4× 加速

●  换小架构:Zipformer 14M vs 1.7B LLM,数量级差异

▎ 运行时:换引擎

●  sherpa-onnx:CPU 流式、低延迟,Rust 集成,适合桌面实时

●  faster-whisper(CTranslate2):GPU 批处理长音频快

●  whisper.cpp:边缘设备、无 Python

●  vLLM:Qwen3-ASR 等服务化部署

▎ 流式架构(延迟的关键)

真流式 pipeline:麦克风 → 固定 chunk(如 100ms)→ 增量 decode → partial 结果 → endpoint 检测 → final → reset。

chunk_size 越小延迟越低,但 CPU 调度开销上升;num_threads 4~8 常是 CPU 甜点。

▎ 系统级优化

●  GPU / NPU:离线批处理、大模型必备

●  跳过静音(VAD):不算无效段,总耗时下降

●  并行分段:长音频切多段多 GPU 跑

●  减小 beam:beam=1 often 快 2~3×

五、按投入产出排序的推荐

▎ 想提升准确率(从易到难)

①  音频标准化(16 kHz、降噪、VAD)—— 零成本

②  热词 / Prompt —— 几小时配置

③  调 beam + 加标点/ITN —— 一天内

④  换更强的中文基座(SenseVoice / Qwen3-ASR)—— 改部署

⑤  LM 重打分 —— 需额外 LM 资源

⑥  领域微调 —— 需标注数据,ROI 通常最高

▎ 想提升速度(从易到难)

①  INT8 量化 + 减 beam —— 立刻见效

②  换 faster-whisper / sherpa-onnx —— 改运行时

③  换小模型 / 蒸馏模型 —— 接受略降精度

④  GPU + 批处理 —— 离线场景

⑤  真流式架构 —— 实时场景必做

  · · ·  

六、场景化落地组合

结合 voice_repo 里的工具链,以下是几种常见场景的组合建议。

▎ 桌面实时中文

准确率:热词 + 更好的ASR模型。

速度:保持sherpa-onnx INT8 真流式。

默认模型 streaming-***-zh-14M INT8,面向 CPU 实时。

▎ 会议录音转写

准确率:SenseVoice / Qwen3-ASR + 标点模型。

速度:faster-whisper GPU 批处理,长音频分段并行。

▎ 垂直领域(医疗 / 法律 / 金融)

准确率:FunASR 微调 + 热词 + LM 重打分。

速度:微调后导出 ONNX 到 sherpa-onnx,接自研服务。

▎ 多语种 / 方言

准确率:Qwen3-ASR + Prompt 约束。

速度:vLLM 服务化,或 0.6B 小模型做边缘部署。

  · · ·  

七、怎么验证「真的变好了」

别凭感觉,用同一套 test set 对比。

固定 100~500 条代表性样本,每次只改一个变量(例如只加热词、只换模型),否则无法判断哪招有效。

●  CER / WER:字/词错误率,中文常用 CER

●  RTF:实时率,< 1 才算实时

●  首字延迟:流式场景的关键指标

●  领域词准确率:单独统计热词表命中率

开源 ASR 的优化不是「换一个更大的模型就完事」,而是按场景选对机制、按数据量选对深度、用指标验证每一步。

总结          
不够准:音频质量 → 热词/LM → 换中文模型 → 领域微调          
• 不够快:小模型 + INT8 + 合适运行时(流式 sherpa-onnx,离线 faster-whisper)          
• 五层框架:改输入 → 改模型 → 改解码 → 改部署 → 改后处理          
• 准确与速度互相拉扯,优化前先明确主 KPI          
• 固定 test set,每次只改一个变量,用 CER/RTF 验证

Mega-ASR 面向“全场景复杂环境”高噪语音识别

Mega-ASR 是一个专门解决”真实世界语音识别翻车”问题的开源框架——它用涵盖54种噪声、回声、丢帧等复合场景的240万条数据训练,让模型在嘈杂现实环境下的词错误率降低30%+,同时大幅减少”听没了”和”乱编内容”这两种高频故障。解决的核心问题是:在各种嘈杂、失真、回声、断连的现实场景下,尽可能准确地把语音转成文字。模型基于 Qwen3-ASR-1.7B进行后训练,通过一套专门设计的数据集和训练方法来强化”恶劣环境下的识别能力”。

一、ASR 在「现实世界环境」为什么不行?

  • 场景覆盖太窄:只解决噪音 / 远场单一问题,真实环境是复合干扰(噪音 + 混响 + 丢包一起上)。
  • 复合鲁棒性缺失: 缺乏对复杂环境的适应性,现实世界中的环境往往是多种因素共同作用的结果,很少模型能同时扛住多种失真叠加。
  • 训练与真实不匹配:训练数据太简单(WER 4%–10%),遇到高难度场景(WER>30%)直接崩

二、数据:Voices-in-the-Wild-2M

大规模、高难度、物理合理的复合声学仿真数据集

现有语音数据集的 3 大致命问题:

  1. 只覆盖单一干扰:噪音 / 混响 / 远场分开做,不模拟真实复合环境
  2. 难度太 “温柔”:平均 WER 只有 4%–10%,训练不出强鲁棒模型
  3. 真实录音太少太贵:收集覆盖所有场景的真实录音成本极高、不可扩

为了推动这一更具挑战性场景下的研究,提出了 Voices-in-the-Wild-2M,一个基于频谱级代码驱动仿真(spectrogram-level code-based simulation)构建的大规模数据集。这种设计使得超大规模数据生成成为可能。

首先识别并定义了 7 类经典的现实声学效应,这些基础效应用于模拟各种物理环境或设备引起的退化现象:

真实退化现象对应 Primitive
背景噪声Additive Noise
延迟反射Echo Delay
房间混响Reverberation
削波失真Nonlinear Distortion
带宽受限Resampling
高频衰减Spectral Filtering
音量不一致Loudness Transformation
丢包/卡顿Frame-level Stutter

设计了专门的频谱处理流水线,持续调整仿真参数,并利用 Qwen3-ASR 的监督微调(SFT)结果进行验证,直到模拟器在真实数据上的表现达到最佳拟合效果。

将这些原子效应组合成 54 种经过 Agent 验证的复杂声学配置,最终生成了 240 万条(2.4M)合成语音样本

与直接枚举各种复杂真实环境不同,将野外环境(in-the-wild)中的语音退化过程划分为三个层级:

  • Primitive Acoustic Effects(基础声学效应)
  • Atomic Acoustic Effects(原子声学效应)
  • Compound Acoustic Scenarios(复合声学场景)

第一层:Primitive Acoustic Effects(基础声学效应)

用 DSP 手段实现最基本的声学退化组件

原子效应核心基元组合模拟真实场景
噪声(Noise)加性噪声 + 响度归一街道、咖啡馆、车内、人群
远场(Far-field)混响 + 低通滤波 + 响度衰减远距离说话、智能音箱远场
遮挡(Obstructed)低通滤波 + 混响 + 衰减隔门、隔窗、口罩、墙后说话
回声 + 混响(Echo&Reverb)强混响 + 回声 + 高通大厅、车库、体育馆、空旷房间
录制染色(Recording)重采样 + 噪声 + 双带通滤波手机外放再录制、设备串音
电子失真(Electronic Distortion)非线性失真 + 低通麦克风过载、削波、劣质录音
传输丢包(Transmission Dropout)帧卡顿 + 响度归一网络丢包、蓝牙不稳、流媒体卡顿

第二层:Atomic Acoustic Effects(原子声学效应)

在中间层,我们利用上述 Primitive Effects 构建了 7 种原子声学效应

Atomic Effect中文
Noise噪声环境
Far-field远场录音
Obstructed遮挡语音
Echo & Reverb回声与混响
Recording录音链路效应
Electronic Distortion电子失真
Transmission Dropout传输丢失

一个 Atomic Effect 并不一定只对应一个 Primitive Effect。而是一个主导 Primitive + 若干辅助 Primitive。

比如:Far-field(远场)真实远场录音不仅仅是声音变小。通常同时具有:

  • 声压衰减(Loudness)
  • 高频损失(Spectral Filtering)
  • 房间混响(Reverb)

第三层:Compound Acoustic Scenarios(复合声学场景)

最高层将多个 Atomic Effects 进行组合,比如视频会议

Far-field + Echo&Reverb + Recording

无论构建 Atomic Effect 还是 Compound Scenario,都保持 Primitive Effect 的固定执行顺序。为的是避免物理上不合理的处理链

关键创新:不是随机乱组合,而是按物理规则合成

组合规则(保证真实不违和)

  • 锚点效应(3 种):远场 / 回声混响 / 遮挡(互斥,不同时出现)
  • 修饰效应(4 种):噪声 / 录制染色 / 电子失真 / 丢包(可叠加)

为了让难度 “均匀且可学习”,团队设计了全局 severity 参数 m ∈ [0,1]

  • 同一个音频里,所有失真共用一个 m
  • 保证:要么整体简单,要么整体难,不会出现 “强混响 + 零噪音” 这种不自然组合

最终选用 Linear 线性分布

  • 简单、中等、困难样本均匀覆盖
  • 训练最稳定、泛化最强

严格过滤保证可学习

  • 剔除 WER > 70% 的样本(太难学不动)
  • 保留物理合理组合
  • 统一响度、统一格式、对齐标注

三、Mega-ASR

 Qwen3-ASR 的基础上开发了 Mega-ASR-Base 模型

1. A2S-SFT:从声学 → 语义递进微调

解决:高失真下「听不清 → 猜不对」的连锁崩溃。分三阶段训练:

  1. 声学感知阶段:编码器 + 对齐器,按难度递进(WER<30% → <50% → <70%)
  2. 语义恢复阶段:冻结声学,只微调 LLM,学会从残缺信号还原语义
  3. 联合对齐阶段:全模块一起微调,声学与语义对齐

2. DG-WGPO:双粒度 WER 门控策略优化

解决:普通 WER 奖励在高失真下失效(只看词错,不管语义崩没崩)。设计两套奖励,按 WER 动态切换:

  • 低 WER(<30%):侧重词级别精细修正(软错误 / 硬错误区分)
  • 高 WER(≥30%):侧重句子级结构恢复(主干语义、长度、最长公共子串)

最终奖励 = 基础规则奖励 + 双粒度动态奖励

3. 环境感知路由(Router)

解决:鲁棒模型在干净音频上略有下降。

  • 训练一个轻量二分类器,判断音频是否恶劣
  • 恶劣 → 走 Mega-ASR
  • 干净 → 走原生 Qwen3-ASR
  • 推理开销 <1%,几乎无感

三、Experiments

Main results 

采用自适应路由的通用 ASR 性能具有竞争力:MEGA-ASR 在干净语音和多语言基准测试上,相较于 Qwen3-ASR、Seed-ASR 和 Kimi-Audio 仍保持极强的竞争力。

声学扰动条件下达到当前最佳鲁棒性:相较于最强基线 Qwen3-ASR,MEGA-ASR 的错误率进一步降低了 17.4%;相较于 Gemini-3-Flash,则降低了 64.5%

在组合式真实环境中的鲁棒性表现更优

在 Voices-in-the-Wild-Bench 基准测试中,MEGA-ASR 在多种真实世界退化条件下均取得了最佳性能,包括:

  • 混合退化(mixed degradations)
  • 远场语音(far-field speech)
  • 录音伪影与设备缺陷(recording artifacts)

Analysis

通过消融实验,我们总结出五个关键观察([Obs.1]–[Obs.5]),涵盖了语义层面收益、训练策略、奖励函数设计以及超参数敏感性等方面。相关证据分别来自表 5–9。下面对各项发现进行详细说明。

[Obs.1] MEGA-ASR 的收益不仅体现在 WER 上,也体现在语义层面指标上

表 7 显示,相比 Qwen3-ASR,MEGA-ASR 在语义层面指标上也取得了持续提升:

  • 漏识内容(Missed Content)从 14.2 降低到 5.9

这表明,MEGA-ASR 的改进不仅仅是降低词错误率(WER),还带来了更高层次的语义和整体理解能力提升,例如:

  • 减少幻觉(Hallucination);
  • 减少整句或整段语音遗漏(Dropped Utterances);

因此,MEGA-ASR 实现的是语义层面和整体层面的质量提升,而不仅是字词级别的识别优化。

[Obs.2] A2S-SFT 与 DG-WGPO 组件的消融分析

在 Voices 和 Noizeus 数据集上,对 A2S-SFT 各阶段以及 DG-WGPO 各组成部分进行了消融实验(表 5)。

  • 分阶段的“声学到语义(Acoustic-to-Semantic)适配”过程是有效且必要的。
  • DAPO 作为强化学习阶段的基础优化框架。
  • 句子级重构奖励对于中高错误率样本尤为关键。

[Obs.3] 基于规则的奖励函数与 LLM Judge 效果相当,但训练成本降低 3.2 倍

规则奖励已经能够充分捕获 LLM Judge 所提供的监督信号。

[Obs.4] 超参数消融实验

动态门控权重 αdyn 语义奖励权重 αs对模型性能的影响(表 8)

αdyn 所控制的权衡关系远比 αs 更敏感。

最终采用:

(αdyn, αs) = (0.6, 0.4)

因为它在所有测试子集上都达到最佳或接近最佳表现。

[Obs.5] 门控阈值 τ 的影响

过高的门控阈值会使门控机制过于严格(over-restrictive gating),从而限制奖励信号的有效传播,最终导致识别性能下降。

通过消融实验,得到以下核心结论:

  1. MEGA-ASR 的收益不仅体现在 WER,还体现在语义完整性与内容保真度上。
  2. A2S-SFT 的渐进式声学→语义适配以及 DG-WGPO 的各奖励组件均对性能提升至关重要。
  3. 规则奖励能够以接近 LLM Judge 的效果实现训练,同时将计算成本降低 3.2 倍。
  4. 动态门控权重 αdyn 是最敏感的超参数,最佳设置为 0.6。
  5. 门控阈值 τ=0.3 能在不同场景下取得最均衡的鲁棒性表现。

ASR大模型发展路线

准确率与速度,ASR 的两条进化路线

Whisper 把开源 ASR 拉到了新高度,但 2025–2026 年的顶会论文告诉我们:瓶颈已经不在「听不听得清」,而在「怎么生成文本」。Microsoft 的 CoT-ASR 让大模型先「想」再「写」,Whisfusion 则用扩散模型并行解码,把 Whisper 的延迟砍到原来的八分之一。本文深度拆解两篇代表论文,帮你看懂 ASR 范式迁移的来龙去脉。

结论:LLM 接入 ASR 后,「直接转写」并没有充分释放大模型能力——CoT-ASR 用链式推理把 WER 降 8.7%、实体错误率 EER 降 16.9%;Whisfusion 用非自回归扩散解码,相近精度下把 20–30 秒音频的解码时间从 674.7ms 压到 80.7ms。一条路线优化「准」,一条路线优化「快」,共同指向新一代 ASR 架构

一、前言:ASR 为什么需要换范式

过去十年,ASR 的主线故事是「更大的编码器 + 更好的对齐」。Conformer、Whisper、SenseVoice……准确率一路攀升。但当 Speech LLM 把 LLM 接进识别链路后,一个尴尬的事实浮出水面:大模型在文本侧拥有的推理、知识、上下文理解能力,在 ASR 里几乎用不上。

原因很简单——传统 LLM-based ASR 的训练目标仍然是「语音 → 逐字转写」。语音和文本承载的信息高度重叠,模型被约束成「复读机」,而不是「理解者」。与此同时,Whisper 式自回归解码器必须逐 token 生成,文本越长,延迟线性增长,实时字幕、会议转写、端侧 ASR 都深受其苦。

 2026 年的两个信号

  • CoT-ASR(Microsoft Core AI):把 Chain-of-Thought 引入 ASR,ICLR/arxiv 2026
  • Whisfusion(ICLR 2026 投稿):Whisper 编码器 + 扩散并行解码
  • 共同背景:Speech LLM 规模化,但 token 密度失衡与 AR 延迟成为两大瓶颈

论文数据仅供参考;CoT-ASR 基于 3.8B Phi-4-mini + 38k 小时英文数据,Whisfusion 在 LibriSpeech 960h 上微调。落地时需结合自己的语种、场景与算力重新评估。

二、CoT-ASR:让大模型先分析,再转写

论文全称 Speech LLMs are Contextual Reasoning Transcribers,作者来自 Microsoft Core AI(Keqi Deng、Jinyu Li 等)。

它要回答的核心问题是:如何把 LLM 的推理能力「翻译」成 ASR 收益?

▎ 2.1 直接转写为何浪费 LLM

现有 Speech LLM 通常把语音编码器输出拼在文本 prompt 前面,然后让 LLM 直接生成转写结果。训练 loss 也只监督转写文本——和 Conformer AED 没有本质区别。

论文指出,ASR 在信息论上接近「内容保持映射」:输入说什么,输出就写什么,语义变换空间极小。LLM 在海量文本上预训练获得的常识、领域知识、消歧能力,在「只听就写」的模式下被严重压制。

▎ 2.2 链式推理:One-Pass 的两段式输出

CoT-ASR 的关键设计是:一次生成(one-pass),但输出分两段。模型先产出「语境分析」(Contextual Analysis),再产出「转写文本」。前者相当于 Chain-of-Thought,后者才是最终 ASR 结果。

  • 语境分析:推断说话场景、主题、可能的专有名词与歧义
  • 转写文本:在分析基础上生成更准确的识别结果
  • 训练数据:用 Qwen2.5-14B 从 3.8 万小时语音自动构造「分析 + 转写」对

▎ 2.3 CTC-guided Modality Adapter

语音帧序列远长于文本 token,如何把 Conformer 编码器输出对齐到 LLM 隐空间,是 Speech LLM 的经典难题。

CoT-ASR 没有简单用两层 Linear 投影,而是提出 CTC-guided Modality Adapter。

  • 每帧计算 CTC blank / non-blank 概率分布
  • 用 non-blank 分布对 LLM token embedding 矩阵做加权求和,得到帧级「文本化」表示
  • 保留全部帧信息(含 blank 帧),避免 CTC 压缩丢信息
  • 门控残差分支进一步融合原始声学特征

直觉上:每一帧的 CTC 分布告诉我们「这一帧最像哪个字」,

再映射到 LLM 已经熟悉的 embedding 空间——比纯线性投影更直接地利用 LLM 的文本先验。

2.4 用户引导转写:比热词更「语义化」

CoT-ASR 还支持 User Context 模式:用户提供场景描述或实体线索,模型跳过自生成推理,直接转写。这类似「Prompt ASR」,但利用的是 LLM 的 in-context learning,而非简单热词偏置。实验显示,加入用户上下文后,平均 EER 从 9.17% 进一步降到 6.89%,相对再降 24.9%。Pharmacy 领域 EER 从 5.97% 降到 3.11%,医疗场景收益尤其明显。

 2.5 实验结果:小数据超越大模型

在 LibriSpeech test-clean 上,CoT-ASR WER 2.20% vs Phi4MM 基线 2.41%,相对降 8.7%。更值得关注的是 EER(实体错误率):8 个行业测试集平均 EER 从 11.03% 降到 9.17%,相对降 16.9%。对比开源大模型:CoT-ASR 仅用 38k 小时数据,平均 EER 9.17% 已略优于 Qwen3-Omni-30B(9.19%)和 Whisper-large-v3(9.53%)。

论文认为:对 ASR 而言,LLM 参数规模并非万能钥匙,「会不会用 LLM 的推理能力」才是关键

CoT-ASR 的启示:ASR 正在从「声学分类问题」转向「语言理解问题」。专有名词、医疗术语、游戏黑话等场景,EER 指标比 WER 更贴近真实体验。

三、Whisfusion:Whisper 的并行解码革命

Whisfusion(Parallel ASR Decoding via a Diffusion Transformer)是 ICLR 2026 投稿论文,它瞄准的是另一个痛点:Whisper 编码器 30 秒音频一次前向,但解码器必须逐 token 自回归——文本越长,越慢。

 3.1 架构错配:有全量上下文,却只能顺序生成

论文 Figure 1 清晰展示:Whisper-small 的编码器耗时几乎恒定,解码器耗时随输出词数线性增长。20–30 秒音频段上,解码占端到端延迟的大头。

Whisper-Large-v3-turbo 等蒸馏模型缓解了部分问题,但 AR 本质未变。

3.2 核心设计:冻结 Whisper + 扩散文本解码器

Whisfusion 的 hybrid 架构:Whisper 编码器冻结不动,

只训练轻量 Cross-Attention Adapter 和 Masked Diffusion Decoder。

  • 编码器:复用 Whisper 预训练声学表征,6.5k 小时数据即可微调
  • 解码器:基于 Masked Diffusion Model(MDM),每步并行更新全部 token
  • 推理:Parallel Diffusion Decoding(PDD),多候选并行 + 置信度筛选

3.3 扩散解码如何工作

Masked Diffusion 在前向过程中随机 mask 文本 token,模型学习从被 mask 的序列中恢复原文。推理时从全 mask 序列出发,迭代去噪若干步,每步所有位置同时预测。

与 AR 的关键差异:AR 第 t 个 token 依赖前 t-1 个;扩散解码每步都能「看到」完整声学上下文并双向建模全部 token。因此输出长度对延迟的影响大幅减弱——这正是 ASR 需要的特性。

▎ 3.4 Parallel Diffusion Decoding(PDD)

Whisfusion 进一步提出 PDD 策略:每步生成 k 个并行候选序列,按置信度选最优。

增加 k 可提升准确率,但对 RTF 影响极小——因为并行候选在同一 GPU batch 中完成。

●  k=5→15:WER 从 9.1% 降到 8.3%,RTF 几乎不变

●  Oracle WER 5.9%,模型实际 8.3%,68.7% 样本选中近最优候选

●  两阶段课程学习:Stage1 建立基础,Stage2 引入 PDD 达最优

▎ 3.5 速度数据:8.4× 不是噱头

LibriSpeech test-clean:Whisfusion WER 4.9%,Whisper-small 5.0%,精度持平。

在 20–30 秒音频段上,解码时间 674.7ms → 80.7ms,加速 8.4×。

吞吐方面:Whisfusion 超 3100 tokens/s,Whisper-small 仅约 103 tokens/s,差距 13 倍以上。

RTF 0.005 vs 0.031,意味着 CPU/GPU 算力预算可以大幅释放。

Whisfusion 的局限:长音频(20–30s)训练样本稀缺,该区间 WER 15.9% 偏高;与 Oracle 仍有 2.4% 差距,候选选择策略还有优化空间。但作为 Whisper 生态的「并行解码插件」,方向非常清晰。

四、两条路线如何互补

CoT-ASR 和 Whisfusion 看似都在「改造 Whisper/LLM ASR」,

但优化目标几乎正交:一个追准确率尤其是实体识别,

一个追解码吞吐与延迟。

 4.1 范式对比

①  CoT-ASR:改「生成内容」—— 先推理再转写,激活 LLM 知识

②  Whisfusion:改「生成方式」—— 并行扩散替代自回归

③  CoT-ASR:适合医疗、金融、客服等实体密集场景

④  Whisfusion:适合实时字幕、长音频批转、端侧低延迟场景

▎ 4.2 对工程落地的启示

●  评估指标要升级:WER 不够,垂直场景应跟踪 EER / 实体召回

●  Speech LLM 不必盲追参数量:38k 小时 + 推理范式可击败 30B 模型

●  解码器是延迟瓶颈:编码器量化、蒸馏之外,NAR 扩散是下一战场

●  两者可组合:Whisfusion 式并行解码 + CoT 式推理 prompt,是值得探索的方向

▎ 4.3 与开源 ASR 优化的关系

如果你在用 Whisper / SenseVoice / sherpa-onnx 做落地,

这两篇论文提供了「下一步该往哪走」的路线图:准确率瓶颈 → 考虑引入推理式转写或 LLM 后处理;速度瓶颈 → 关注 NAR/Flow Matching/扩散解码,

而非一味缩小 beam。

Whisper-CD(对比解码抑制幻觉)、Distilling Conversations(多轮上下文压缩)等同期工作,

与 CoT-ASR / Whisfusion 共同构成 2026 ASR 论文簇——核心主题都是:让 ASR 更「聪明」、更「快」。

五、论文信息与延伸阅读

▎ CoT-ASR

●  论文:Speech LLMs are Contextual Reasoning Transcribers

●  机构:Microsoft Core AI

●  链接:https://arxiv.org/html/2604.00610v1

●  骨干:Phi-4-mini 3.8B + Conformer 编码器 + CTC Adapter

▎ Whisfusion

●  论文:Whisfusion: Parallel ASR Decoding via a Diffusion Transformer

●  会议:ICLR 2026(under review)

●  链接:https://openreview.net/pdf?id=JCujsFnDS7

●  数据:LibriSpeech 960h 微调,6.5k 小时混合训练

总结          
ASR 正从「直接转写」走向「推理式转写」与「并行解码」两条路线          
• CoT-ASR:One-Pass 链式推理,WER -8.7%,EER -16.9%,38k 小时超越 30B 模型          
• Whisfusion:Whisper + 扩散 NAR 解码,20–30s 音频解码加速 8.4×          
• CTC Modality Adapter 与 PDD 分别是两篇论文的关键工程创新          
• 落地时按场景选路线:实体准确 vs 实时延迟,评估指标也要相应升级

NIM4-ASR: 高效鲁棒可定制的实时LLM语音识别

paper: https://arxiv.org/abs/2604.18105

面向生产部署的 LLM-ASR 框架,系统解决轻量化、幻觉抑制、热词定制三大痛点。基于 phoneme-level encoder 预训练减少模态差距,引入 Iterative Asynchronous SFT(IA-SFT)防止 representation drift,设计 ASR 专用 RL 提升识别质量,并以 phoneme RAG 实现百万量级热词定制。

音频 → 600M Conformer Encoder(phoneme CTC 预训练,CKA 监控 drift)
                    ├── 流式:dynamic-chunk mechanism(预训练期内嵌)
                    └── phoneme CTC head → 音素假设
         MLP Adapter(4x 下采样,160ms/token)
                    ↓
              Qwen3-1.7B(LLM 解码器)
                    ↑
         Phoneme RAG:音素假设 → 检索热词数据库(<1ms)→ Prompt 注入

训练 pipeline:
    Stage1: Encoder 预训练(phoneme CTC,CR-CTC)
    Stage2: Alignment(仅训练 Adapter,冻结其余)
    Stage3: IA-SFT(异步并行,CKA 监控 encoder 稳定性)
    Stage4+5: Late Joint SFT + Context SFT + ASR-RL

Challenge

1、Limited downward scalability

在实际部署中,尤其是实时语音交互场景下,轻量级 ASR 模型由于推理延迟更低、计算成本更小因此更受青睐。然而,基于 LLM 的 ASR 在模型缩小后的性能表现并不理想:比如Qwen3-ASR-0.6B、Fun-ASR-nano这类轻量版本相比完整大模型存在明显性能差距。除了模型缩小本身带来的性能下降外,LLM-ASR 还额外承担了一种:模态税(modality tax),

即:模型中有相当一部分参数并不是直接用于 ASR 任务,而是用于跨模态对齐(cross-modal alignment)。这种结构性开销会导致轻量 LLM 真正可用于 ASR 的有效容量更少,从而带来不成比例的性能下降。

2、幻觉问题(Hallucination)

除了自回归 LLM 天生存在的 hallucination(幻觉)问题之外,encoder–adaptor–LLM 联合训练范式还会引入额外风险。

在联合优化过程中由于:LLM 梯度更强、LLM 语言先验更强。 encoder 会逐渐被拉向LLM 的优化目标,导致 encoder 的表示逐渐偏移到 LLM 的文本特征空间,称之为representation drift(表示漂移),导致encoder 会越来越依赖语言捷径(linguistic shortcuts)而不是精细声学信息(fine-grained acoustic fidelity)。在噪声、发音模糊、音频不清晰的声学歧义场景下会加重幻觉问题。

3、缺乏工业级热词定制能力(Lack of production-ready hotword customization)

为了解决上述问题,提出了面向工业部署的 LLM-ASR 框架 NIM4-ASR,重点优化推理效率和系统鲁棒性。

  • 提出了一种基于原则的多阶段训练范式
  • 优化了流式处理支持
  • 音素级 RAG 用于热词定制

Methodology

Model

encoder–adaptor–LLM 架构

1、音频特征提取

80 维 log-Mel 频谱,窗长(window):25 ms 帧移(frame shift):10 ms,全局均值方差归一化

2、Streaming speech encoder

编码器采用FireRedASR-AED Conformer,一个 4 倍下采样卷积模块 多层 Conformer Block 堆叠,输出帧率 25Hz,为了支持流式推理,训练阶段会模拟streaming 约束,将其改造成chunk-based streaming encoder

3、Speech adaptor

两层 MLP,将 encoder 输出映射到 LLM 的 embedding 空间,4倍下采样,将连续 4 帧特征进行拼接,帧率从 25 Hz 降到 6.25 Hz,每个 token 160ms。

4、Phoneme-level CTC head and RAG module

三层 MLP,将 encoder 表示解码为 phoneme hypothesis(音素假设),greedy decoding。RAG 模块会根据这些音素序列检索 hotword 数据库,将热词作为上下文提示注入 prompt

5、LLM decoder: Qwen3-1.7B

Training Recipe

与以往主要依赖经验微调的工作不同,首先对当前基于 LLM 的 ASR 系统的实际局限性及其根本原因进行了系统性的分析  ,结果表明跨模态差距和表征漂移问题仍未得到充分解决。基于这些见解,我们对训练流程进行了全面重新设计。如图 2 所示,NIM4-ASR 的方法论改进主要体现在四个核心训练阶段:编码器预训练、对齐、IA-SFT 和后期联合 SFT。除了这四个阶段的流程之外,我们在后期联合 SFT 之后进一步加入了上下文 SFT 和强化学习(RL),以增强上下文建模和鲁棒性。具体步骤如下所述。

 第一阶段:编码器预训练

为了缩小编码器表征与 LLM 嵌入空间之间的模态差异,采用了一种改进的连接主义时间分类(CTC)变体  ——即 CR-CTC 作为预训练目标。如图 2 所示,预训练期间的模型架构由编码器和 CTC 头组成。与先前工作中常用的基于注意力机制的编码器-解码器(AED) 相比,CTC 鼓励编码器生成低熵、音素区分性强的表征,使其与 LLM 的嵌入空间更自然地对齐,从而减少跨模态对齐的开销,并为自动语音识别(ASR)任务保留更多模型容量

将监督标签从字符级转移到音素级 ,明确地将编码器的容量用于声学到音素的映射,而不是过早地进行语义锚定,同时鼓励语言学习模型(LLM)更多地关注语义推理。这种设计实现了声学建模与语义推理的更清晰解耦,提高了两个模块的角色专业化程度。此外,采用音素预测作为预训练目标,鼓励编码器学习语言依赖性较弱的底层声学表征,从而为扩展到新的语言和方言提供更大的潜力。

为了赋予编码器原生流媒体处理能力,在预训练阶段引入了动态分块机制。具体来说,编码器在分块流媒体约束下处理完整的语音,其中每个批次的块大小和可见左侧上下文块的数量都是动态采样的。这使得编码器能够适应各种流媒体配置,从而实现灵活操作,以适应不同部署场景下不同的延迟预算。

Stage 2: Alignment & Stage 3: IA-SFT

在传统的训练范式中,对齐和联合 SFT 是在预训练完全完成后依次执行的。如图 2 所示,我们为 NIM4-ASR 提出了一种编码器迭代机制,该机制允许在预训练完成之前开始对齐,而 IA-SFT 在对齐完成后启动,并与剩余的预训练过程异步进行。为了确定何时初始化或更新对齐和 IA-SFT 使用的编码器,我们使用中心核对齐(CKA) 跟踪编码器表示的动态变化。CKA 将不断演化的编码器与在整个预训练过程中初始化并定期更新的参考检查点进行比较。给定从同一评估集中提取的两组编码器表示 E(a),E(b) ,CKA 定义为

第二阶段:对齐。 预训练达到 50 万步后,我们开始监测编码器,此时编码器开始呈现相对稳定的优化趋势。我们将 50 万步时的编码器快照作为初始参考检查点,之后每隔 1 万步预训练评估一次 CKA。当演化中的编码器与当前参考检查点之间的 CKA 分数首次低于预定义阈值.在对齐过程中,编码器和 LLM 均被冻结,仅训练适配器。在我们的设置中,首次触发发生在预训练约 101 万步时,对齐阶段持续 130 万步

第三阶段:IA-SFT。 对齐完成后,我们在联合 SFT 之前执行 IA-SFT 作为中间阶段。IA-SFT 保持编码器冻结,并基于异步预训练过程生成的编码器快照序列训练适配器-LLM 堆栈。具体步骤如下:

(i)初始化与监控。IA -SFT 在对齐完成后开始,使用从对齐过程中继承的编码器进行 100 万步的训练,同时编码器预训练并行进行。CKA 评估从之前更新的参考检查点恢复,并每隔 1 万步预训练步骤重复进行一次,监控表征偏移。

(ii)CKA 触发更新。 每当 CKA 分数低于预定义阈值时,当前预训练编码器的快照就会热插拔到 IA-SFT 分支中,并相应地更新参考检查点。

(iii)最终更新。 更新周期(ii)重复进行,直到预训练达到其 200 万步的​​最大值。预训练完成后,无论 CKA 得分如何,都将应用最终编码器更新,并且 IA-SFT 运行最后 200 万步。

在我们的实现中,IA-SFT 使用 101 万步预训练时的编码器检查点进行 100 万步训练,再使用 132 万步预训练时的编码器检查点进行 100 万步训练,最后使用完全预训练的编码器进行 200 万步训练——总共在三个编码器版本上进行了 400 万步训练。在 IA-SFT 过程中,编码器保持冻结状态,但会定期从异步预训练过程中更新,从而保持声学基础。这使得模型能够在不出现表征漂移风险的情况下加深跨模态对齐。从课程学习的角度来看,IA-SFT 逐步将 LLM 暴露于更精细的编码器表征中,使其能够学习不变模式并提高对声学扰动的鲁棒性。此外,由于对齐和 IA-SFT 与预训练异步运行,因此整个训练流程仍然保持高效。

Stage 4: Late Joint SFT

在编码器预训练和 IA-SFT 完成后,语音表征与 LLM 嵌入空间之间建立了稳健的初始跨模态映射。随后,我们执行后期联合 SFT,其中编码器、适配器和 LLM 以端到端的方式联合优化。与传统的联合训练相比,由于前期阶段已经最小化了模态差异,LLM 梯度引起的表征漂移风险显著降低。因此,这些梯度主要作为微调信号,无缝地优化声学到音素的映射以及音素到语义的关联。从几何角度来看,前期的对齐阶段建立了一个稳定的跨模态流形,使后续优化处于损失函数曲面的低曲率区域。在该区域内,梯度更新是对决策边界和流形几何结构的局部优化,而不是引起大规模的拓扑重构。

Stage 5: Context SFT

首先从训练语料库构建关键词集 S 。所有转录文本均被解析以提取候选短语,然后使用 Qwen3-30B-A3B-Instruct进行过滤,以保留命名实体,例如人名、兴趣点(POI)、媒体名称和专有名词。在训练过程中,我们提高长时长话语的采样比例,并按照以下模板,将从 S 中采样的关键词以概率方式注入到提示中作为上下文提示:

每个训练实例,我们首先从转录文本中存在的 S 中提取相关关键词。此外,对于每个关键词,我们以一定的概率从 S 中提取发音相同或高度相似的另一个关键词作为干扰项。相关关键词和干扰项被连接起来,然后添加到 {context} 字段中。干扰项的加入可以防止语言学习模型 (LLM) 过度依赖上下文线索而牺牲语义合理性。在此阶段,编码器、适配器和 LLM 会进行联合训练。

此阶段的设计目的在于实现热词定制,而非跨回合对话的一致性。对于多回合场景,还可以将从对话历史中提取的关键词添加到当前提示中。这种策略以紧凑的形式保留了关键的上下文信息,同时保持了比句子层面方法更低的推理延迟。

Stage 6: ASR Specialized RL

GRPO,奖励函数:

  • Accuracy reward
  • Hallucination reward
  • Context reward

Additional Stage: Phoneme Head Training for RAG

完成强化学习(RL)阶段后,主训练流程结束。接下来,我们引入一个额外的阶段来训练图 1 所示的 RAG 模块所需的音素头。在该阶段,编码器继承强化学习后检查点的结构和权重并保持冻结状态,而音素头则从预训练的 CTC 头初始化并保持可训练状态。训练目标和配置与预训练阶段一致。经过微调后,音素头可以将编码器表示转换为音素假设,供后续检索模块使用。

Training Setup

Robustness enhancement under noisy and silent conditions。应用了多种数据增强技巧来提高模型的鲁棒性。除了标准的 SpecAugmentation  和速度扰动之外,我们还随机地将一些真实的声学干扰(例如人声、车辆噪声和背景音乐)注入到 20%的干净训练样本中,以模拟具有挑战性的真实世界环境。这些噪声注入的信噪比(SNR)是从均值为 10 dB、标准差为 5 dB 的正态分布中随机抽取的。

Inference

优化流式推理

Encoder 与 LLM 解耦部署,Encoder 部署在 Triton,Adaptor + LLM 部署在 vLLM,CTC Head + RAG 部署在 CPU

Prompt 结构设计

[Static Prefix]
↓
[Streaming Speech Embeddings] 增量 append 到 context
↓
[Dynamic Hotword Context] 动态更新热词

两种 Streaming ASR Paradigm

增量假设刷新(hypothesis refresh)
vs
incremental context extension(增量上下文扩展)

| 方案                  | hypothesis refresh | incremental extension |
| ------------------- | ------------------ | --------------------- |
| 历史是否重复 decode       | 是                  | 否                     |
| KV Cache 是否重建       | 经常                 | 基本不                   |
| 是否实时 partial output | 强                  | 弱                     |
| TTFT                | 更低                 | 略高                    |
| Tail latency        | 高                  | 低                     |
| 适合场景                | 长会议                | 实时语音助手                |

Phoneme-based RAG(音素级热词检索)

文本 -> 音素序列,使用 Aho-Corasick 自动机,采用 Hard Matching不做模糊匹配,Retrieval Error 比 Retrieval Miss 更危险。

为了实现高效的热词定制,NIM4-ASR 构建了一个基于音素的热词数据库以及相应的检索算法,如图 1 所示。将每个热词文本预先转换为音素-词元序列,并将其存储为键值对,其中键是音素序列,值是对应的热词文本。这些音素序列首先根据音素词汇表转换为离散索引,然后使用 Aho-Corasick 自动机算法重构为带有失败链接的 trie 树。在推理过程中,编码器上的音素头通过贪婪解码生成音素假设,这些假设被转换为索引序列,并由自动机在一次遍历中扫描完成。当无法扩展部分匹配时,自动机将沿着失败链接找到最长的有效后缀状态,而不是从头开始重新搜索,从而能够以假设长度的线性时间复杂度检索所有候选热词。

为了减少冗余的上下文提示,我们采用了一种最长匹配过滤策略:被较长跨度完全覆盖的较短匹配项将被丢弃,仅保留最长的实体。例如,如果热词“NIO”和“NIO House”在同一假设中同时匹配,则仅保留“NIO House”。检索到的热词文本随后被连接起来,并与语音嵌入一起作为上下文提示注入到 LLM 提示中,从而为解码提供上下文感知的偏置。由于索引级映射的存储效率以及 Aho-Corasick 自动机的线性时间复杂度(仅取决于查询长度而非数据库大小),热词数据库可以轻松扩展到数百万条记录,同时保持每次查询的亚毫秒级检索延迟。

值得注意的是,我们的热词定制旨在优化命名实体(例如地点名称和媒体标题)的识别,这类热词数据库可能非常庞大,并且可能包含大量语音相似甚至同音的条目。为了确保在这种大规模环境下的检索精度,我们在 RAG 模块中采用了硬匹配策略,仅检索精确的音素序列匹配,而非近似匹配或编辑距离最小的匹配。经验表明,检索漏检通常比检索错误危害更小,因为 LLM 仍然可以利用内部语言知识和上下文恢复正确的实体。相比之下,软匹配更容易引入相似但错误的热词,即使模型在一定程度上能够应对噪声上下文提示,这些错误热词仍然会干扰解码。

Evaluation

总结:

NIO 车载场景出发的工业论文,偏向工程落地。phoneme-level encoder 预训练、IA-SFT 防 drift、ASR-RL、百万热词 RAG——每个模块都是真实生产痛点的解法。CKA 动态监控 encoder 表示偏移这个手段很细。但核心数据不公开,学术可复现性为零;”25 个 benchmark SOTA”要打折——主要赢在内部实体密集场景;Streaming 支持是”优化了”而非”重新设计了”。热词检索口音/方言效果差。未来将对话历史作为附加上下文信息纳入多轮交互场景,以提高跨轮次转录的一致性。

流式 LLM-ASR 模型优化论文全景(2022–2026)

原创:贾彦

时间范围:2022.01–2026.04,共收录17 篇 代表性论文,按时间顺序排列。每篇包含:简介、架构、关键创新、训练数据、实验结果、犀利点评、评分。⭐⭐ = 里程碑论文;⭐ = 值得精读

2022–2023:奠基期——LLM 如何接管 ASR

这一阶段的核心问题是:”能不能把LLM用到语音识别上? ” 研究者们刚刚开始尝试把 Whisper、LLaMA 等模型引入 ASR,流式能力还是次要问题,主要在验证可行性。


1. Prompting Large Language Models with Speech Recognition Abilities ⭐

arXiv ID : 2307.11795

发布日期 : 2023-07-21

发表状态 : ICASSP 2024

机构 : Meta AI

论文链接 : https://arxiv.org/abs/2307.11795

📌 简介

最早系统验证”把小音频编码器直接接到冻结 LLM 前端做 ASR”这个 GPT-style 范式可行的论文之一。将 Conformer encoder 输出作为 prefix embedding 拼接到 LLaMA-7B 的 text token 前,验证多语言 ASR 能力,以及 LLM 冻结时是否仍可学到多语言识别。

🔧 架构示意

音频 → Conformer Encoder → Prefix Embedding
                                    ↓
                文本 Token Embedding → LLaMA-7B (可冻结) → 转录输出

💡 关键创新

  • 建立了”Speech Prompt + LLM”的 GPT-style baseline 范式
  • 验证:LLM 冻结 + 仅训练 encoder 时仍有效,无需 LLM 参与 ASR 训练
  • 大步长 striding(~1s)下仍保持多语言识别能力

📊 训练数据&实验结果

  • 数据:Multilingual LibriSpeech(MLS,44.5k h,多语言)
  • MLS 英语 WER 4.3%,多语言超过 monolingual baseline 18%

☠️ 犀利点评

这篇的历史价值在于”第一批验证者”而非”创新者”。Encoder 接 LLM 做 ASR 这件事大家都在想,它只是第一批做出来并写清楚的。不支持流式是硬伤——GPT-style 必须把整段音频先编好再喂 LLM,实时场景完全用不了。论文本身偏工程报告,ablation 也比较粗糙。不过作为这个方向的开山之作必须了解。

⭐ 评分 : 6/10

2. Chunked Attention-based Encoder-Decoder for Streaming Speech Recognition ⭐

arXiv ID : 2309.08436

发布日期 : 2023-09-15

发表状态 : ICASSP 2024

机构 : RWTH Aachen / Google

论文链接 : https://arxiv.org/abs/2309.08436

📌 简介

AED(Attention Encoder-Decoder)模型改造为 chunk-wise 流式模型,用特殊的 End-of-Chunk(EOC)符号代替传统 EOS 符号驱动 chunk 间跳转。理论分析表明 Chunked-AED 等价于一个 chunk 级别的 Transducer (RNN-T)。同时研究了长音频泛化、beam size、length normalization 等实际部署问题。

PS: RNN-T consists of three major building blocks:

RNN-T Architecture

🔧 架构示意

音频流 → Chunk-aware Encoder(限制未来帧可见范围)
                    ↓
       Chunk-wise Decoder(EOC token 驱动 chunk 跳转)
                    ↓
              流式转录输出(chunk-by-chunk)

💡 关键创新

  • AED 流式改造:EOC token 替换 EOS,使 decoder 可 chunk-wise 生成
  • 理论证明 Chunked-AED ≈ Chunk-level Transducer,统一两类模型
  • 长音频泛化:串联短音频序列训练,无需专门长音频数据

📊 训练数据&实验结果

  • 数据:LibriSpeech(960h)+ TED-LIUM-v2
  • LibriSpeech test-clean 流式 WER 2.7%,与非流式差距极小

☠️ 犀利点评

这篇的意义被低估了。它把 AED 和 Transducer 的理论关系说清楚了,后续很多流式 LLM-ASR 设计都是这个思路的变体。但它本身并没有引入 LLM,是”流式 AED 优化”论文,和”LLM-ASR”严格来说不在一个赛道。CHAT(2602.24245)可以直接看作这篇的 LLM 时代续作。

⭐ 评分 : 7/10


3. Smoothed Label Distillation for Decoder-Only ASR(SLD)

arXiv ID : 2311.04534

发布日期 : 2023-11-08

发表状态 : ICASSP 2024

机构 : Alibaba DAMO Academy

论文链接 : https://arxiv.org/abs/2311.04534

代码链接 : https://github.com/alibaba-damo-academy/SpokenNLP

📌 简介

研究 decoder-only Transformer(GPT-style)做 ASR 时如何处理离散语音 token 的训练损失问题。发现直接在音频 token 上用 CE loss 并不稳定,提出 Smoothed Label Distillation(SLD),用 KL 散度 + 平滑标签对音频 token 进行自回归建模

🔧 架构示意

音频 → 离散化(HuBERT/EnCodec等) → 音频离散 token
                                            ↓
                  Decoder-Only Transformer(GPT-style)
                            ↓                    ↓
                    音频 token 预测        文本 token 预测
                  (SLD: KL散度+平滑标签) (标准 CE loss)

💡 关键创新

  • 指出 Loss Masking(忽略音频 token 的 loss)和直接 CE 都不是最优的
  • SLD:KL 散度 + 平滑标签,让模型学到音频 token 间的自回归依赖
  • 对 SpeechGPT 等离散 token ASR 范式的训练目标优化有指导意义

📊 训练数据&实验结果

  • 数据:LibriSpeech(960h)
  • 超越 Loss Masking 策略,在多种语音离散化方法下一致改善

☠️ 犀利点评

这是一篇”找到真正问题并解决它”的小而精的工作。离散 token ASR 的训练损失该怎么设计这个问题在当时没人仔细研究,它认真研究了。但离散 token ASR 的精度上限本来就比连续特征差,SLD 改善的是”训练方式”而非”架构上限”。流式能力没有涉及,属于 decoder-only ASR 的训练基础研究。

⭐ 评分 : 6/10


▌2024:爆发期——流式框架、多任务、工程化

2024 年是流式 LLM-ASR 真正爆发的一年。BESTOW 确立了 read-write policy 框架,Transducer-Llama 给出 RNN-T 下最优 LLM 集成方案,Seed-ASR 展示了工业 LLM-ASR 的真实边界。


4. BESTOW: Efficient and Streamable Speech Language Model ⭐⭐

arXiv ID : 2406.19954

发布日期 : 2024-06-28

发表状态 : Interspeech 2024 / NeurIPS 2024 Workshop

机构 : NVIDIA

论文链接 : https://arxiv.org/abs/2406.19954

代码链接 : https://github.com/NVIDIA/NeMo(含 BESTOW 实现)

📌 简介

提出 BESTOW 架构,将 GPT-style(预拼接音频 embedding)和 T5-style(逐层 cross-attention)的优点融合。核心是用文本 query + 音频 key/value 的 cross-attention 替代音频 prefix 拼接,既保持高效率又天然支持流式。将流式 SpeechLLM 重新定义为 read-write policy 问题,统一离线与流式研究框架。

🔧 架构示意

音频流 → 流式 Speech Encoder → 音频特征(Key/Value)
                                        ↓
文本 Prompt → LLM 内各层 Cross-Attention(文本作 Query)
                                        ↓
                         read-write policy 网络
                     (决定何时输出 token,何时继续 read)
                                        ↓
                              流式多任务输出(ASR/AST/SQA)

💡 关键创新

  • 首个同时支持流式和多任务(ASR/AST/SQA)的开源 SpeechLLM
  • 将流式问题转化为 read-write policy,借鉴同步翻译领域成熟研究
  • text query 驱动音频 cross-attention,效率优于 GPT-style prefix 拼接
  • 87k 小时数据规模,一天内可完成训练

📊 训练数据&实验结果

  • 数据:87,000 小时多语言语音(公开 + 私有)
  • ASR、AST、SQA 多任务 SOTA;LibriSpeech test-clean WER 1.9%

☠️ 犀利点评

2024 年流式 LLM-ASR 里最值得精读的论文,没有之一。它把”流式 SpeechLLM”的问题空间定义清楚了——read-write policy——并给出了第一个能跑、能开源的多任务流式解法。但 87k 小时数据不是普通团队能复现的,且流式性能上没有做细致的延迟分析(只说”支持流式”,没给具体 latency 数字)。研究者必读;工程师注意数据门槛。

⭐ 评分 : 8/10


5. Seed-ASR: Understanding Diverse Speech and Contexts with LLM-based Speech Recognition

arXiv ID : 2407.04675

发布日期 : 2024-07-05

发表状态 : ICASSP 2025

机构 : ByteDance / Seed Team

论文链接 : https://arxiv.org/abs/2407.04675

📌 简介

字节跳动 Seed 团队的大规模工业 LLM-ASR 系统报告。将 LLM 与语音编码器深度融合,支持上下文感知识别(热词、场景提示)、多方言、噪声鲁棒。采用分阶段训练:预训练弥合模态差距、SFT 对齐、RLHF 提升质量。注:论文本身为离线系统 ,不涉及 流式架构设计或流式实验 。

🔧 架构示意

音频 → 大规模 Speech Encoder(Conformer/类似结构)
                    ↓ Adapter
             LLM(Decoder-Only)
                    ├── 预训练:弥合模态差距
                    ├── SFT:任务对齐
                    └── RLHF:识别质量与鲁棒性提升
                    ↓
    上下文 Prompt(热词/领域/方言信息)→ 注入 LLM 输入
                    ↓
               离线转录输出(论文不涉及流式推理)

💡 关键创新

  • 工业级 LLM-ASR 全流程:从预训练到 RLHF 的完整 pipeline
  • 上下文感知:支持 prompt 注入热词和领域信息,无需重新训练
  • RLHF 首次系统应用于 ASR 质量提升
  • 多方言、噪声鲁棒大规模验证(论文不涉及流式)

📊 训练数据&实验结果

  • 数据:数十万小时中英双语(字节内部,规模未完全公开)
  • 内部多场景 benchmark SOTA,普通话 CER 和英语 WER 均优于 Whisper-v3

☠️ 犀利点评

字节在 LLM-ASR 上的第一次全面亮相,工程深度足。上下文 prompt 注入对产品场景特别有用——会议、垂直领域的识别质量问题本质是”模型不懂这些词”,prompt 是性价比最高的解法。但 RLHF 在 ASR 里的 reward 设计细节披露不够。论文本身为离线系统,不涉及流式内容,纳入本调研是作为重要工业离线 LLM-ASR 参考基线。

⭐ 评分 : 7/10


6. Transducer-Llama: Integrating LLMs into Streamable Transducer-based ASR ⭐

arXiv ID : 2412.16464

发布日期 : 2024-12-21

发表状态 : ICASSP 2025

机构 : Meta AI

论文链接 : https://arxiv.org/abs/2412.16464

📌 简介

将 LLM 集成到 Factorized Transducer(FT)框架中,天然继承 RNN-T 的流式能力。提出”弱到强 LM swap”策略:先用弱 LM 做 RNN-T 训练,再替换为强 LLM 预测器,通过 MWER loss 微调完成集成。还引入词汇表适配技术缓解 LLM 大词汇表带来的数据稀疏问题。

🔧 架构示意

音频流 → 流式 Conformer/Emformer Encoder
                    ↓
         Factorized Transducer
    ┌────────────────────────────────┐
    │   Blank Predictor(轻量网络)   │
    │   Non-Blank Predictor(LLM)   │← 弱→强 swap
    │   Joint Network(sigmoid/softmax混合)│
    └────────────────────────────────┘
                    ↓ MWER 微调
               流式转录输出

💡 关键创新

  • “弱到强 LM swap”:先用弱 LM 训 RNN-T,再换 LLM——绕过联合训练的优化陷阱
  • 词汇表适配:将 LLM 大词表映射到语音系统词表,降低训练代价
  • MWER loss 端到端调优 LLM 集成效果

📊 训练数据 & 实验结果

  • 数据:LibriSpeech(960h 英语)+ MLS 多语言(en 44.7k h、fr 1.1k h、it 0.2k h、nl 1.6k h)
  • 相对 FT baseline WER -17%;相对 RNN-T baseline -32%(LibriSpeech)

☠️ 犀利点评

这篇方法论含金量最高。”弱到强 swap”直接击中 RNN-T+LLM 联合训练效果差的核心原因——强 LM 在 RNN-T loss 训练期间会让 encoder 偷懒靠语言先验而不好好学声学信息,swap 后 MWER 才能把 LLM 能力真正释放出来。词汇表适配技巧也务实,工程里直接能用。但 Meta 的数据资源(44.7k 小时英语)不是普通团队能比的,中文等其他语系泛化性存疑。

⭐ 评分 : 8/10

7. Multi-token Prediction for Faster Speech LLaMA Decoding

arXiv ID : 2409.12116

发布日期 : 2024-09

发表状态 : Interspeech 2024 Workshop

机构 : JHU / Meta AI

论文链接 : https://arxiv.org/abs/2409.12116

📌 简介

针对 decoder-only LLM-ASR 推理速度慢的问题,引入 multi-token prediction:每个解码步骤同时预测多个未来 token。利用 ASR 任务的特殊性——音频条件化使 token 间依赖比纯语言建模弱——使多 token 预测接受率更高。

🔧 架构示意

音频 → Encoder → Embedding
                    ↓
           Decoder-Only LLM
                    ↓
     每步预测 K 个未来 token(并行解码头)
                    ↓
       验证接受 → 推进 K 步;拒绝 → 回退

💡 关键创新

  • Multi-token prediction 应用于 LLM-ASR 解码加速
  • 利用 ASR 任务中音频条件化降低 token 间强依赖的特性,保证接受率
  • LibriSpeech 上 ~3.2x 解码速度提升,WER 无损

📊 训练数据&实验结果

  • 数据:LibriSpeech(960h)
  • 3.2x 解码加速,WER 不变

☠️ 犀利点评

和后来的 SpecASR 方向相近,但发布更早、思路更简单直接。Multi-token prediction 没有专门为 ASR 特性设计,更像是把 NLP 领域 speculative decoding 的前身直接迁移。SpecASR 后来做得更系统,工程价值已被超越。这篇的贡献在于”第一个在 LLM-ASR 上想到并实现了这个方向”。

⭐ 评分 : 6/10

PS:阶跃 StepAudio 2.5 ASR,模型的核心突破在于速度与精度的兼得。我们率先将大语言模型(LLM)的推理加速技术引入语音识别领域,基于 ASR+MTP-5 深度融合架构,实测推理速度提升 400%、时延降低 60%,推理峰值达 500 tokens/s,推理成本直降 80%。传统语音识别模型受限于自回归生成机制,必须逐个 Token 依次输出,就像打字员一个字一个字地敲键盘。StepAudio 2.5 ASR 将 Step 3.5 Flash 同款的 MTP(多 Token 预测)技术移植至语音识别领域,使模型能够一次预测多个候选 Token,并通过并行验证机制快速确认结果。

StepAudio 2.5 ASR MTP-5

▌2025:成熟期——推理加速、端侧部署、多任务融合

2025 年流式 LLM-ASR 已经成熟,核心问题变成:怎么更快、更省、更全能 。推理加速、端侧部署、多任务联合成为三条主线。

8. MFLA: Monotonic Finite Look-ahead Attention for Streaming Speech Recognition ⭐

arXiv ID : 2506.03722

发布日期 : 2025-06-04

发表状态 : Interspeech 2025

机构 : Honor Device Co. / 上海交通大学

论文链接 : https://arxiv.org/abs/2506.03722

📌 简介

提出 Streaming-Whisper 框架:在 Whisper 上通过 LoRA fine-tune 实现流式识别,无需从头训练。核心是将 CIF(Continuous Integrate-and-Fire)机制引入 LLM-ASR,让模型自己学习”音频帧到 token 的软对齐”,用 MFLA(Monotonic Finite Look-ahead Attention)让 decoder 每个 token 在解码时看到无限左上下文 + 有限右上下文 ,替代传统固定 chunk 切割,从根本上缓解切块边界截断问题。

🔧 架构示意

音频流 → Whisper Encoder(MoChA chunk 自注意力,chunk size 均匀采样 [32,128])
                    ↓ hidden states H
         CIF Predictor(两层线性 + ReLU)
         ├── 预测每帧权重 α,累积触发 token 边界(MRE loss)
         └── 推理时追踪解码进度、防止边界幻觉
                    ↓ 动态分段对齐
         Decoder(Whisper Decoder + MFLA)
         ├── 每个 token 可见:无限左上下文 + 有限右上下文(look-ahead span ~ Poisson(λ=3))
         ├── 训练:hybrid-attention(full-attention + MFLA 混合)
         └── 推理:wait-k decoding(wait-3 为默认)
                    ↓
               流式转录输出(可延续 buffer state 减少重复计算)
扩展 SpeechLLM 版本:
音频 → Whisper-Large-V3 Encoder → Adapter(2层 cross-attention)→ Qwen2.5-3B-Instruct → 流式转录

💡 关键创新

  • CIF-driven 软对齐 :用 CIF predictor 估计帧级 token 权重,建立准单调对齐,替代 fixed-chunk 硬切割,缓解边界截断问题
  • MFLA :有限右上下文注意力机制,每个 token 动态决定看多少右侧音频帧,实现 prefix-to-prefix 训练范式
  • wait-k + buffer state 延续 :wait-3† 方案在 decoder buffer 中保留状态,比 Local Agreement baseline 减少 60.86% 冗余计算,延迟 1.41s
  • 统一离线/在线框架 :look-ahead span→∞ 即退化为离线系统,单模型同时支持两种模式
  • SpeechLLM 扩展验证 :接入 Qwen2.5-3B,在线解码 WER 仅比离线高 0.98%

📊 训练数据 & 实验结果

  • 数据:WenetSpeech4TTS Premium + LibriSpeech + MLS + VoxPopuli,覆盖中/英/德/西语
  • Whisper-Large-V3-Turbo:离线 WER 5.63%,在线 WER 7.17%(1s chunk,wait-3),差距 1.54%
  • 延迟对比(vs Local Agreement baseline DAL=1.65s):wait-3 DAL=1.41s(-14.5%),wait-1 DAL=0.93s(-43.6%)
  • SpeechLLM 在线 WER:WenetSpeech4TTS Premium 3.41%,LibriSpeech test-clean 2.38%

☠️ 犀利点评

CIF + 有限右上下文注意力这个组合是对的,比 fixed-chunk 切割聪明——让模型自己学对齐而不是按时钟切。wait-3† 的 buffer state 延续把 FLOPs 压到 12.77G(vs baseline 37.56G),工程上非常实用。但两个核心局限论文自己也承认:CIF predictor 太简单(只有两个线性层),帧级权重估计有偏差;LoRA fine-tune 对 encoder 的流式适配效果有限,online 和 offline WER 差距(1.54%)还是显著。更根本的问题是:CIF 感知的是”该输出第几个 token 了”,并不是真正的语义/韵律边界——说话人停顿、重读、换气这些信息 predictor 感知不到,只是比 fixed-chunk 随机切割好一点而不是彻底解决了边界问题。SpeechLLM 扩展部分只用了 LibriSpeech + WenetSpeech4TTS 评测,覆盖场景有限。整体是一篇把正确思路做出来了但还没做完的工作,predictor 升级和 encoder 流式改造是明显的后续方向。

⭐ 评分 : 7/10


9. SpecASR: Accelerating LLM-based ASR via Speculative Decoding ⭐

arXiv ID : 2507.18181

发布日期 : 2025-07-24

发表状态 : DAC 2025

机构 : 厦门大学 / 多校联合

论文链接 : https://arxiv.org/abs/2507.18181

📌 简介

针对 LLM-ASR 的推测解码框架。核心观察:ASR 解码是音频条件化的,小模型与大模型输出对齐率极高。提出自适应草稿序列生成(动态调整草稿长度)、草稿序列复用策略(减少草稿模型延迟)和两步稀疏 token 树生成算法。

🔧 架构示意

音频 → 小型 Draft LLM-ASR(快速生成候选 token 树)
                    ↓ 自适应长度控制
       大型 Target LLM-ASR(并行验证 token 树)
                    ├── 音频条件化保障高接受率
                    └── 稀疏 token 树减少 draft 开销
                    ↓
               加速后流式转录输出

💡 关键创新

  • ASR 专用推测解码:利用音频条件化保障 draft/target 高对齐率
  • 自适应草稿长度:动态调节 draft 长度,平衡验证开销与接受率
  • 两步稀疏 token 树:减少 draft 模型的冗余计算

📊 训练数据 & 实验结果

  • 数据:LibriSpeech + 多个英文公开 benchmark(评测数据集)
  • 3.04x–3.79x 加速(vs 自回归基线),1.25x–1.84x(vs 标准推测解码),精度零损失

☠️ 犀利点评

推测解码在 LLM 推理加速里已经成熟,这篇把它移植到 LLM-ASR 是顺理成章,但做了足够多的 ASR 专有设计。3.04x–3.79x 加速是真实 end-to-end 数字,不是理论上界。但前提是你已经有一个 LLM-ASR 系统,且能负担同时运行一大一小两个 LLM。资源受限场景帮助有限;draft 模型选型和训练策略披露也不够细致。

⭐ 评分 : 8/10

10. WhisperKit: On-device Real-time ASR with Billion-Scale Transformers ⭐

arXiv ID : 2507.10860

发布日期 : 2025-07-14

发表状态 : ICML 2025 On-Device Learning Workshop

机构 : Argmax

论文链接 : https://arxiv.org/abs/2507.10860

代码链接 : https://github.com/argmaxinc/WhisperKit

📌 简介

面向端侧部署的 Whisper 实时 ASR 推理优化系统。在 Apple 设备本地运行,匹配甚至超越云端 gpt-4o-transcribe、Deepgram nova-3 的精度,延迟低至 0.46s,WER 仅 2.2%。核心贡献是块对角 mask 自蒸馏、Apple ANE 极致优化和量化压缩。

🔧 架构示意

原始 Whisper Large v3 Turbo
    ↓ 块对角 mask 自蒸馏(d750:15s block)
流式化 Audio Encoder(块对角自注意力,静音缓存)
    ↓
Text Decoder + LocalAgreement 流式确认策略
    ↓ 量化(1.6GB → 0.6GB)
Apple Neural Engine(ANE)原生加速部署
    ↓
0.46s 延迟端侧实时转录

💡 关键创新

  • 块对角 mask 自蒸馏:原生支持 Whisper 流式推理,静音缓存减少无效前向
  • 量化 1.6GB→0.6GB,WER 损失 <1%
  • Apple ANE 近峰值硬件利用率,端侧超越云端 baseline

📊 训练数据 & 实验结果

  • 数据:CommonVoice 17(5 语种 fine-tune);LibriSpeech + earnings22 评测
  • WER 2.2%,延迟 0.46s;超越 gpt-4o-transcribe 和 Deepgram nova-3

☠️ 犀利点评

最接近纯工程论文的形态,每步都有充分 ablation 支撑——真实的工程成就。但整体是工程优化论文,不是算法创新论文:块对角 mask 引用自刘等人的先验工作,LocalAgreement 也是既有方法。价值在于”把现有技术栈在 Apple ANE 上极致优化”。如果你不做苹果端侧部署,快速浏览即可。

⭐ 评分 : 7/10

11. Train Short, Infer Long: Speech-LLM Enables Zero-Shot Streamable Joint ASR and Diarization(JEDIS-LLM)⭐

arXiv ID : 2511.16046

发布日期 : 2025-11-20

发表状态 : ICASSP 2026

机构 : 微软 UCLA

📌 简介

论文链接 : https://arxiv.org/abs/2511.16046

JEDIS-LLM:端到端 Speech-LLM,支持联合流式说话人分离(Diarization)+ ASR。模型仅在 ≤20s 短音频上训练,但可零样本泛化到任意长度长音频流式推理。通过 Speaker Prompt Cache(SPC)机制实现跨 chunk 说话人一致性传播,并支持预注册说话人 profile。

🔧 架构示意

音频流 → 流式 Speech Encoder
         ├── Spk-Decoder(Word-level Speaker Supervision)
         └── Projector
                    ↓
              LLM(LoRA 适配)
                    ↓
    流式 chunk 推理:
    Speaker Prompt Cache(SPC)
    ┌─────────────────────────────┐
    │ 每个说话人存储代表音频片段    │
    │ 跨 chunk 传递,实时更新      │
    └─────────────────────────────┘
                    ↓
         说话人归属转录("谁说了什么")

💡 关键创新

  • 首个零样本流式长音频联合 ASR + 说话人分离 Speech-LLM
  • SPC:借助 LLM 自回归 KV cache 机制,无需后处理全局聚类即可保持跨 chunk 说话人一致性
  • Word-level Speaker Supervision:单词级说话人标签增强 encoder 说话人判别能力
  • 仅短音频(≤20s)训练,零样本泛化到任意长音频

📊 训练数据 & 实验结果

  • 数据:内部多说话人数据(短音频 ≤20s);CALLHOME / AMI 标准 benchmark 评测
  • 超越 Sortformer、Meta-Cat(短音频场景);超越 DiarizationLM(长音频场景)

☠️ 犀利点评

这篇解决了一个真实且棘手的问题——流式长音频多说话人转录。SPC 设计优雅:用 LLM 自回归的 KV cache 机制天然延伸到说话人一致性跨 chunk 传播,不需要后处理全局聚类,也不需要重新训练。”仅在 <20s 短音频训练但零样本泛化到长音频”如果可复现,非常有价值。但实验数据集(CALLHOME、AMI)并非最新最难的 benchmark,和 DiarizationLM 的对比有主场优势之嫌(后者是 cascade 系统)。chunk size、SPC 更新频率的 ablation 还不够充分。

⭐ 评分 : 8/10

12. Audio-Conditioned Diffusion LLMs for ASR and Deliberation Processing(Whisper-LLaDA)

arXiv ID : 2509.16622

发布日期 : 2025-09-20

发表状态 : ICASSP 2026

机构 : IDIAP Research Institute / 多校联合

论文链接 : https://arxiv.org/abs/2509.16622

代码链接 : https://github.com/liuzhan22/Diffusion-ASR

📌 简介

将扩散 LLM(LLaDA-8B)引入 ASR,探索非自回归解码路径。首先作为 Whisper-LLaMA 转录的外部 deliberation 模块,利用 LLaDA 的双向注意力 + 去噪能力修正转录错误。进一步验证 LLaDA 作为独立 ASR 解码器时,扩散解码比自回归更快,但精度略低。

🔧 架构示意

音频 → Whisper-Large-v3 Encoder(冻结)
                    ↓
        Q-Former(44 trainable queries,0.33s window)
                    ↓ Projection
            LLaDA-8B-Instruct(LoRA 微调)
            ├── 模式1:Deliberation(修正 Whisper-LLaMA 初始转录)
            │   ├── 随机 mask 策略
            │   ├── 最低置信度 mask 策略
            │   └── 半自回归策略
            └── 模式2:独立 ASR 解码器(扩散解码/半自回归解码)

💡 关键创新

  • 首次系统验证扩散 LLM 用于 ASR 任务
  • 音频条件化嵌入是关键:纯文本 LLaDA(无声学特征)做 deliberation 无效
  • 半自回归解码策略:平衡扩散解码的速度与精度

📊 训练数据 & 实验结果

  • 数据:LibriSpeech(960h 英语)
  • 最佳级联 WER:test-clean 2.25% / test-other 4.94%(vs Whisper-LLaMA baseline -12.3%)
  • 独立扩散解码:速度快于 AR,但精度略低

☠️ 犀利点评

态度很诚实的探索性论文——明确说”扩散 LLM 做 ASR 的精度比自回归低,但速度更快”,没有粉饰结果。核心 insight 有价值:音频条件化嵌入对扩散 LLM 有效运作是必要条件。但实验只在 LibriSpeech 上(960h 英语有声书,难度偏低),无法说明噪声/口音/真实对话场景的鲁棒性。”更快但不够好”对生产场景吸引力有限。更适合定位为”验证可行性的技术报告”。

⭐ 评分 : 7/10

▌2026 Q1:持续演进期——统一架构、生产落地、全双工

13. Streaming Speech Recognition with Decoder-Only LLMs and Latency Optimization(MoCha-ASR)⭐

arXiv ID : 2601.22779

发布日期 : 2026-01-30

发表状态 : ICASSP 2026

机构 : 合肥工业大学 / 多校

论文链接 : https://arxiv.org/abs/2601.22779

📌 简介

提出将 read/write 策略网络与 MoChA(Monotonic Chunkwise Attention,单调分块注意力)结合,让 Decoder-Only LLM 支持流式 ASR。引入最小延迟训练目标(minLT loss),token 生成延迟降低 62.5%,无需 CTC 强制对齐,端到端可优化。

🔧 架构示意

音频流 → 流式 Conformer Encoder(context-sensitive chunking)
                    ↓ LoRA 微调
         MoChA Policy Network(决定 read/write)
              ├── read:继续接收音频帧
              └── write:触发 LLM 生成下一 token
                    ↓
         Qwen2.5-1.5B(Decoder-Only LLM)
         音频/文本 token 交错输入
                    ↓
    minLT loss 约束对齐边界 → 延迟降低 62.5%

💡 关键创新

  • 端到端流式 LLM-ASR,无需 CTC 强制对齐
  • minLT(Minimum Latency Training)损失约束对齐边界,显著压缩生成延迟
  • 流式/非流式模型参数共享,联合训练降低开发成本

📊 训练数据 & 实验结果

  • 数据:AISHELL-1(165h)+ AISHELL-2(1000h)+ 内部多领域数据
  • AISHELL-1 CER 5.1% / AISHELL-2 CER 5.5%,优于所有流式 baseline;token 生成延迟降低 62.5%

☠️ 犀利点评

踏实的工作。别人做流式 LLM-ASR 要么靠外挂 CTC 对齐、要么用 wait-k 硬切块,它真的用 MoChA 自适应分段、端到端训练。minLT loss 把延迟压了 62.5% 这个数字有真实工程价值。但实验只在中文数据集(AISHELL-1/2)上跑,基线列表里 BESTOW 是他们自己复现的,存在选择性对比嫌疑。MoChA 本身并不新,核心贡献是把它接到 LLM 上——有价值,但不算突破性创新。

⭐ 评分 : 8/10

14. Chunk-wise Attention Transducers(CHAT)for Fast and Accurate Streaming Speech-to-Text

arXiv ID : 2602.24245

发布日期 : 2026-02-27(提交于 2025 年底)

发表状态 : ICASSP 2026

机构 : Apple / Google

论文链接 : https://arxiv.org/abs/2602.24245

📌 简介

提出 CHAT,将 RNN-T 的逐帧 additive joiner 替换为 chunk 内 cross-attention joiner。保留 RNN-T 流式能力同时引入局部对齐建模的灵活性,无需对齐时间戳信息。对语音翻译(ST)的提升尤其显著。

🔧 架构示意

音频流 → 流式 FastConformer Encoder(chunk-aware)
                    ↓ 按固定 chunk 输出
         CHAT Joiner(替换原 RNN-T joiner)
         ┌─────────────────────────────────────┐
         │ Predictor 输出(文本历史)→ Query     │
         │ Encoder chunk 输出(音频)→ Key/Value │
         │   ↓ cross-attention(chunk 内)       │
         │   ↓ + Predictor 残差 + ReLU           │
         │   ↓ → 词表空间概率分布                │
         └─────────────────────────────────────┘
                    ↓ blank → 下一 chunk;非 blank → 输出 token

💡 关键创新

  • chunk 内 cross-attention joiner 放宽 RNN-T 严格单调对齐约束
  • 无需时间戳信息训练,改动极小但效果稳健
  • 对语音翻译(ST)提升尤其显著(+18% BLEU)

📊 训练数据 & 实验结果

  • 数据:NeMo 多语种数据;语音翻译:MuST-C v2
  • ASR WER -6.3%;ST BLEU +18.0%;训练内存 -46.2%;训练速度 1.36x;推理速度 1.69x

☠️ 犀利点评

增量但扎实。chunk 内交叉注意力在 AED 框架里早就做过了,迁移到 Transducer joiner 上有工程价值但创新幅度有限。实验在 NeMo 框架内做,没有和 LLM-ASR 系统正面对比,不清楚在最新 LLM-based pipeline 中是否还有竞争力。对语音翻译(ST)的提升(+18% BLEU)更惊艳——RNN-T 严格单调约束对翻译是真正的硬伤,这篇有效解决了这个问题。

⭐ 评分 : 7/10

15. Uni-ASR: Unified LLM-Based Architecture for Non-Streaming and Streaming ASR

arXiv ID : 2603.11123

发布日期 : 2026-03-11

发表状态 : Submitted to Interspeech 2026

机构 : 科大讯飞 / 多校

论文链接 : https://arxiv.org/abs/2603.11123

📌 简介

提出 Uni-ASR,用统一 LLM 框架同时支持非流式和流式语音识别,无需任何架构改动即可切换两种模式。引入三种训练范式联合训练(NS/SS/CS)和 latest-token fallback 解码策略,在不增加延迟的前提下提升流式精度。

🔧 架构示意

音频 → FireRedASR Conformer Encoder(full + dynamic chunk attention)
                    ↓ Adapter
         Qwen3-1.7B(Decoder-Only LLM)

训练时:NS / SS / CS 三范式 1:1:1 采样
    ├── NS:非流式,全序列输入
    ├── SS:流式,强制对齐切块,speech-text interleaved
    └── CS:context-aware 流式,输入最后 token 置 <pad>,学跨 chunk 重解码

推理时:
    流式:KV Cache 跨 chunk 增量复用
          latest-token fallback(最后 token 等下一 chunk 再确认)
    非流式:直接全序列解码

💡 关键创新

  • 单模型统一流式/非流式,三范式 1:1:1 联合训练
  • context-aware streaming(CS)训练范式消除训练推理 mismatch
  • latest-token fallback 解码策略:边界 token 延一 chunk 确认,实测无额外延迟

📊 训练数据 & 实验结果

  • 数据:中英双语混合——WeNetSpeech(10000h+)+ AISHELL + LibriSpeech + GigaSpeech + 内部数据
  • 流式 AISHELL-1 CER 2.15% / LibriSpeech test-clean WER 2.44%(1000ms chunk)
  • 超越 Speech ReaLLM、SpeechLLM-XL、MoCha-ASR

☠️ 犀利点评

“大而全”路线的代表作,工程细心度高。但本质是既有技术的精心组合:interleaved speech-text(借鉴 CosyVoice2)、hold-n 策略(已有)、KV cache reuse(已有)。fallback 解码的 idea 小而实用,但不算重大创新。Qwen3-ASR-1.7B 在他的 streaming benchmark 里数字更好,但 Qwen3 是靠重复非流式解码凑出来的流式,计算量差了一个数量级——Uni-ASR 没把计算复杂度公平列出是一个败笔。

⭐ 评分 : 7/10

https://mp.weixin.qq.com/s/rSk0WBc4VjW0dkqBspKofA

16. NIM4-ASR: Towards Efficient, Robust, and Customizable Real-Time LLM-Based ASR ⭐

arXiv ID : 2604.18105

发布日期 : 2026-04-20

机构 : NIO / 蔚来汽车

论文链接 : https://arxiv.org/abs/2604.18105

📌 简介

面向生产部署的 LLM-ASR 框架,系统解决轻量化、幻觉抑制、热词定制三大痛点。基于 phoneme-level encoder 预训练减少模态差距,引入 Iterative Asynchronous SFT(IA-SFT)防止 representation drift,设计 ASR 专用 RL 提升识别质量,并以 phoneme RAG 实现百万量级热词定制。

🔧 架构示意

音频 → 600M Conformer Encoder(phoneme CTC 预训练,CKA 监控 drift)
                    ├── 流式:dynamic-chunk mechanism(预训练期内嵌)
                    └── phoneme CTC head → 音素假设
         MLP Adapter(4x 下采样,160ms/token)
                    ↓
              Qwen3-1.7B(LLM 解码器)
                    ↑
         Phoneme RAG:音素假设 → 检索热词数据库(<1ms)→ Prompt 注入

训练 pipeline:
    Stage1: Encoder 预训练(phoneme CTC,CR-CTC)
    Stage2: Alignment(仅训练 Adapter,冻结其余)
    Stage3: IA-SFT(异步并行,CKA 监控 encoder 稳定性)
    Stage4+5: Late Joint SFT + Context SFT + ASR-RL

💡 关键创新

  • Phoneme-level encoder 预训练:低熵表示减少模态差距,天然支持流式
  • IA-SFT:异步 SFT 在对齐阶段即开始,CKA 监控防止 representation drift
  • ASR-RL:专为 ASR 设计的强化学习,进一步提升识别质量和幻觉鲁棒性
  • Phoneme RAG:百万热词定制,检索延迟小于1ms

📊 训练数据 & 实验结果

  • 数据:25 个 benchmark(15 公开 + 10 内部);中英双语大规模内部数据
  • 2.3B 参数达到多个公开 benchmark SOTA;内部 entity-intensive 场景大幅领先

☠️ 犀利点评

NIO 车载场景出发的工业论文,工程诚意十足。phoneme-level encoder 预训练、IA-SFT 防 drift、ASR-RL、百万热词 RAG——每个模块都是真实生产痛点的解法。CKA 动态监控 encoder 表示偏移这个手段很细。但核心数据不公开,学术可复现性为零;”25 个 benchmark SOTA”要打折——主要赢在内部实体密集场景;Streaming 支持是”优化了”而非”重新设计了”,技术细节披露克制。

⭐ 评分 : 8/10

17. UAF: A Unified Audio Front-end LLM for Full-Duplex Speech Interaction

arXiv ID : 2604.19221

发布日期 : 2026-04-21

机构 : NIO / 蔚来汽车

论文链接 : https://arxiv.org/abs/2604.19221

📌 简介

提出第一个面向全双工语音系统的统一音频前端 LLM(UAF)。将 VAD、轮换检测(TD)、说话人识别(SR)、ASR、QA 等多种前端任务统一为单一自回归序列预测问题,以 600ms 固定时长流式音频块为输入,输出控制状态 token 驱动系统状态机。

🔧 架构示意

音频流(600ms 固定块)
    ↓
音频编码器 → 特征提取
    ↓
LLM(自回归)
    ├── 语义 token(转录内容)
    └── 控制 token(VAD状态/说话人切换/打断信号/QA触发)
    ↓
全双工系统状态机(接收控制 token 驱动)

💡 关键创新

  • 首个统一全双工前端任务的 LLM 方案(VAD + TD + SR + ASR + QA)
  • 600ms 块级流式输入,覆盖打断检测等实时控制场景
  • 控制 token 与语义 token 联合自回归生成,端到端降低系统延迟

📊 训练数据 & 实验结果

  • 数据:内部全双工系统数据(规模未公开)
  • 全双工响应延迟和打断检测精度显著改善(具体数值未完整披露)

☠️ 犀利点评

方向正确,全双工语音系统是当下最热的方向,把 VAD、轮换检测、说话人识别、ASR 统一成一个 LLM 在实际部署里最省事。600ms 块级输入跑打断检测,延迟在可接受范围。但这篇信息密度偏低,关键性能数字语焉不详(”显著改善”没有具体数值),训练数据完全不透明,和 Moshi、Mini-Omni2 等全双工系统的横向对比缺失。暂时更像一篇系统描述报告,不是严谨研究论文。值得关注方向,不值得深度跟踪。

⭐ 评分 : 7/10

全景速览对比表(17 篇)

#论文 / 系统年份机构核心方法关键创新数据规模流式支持主要效果评分
1Prompting LLMs with Speech (2307.11795)2023Meta AIGPT-style: Conformer prefix + LLaMA-7B首批验证 Speech+LLM 范式;冻结 LLM 可学多语言MLS 44.5k hWER 4.3%(MLS en)6/10
2Chunked AED Streaming (2309.08436)2023RWTH/GoogleEOC token 驱动 chunk-wise AEDAED ≈ Transducer 理论统一;长音频泛化LibriSpeech 960h✅ chunkWER 2.7%(test-clean)7/10
3SLD Decoder-Only ASR (2311.04534)2023Alibaba DAMO离散 token + KL 散度 SLD 训练损失优化音频 token 自回归建模训练目标LibriSpeech 960h超越 Loss Masking6/10
4BESTOW (2406.19954)2024NVIDIAtext query cross-attention + read-write policy首个开源多任务流式 SpeechLLM87k h 多语言✅ adaptiveWER 1.9%(LibriSpeech clean)8/10
5Seed-ASR (2407.04675)2024ByteDance预训练→SFT→RLHF + 上下文 promptRLHF 用于 ASR;prompt 注入热词/领域数十万 h 中英❌ 离线内部多场景 SOTA7/10
6Transducer-Llama (2412.16464)2024Meta AIFactorized Transducer + 弱到强 LM swapswap 绕过 RNN-T+LLM 联合训练陷阱MLS 44.7k h 多语言✅ TransducerWER -32% vs RNN-T8/10
7Multi-token Prediction (2409.12116)2024JHU / Meta每步预测多个未来 tokenASR 条件化使多 token 接受率高LibriSpeech 960h3.2x 加速,WER 无损6/10
8MFLA (2506.03722)2025Honor / 上交CIF predictor + MFLA 有限右上下文CIF 软对齐替代 fixed-chunk;统一离线/在线WenetSpeech4TTS + LibriSpeech + MLS✅ wait-k在线 WER 7.17%;延迟 -14.5%7/10
9SpecASR (2507.18181)2025厦大 / 多校Draft+Target LLM 推测解码自适应草稿长度;稀疏 token 树公开 benchmark3.04x–3.79x 加速,精度零损失8/10
10WhisperKit (2507.10860)2025Argmax块对角 mask 自蒸馏 + ANE 量化端侧原生流式;静音缓存;1.6G→0.6GCommonVoice 17✅ 0.46sWER 2.2%,超越云端 GPT-4o7/10
11JEDIS-LLM (2511.16046)2025阿里巴巴SPC + Word-level Speaker Supervision首个零样本流式长音频联合 ASR+说话人分离短音频 ≤20s✅ chunk超越 Sortformer/DiarizationLM8/10
12Whisper-LLaDA (2509.16622)2025IDIAP / 多校Whisper encoder + LLaDA-8B 扩散解码首次验证扩散 LLM 用于 ASR;音频条件化是关键LibriSpeech 960h级联 WER 2.25%/4.94%;扩散更快但精度略低7/10
13MoCha-ASR (2601.22779)2026合工大 / 多校MoChA 策略网络 + Qwen2.5 + minLT loss端到端无 CTC 对齐流式 LLM-ASRAISHELL-1/2 + 内部✅ adaptiveAISHELL-1 CER 5.1%;延迟 -62.5%8/10
14CHAT (2602.24245)2026Apple / GoogleChunk 内 cross-attention joiner放宽 RNN-T 严格单调约束;AST 显著提升NeMo 多语言✅ chunkWER -6.3%;BLEU +18%;推理 1.69x7/10
15Uni-ASR (2603.11123)2026科大讯飞 / 多校NS/SS/CS 三范式联合训练 + fallback 解码单模型统一流式/非流式WeNetSpeech 10k h+✅ 多 chunk sizeAISHELL-1 CER 2.15%(1s chunk)7/10
16NIM4-ASR (2604.18105)2026NIO / 蔚来phoneme CTC 预训练 + IA-SFT + RL + RAG百万热词 RAG小于1ms;IA-SFT 防 drift25 benchmark + 内部大规模✅ chunk2.3B 多 benchmark SOTA8/10
17UAF (2604.19221)2026NIO / 蔚来600ms chunk LLM + 多任务统一首个全双工前端 LLM;控制 token 驱动状态机内部全双工数据✅ 600ms全双工延迟和打断精度改善(未披露具体数值)7/10

趋势演变与技术脉络

三条主线演进路径

① 解码框架进化 :GPT-style prefix(2023)→ read-write policy BESTOW(2024)→ MoChA adaptive MoCha-ASR(2026)→ 统一 NS/SS/CS Uni-ASR(2026)

② 效率工程化 :Multi-token prediction(2024)→ Speculative Decoding SpecASR(2025)→ 端侧 ANE 极致优化 WhisperKit(2025)→ 热词 Phoneme RAG NIM4-ASR(2026)

③ 多任务融合 :单纯 ASR(2023)→ 上下文感知 Seed-ASR(2024)→ 联合说话人分离 JEDIS-LLM(2025)→ 全双工前端统一 UAF(2026)

里程碑节点

  • 2023 : LLM-ASR 范式成立(Speech Prompt + LLM),流式是空白
  • 2024 : BESTOW 确立 read-write policy 框架,Transducer-Llama 给出 RNN-T 最优解,Seed-ASR 工业化落地
  • 2025 : 推理加速爆发(SpecASR 3x+),端侧部署成熟(WhisperKit 0.46s),多任务融合(JEDIS-LLM)
  • 2026 : 统一架构(Uni-ASR),生产全功能(NIM4-ASR),全双工前端(UAF)

中文同音字替换ASR纠错系统技术实现

原创:智声工坊

https://github.com/xinliu9451/homophone-repla

1. 技术概述 (Technical Overview)

本系统是一个高性能的中文同音字/词纠错引擎,旨在解决中文语音识别(ASR)后处理或文本输入中常见的同音字错误问题。系统采用 离线模型构建 与 在线实时推理 相结合的架构,利用 有限状态转换器 (FST) 技术实现大规模规则的高效匹配与替换。

1.1 核心技术栈 (Technology Stack)

  • 构建端 (Build Time):
    • Python: 脚本语言,用于数据处理和模型生成。
    • Pynini: Google 开发的 Python 库,用于构建、操作和优化有限状态机(FST)。它基于 OpenFST 库,提供了高级的 Python 接口来定义语法规则。
  • 运行端 (Runtime)
    • C++: 核心引擎开发语言,保证高性能和低延迟。
  • CppJieba: 结巴分词的 C++ 版本,提供高效的中文分词和词性标注功能。
  • KaldiFST (kaldifst): Kaldi 语音识别工具包中的 FST 处理组件(提取版),用于在 C++ 环境下加载和执行 OpenFST 模型。
  • CMake: 跨平台构建系统。

2. 核心技术流程与实现细节 (Implementation Details)

系统的实现分为两个主要阶段:离线 FST 纠错模型生成 和 在线纠错推理

2.1 阶段一:离线 FST 纠错模型生成 (Offline Model Generation)

该阶段的目标是将人工维护的“拼音-汉字”替换规则编译成一个高效的二进制 FST 文件 (replace.fst)。

2.1.1 规则定义与构建

代码位置homophone-replacer/make_replace/main.py

实现步骤:

1.引入库: 使用 pynini 库,它是生成 FST 的核心工具。

2.定义字符集 (Sigma):

# 定义全集,utf8.VALID_UTF8_CHAR.star 表示任意合法的 UTF-8 字符串序列sigma = utf8.VALID_UTF8_CHAR.star

这是 FST 中的“通配符”概念,用于处理那些不需要替换的背景文本。     

3. 构建替换规则 (Cross Products):  

使用 pynini.cross(input, output) 定义单个替换对。输入是拼音序列(不带声调或带数字声调均可,取决于设计),输出是目标汉字

# 示例:将拼音 "dan1ni2er3bo1wei2" 替换为 "丹尼尔·波维"
rule1 = pynini.cross("dan1ni2er3bo1wei2", "丹尼尔·波维")# 支持多对一映射(纠错核心):将错误的拼音形式也映射到正确汉字
rule10 = pynini.cross("dan1ni2er3bo1wei4", "丹尼尔·波维")

  4.规则并集 (Union) 与优化:     将所有独立的规则通过“或”运算 (|) 合并为一个大的状态机,并调用 .optimize() 进行确定化(Determinization)和最小化(Minimization),以减小模型体积并提高搜索速度。

 rule = (rule1 | rule10 | rule2 | ...).optimize()

   5. 上下文重写 (Context-Dependent Rewrite):             使用 cdrewrite 编译最终的替换转换器。虽然此处上下文为空(即无条件替换),但 cdrewrite 会处理复杂的边界情况,并允许替换规则在文本流中多次应用。

# cdrewrite(规则, 左上下文, 右上下文, 字符集)rule = cdrewrite(rule, "", "", sigma)

    6. 序列化: 将编译好的 FST 写入 replace.fst 二进制文件。

2.1.2 技术难点

规则冲突管理: 当存在包含关系的规则(如 ping1 和 ping1guo3)时,FST 需要正确处理“最长匹配”优先,这通常由 FST 的权重或 cdrewrite 的左/右最长匹配策略保证。

模型体积控制: 随着规则数量增加,FST 状态空间可能指数级增长。通过 optimize() 进行最小化是必不可少的步骤。


2.2 阶段二:在线纠错推理 (Online Inference)

该阶段在 C++ 环境中运行,加载 replace.fst,对输入的中文文本进行实时纠错。

2.2.1 初始化 (Initialization)

1.加载分词器: 初始化 JiebaWrapper,加载 jieba.dict.utf8 等词典文件。

2.加载拼音映射: 读取 lexicon.txt,构建 word2pron_ 哈希表(std::unordered_map),用于将中文词转换为拼音。

3.加载 FST 模型: 使用 kaldifst::TextNormalizer 加载离线生成的 replace.fst

4.加载动态规则: 解析命令行或配置文件中的临时规则,存入 runtime_rule_map_

2.2.2 核心处理流水线 (Processing Pipeline)

代码位置src/homophone-replacer.cc 中的 Apply 方法。

Step 1: 文本分词 (Segmentation)

操作: 调用 Jieba 对输入句子进行分词。

目的: 相比于逐字处理,分词能够保留语义单元。更重要的是,基于词的拼音转换能有效解决多音字问题(例如,“重”在“重要”和“重复”中读音不同,分词后查词典能得到准确拼音)。

Step 2: 拼音序列构建 (Pinyin Conversion)

 •逻辑: 遍历分词结果。

 •查词典: 优先在 lexicon.txt 中查找整个词的拼音。       

 •回退策略: 如果词典中不存在(如未登录词),则将词拆解为单字,逐字查拼音并拼接。         •非中文字符处理: 数字、标点、英文等不进行转换,作为“锚点”保留在序列中。

 •     输出: 构造出一个与原文本对应的拼音流

Step 3: FST 规则匹配与替换 (FST Normalization)

操作: 调用 kaldifst::TextNormalizer::Normalize

输入: 原始词序列 + 拼音序列。

机制:

       •FST 引擎在拼音序列上进行“行走”。     

 •如果拼音序列匹配了 replace.fst 中的某条路径(例如 xuan2jie4),FST 将输出对应的 Output Label(即纠错后的汉字“玄戒”)。       

•如果未匹配,则按原样输出原始词。

•  技术优势: FST 可以在一次遍历中完成所有规则的匹配,时间复杂度为 $O(N)$(N为文本长度),与规则数量无关。

Step 4: 动态规则后处理 (Dynamic Runtime Overrides)

场景: 针对 FST 模型未覆盖,或需要临时紧急修正的 Case(如刚发布的新产品名)。

逻辑   •在 FST 输出的基础上,再次全句转拼音。     •使用 add_rules 中定义的规则进行最长字符串优先匹配。   •定位到匹配的拼音区间后,反算出对应的原词位置,进行强制替换。


3. 关键技术难点与创新点 (Challenges & Innovations)

3.1 创新点 (Innovations)

1. “分词辅助”的拼音转换策略 (Segmentation-Aided Pinyin Conversion)

传统痛点: 简单的“汉字转拼音”极易受多音字影响(如“长”读 chang 还是 zhang),导致拼音流错误,进而导致纠错失败。

本项目创新: 利用成熟的 NLP 分词技术和词典,先切词再转拼音。利用词典中预置的注音信息消除多音字歧义,大幅提高了拼音流的准确性,这是后续高精度纠错的基础。   

2. 基于 FST 的高性能流式纠错 (High-Performance FST Correction)

传统痛点: 如果使用正则表达式或字符串查找表(HashMap),在规则数量达到成千上万条时,匹配速度会显著下降,且难以处理跨词边界的匹配。

本项目创新: 将所有规则编译进一个静态的 FST 图中。无论规则库多大,匹配耗时仅与输入文本长度线性相关。这使得系统极具扩展性,能轻松支撑百万级词条的实时纠错。     

3.  静态与动态双模融合 (Hybrid Static-Dynamic Architecture)

设计: 系统结合了“编译型 FST”(静态、高效、覆盖广)和“解释型 Runtime Map”(动态、灵活、即时生效)。

价值: 既解决了通用场景的高性能需求,又满足了业务场景中“热更新”和“紧急干预”的刚需,无需每次修改规则都重新编译耗时的 FST 模型。

3.2 技术难点 (Challenges)

1. 拼音与文本的对齐问题:

问题: FST 是在拼音层面上工作的,输出的是替换后的汉字。如果仅仅替换了部分拼音,如何确保输出的文本与原文本的其他部分(如标点、未替换的词)正确拼接?

解决: 系统维护了 words(原词)和 pronunciations(拼音)的双重队列,并在 FST 归一化过程中保持同步。动态规则处理时,设计了复杂的下标映射算法,将拼音字符串的偏移量精确映射回词向量的索引,确保替换操作不会破坏句子结构。     

2. 多音字与未登录词的覆盖率:

问题: 词典不可能包含所有词,未登录词(OOV)的拼音转换容易出错。

解决: 采用了“词典优先 + 单字兜底”的策略。虽然单字转换无法处理语境相关的多音字,但作为兜底方案保证了系统的鲁棒性,不会因为一个词不认识就导致整个流程崩溃。

4. 总结

本项目通过引入 Pynini/FST 技术,构建了一个工业级的中文同音字纠错方案。其核心竞争力在于:利用 FST 解决了大规模规则匹配的性能瓶颈,利用分词技术解决了多音字转写的准确性问题,并辅以动态规则机制提供了极佳的工程落地灵活性。

项目代码:https://github.com/xinliu9451/homophone-replacer[1]

References

[1]https://github.com/xinliu9451/homophone-replacer