AmphionASR | 热词、目标说话人、耳语——四种条件化 ASR 塞进一个 1.7B SpeechLLM
AmphionASR | 热词、目标说话人、耳语——四种条件化 ASR 塞进一个 1.7B SpeechLLM
原文:AmphionASR: Personalized Context-Aware Speech Recognition(Amphion Team,2026.07.28 技术报告)
1. 前言吐槽
先交代下背景:ASR 现在的尴尬不是”识别得不准”,是”在 benchmark 上准,一到真实场景就废”。
这个落差有多具体?拿这篇论文里的数字说话。Qwen3-ASR-1.7B 在 AIShell-1 上 CER 1.58%、LibriSpeech test-clean 上 WER 1.61%——中文按字算错误率所以用 CER,英文按词算所以用 WER,都是”要改动多少个字/词才能把识别结果变成标准答案”,越低越好。1.58% 这个精度已经好到没什么可优化的了。但同一个模型:
- 拿去做 GigaSpeechBench 的垂域实体识别,中文 12 个领域的实体错误率平均 18.63%——公司名、药品名、专业术语,十个里错两个
- 拿去做目标说话人转写(给一段 3-5 秒的注册音频,只要转写这个人说的话),WER 78.99%,基本等于不可用
- 更离谱的是,在”目标说话人根本没出现”的那 164 条静音负样本上,它的误报率是 100.00%——一句话都没有,它硬编出来 164 段文字
也就是说,benchmark 上的 1.58% 和真实需求之间隔着一堵墙,而墙那边的每种情况都有自己的名字:热词、多人抢话、远场混响、小声耳语。
工业界的常规解法是拼流水线:热词接一个 boosting 模块,多人混说前面挂语音分离,噪声混响前面挂降噪增强,耳语单独训一个模型。这套做法能work,但代价很实在——四套模型各自的延迟叠加,各自的训练/评测/版本管理叠加,而且前一级的误差会被后一级放大(分离前端把目标人的高频削掉了,后面的 ASR 只能在残缺信号上猜)。
转机出现在 ASR 换代之后。这个领域大致走过四代——HMM–DNN 混合系统(声学模型/词典/语言模型三件套 + 多阶段解码)、端到端神经模型(CTC、attention encoder-decoder、RNN-T,Conformer 是代表)、自监督预训练(wav2vec 那一系)、大规模弱监督(Whisper)——现在到了第五代:把音频编码器直接接到一个 LLM 前面,音频编码成 embedding 当 token 喂进去,由 LLM 自回归地把文字解码出来。这类模型现在一般叫 SpeechLLM,注意这不是某个模型的名字,而是这一类架构的统称(有人也叫 Audio LLM、omni model,指的是同一件事),Qwen3-ASR、Kimi-Audio、Step-Audio 2、MiniCPM-o、GLM-ASR-nano 都属于这一类,AmphionASR 的 base 就是 Qwen3-ASR-1.7B。
解码器变成 LLM 之后,多了一个前四代都没有的东西:prompt 是一个天然的条件通道。以前给 ASR 传”额外信息”要改架构(加 attention 分支、加 bias encoder),现在只要往 prompt 里塞文字或者塞一段音频 embedding 就行。热词是一行文字,注册音频是一段 embedding,耳语只是换一句指令。这四件在流水线时代形态完全不同的事,在 SpeechLLM 里输入形态被统一了。
于是问题就变成:输入形态统一,模型参数能不能也统一?
这个问题的赌注很清楚。如果能——一套 2B 参数、四个 prompt 模板,ASR 部署从”拼装流水线”变成”改 prompt”,工程成本量级下降。如果不能,各任务互相打架,那 SpeechLLM 只是把流水线里的某一环换了个实现,架构收益为零。
AmphionASR 是 Amphion 团队上周(2026.07.28)放出的技术报告,做的就是这件事:1.7B 的 SpeechLLM(含音频编码器共 2.0B),一套参数,四种条件化识别。它的结论有几处相当漂亮(耳语识别中文 CER 0.58%、英文 WER 6.11%,两个语言同时第一),也有几处坑得挺明显(不给热词的时候,实体识别比它自己的 base 模型还差)。今天想和大家聊聊这两面。
2. 四种条件化 ASR 分别在解决什么
先把这四个任务讲清楚,不然后面的实验数字没法读。所谓”条件化”,就是除了音频之外你还多给模型一点东西——一个热词表、一段注册音频、或者一句”这是耳语”的指令,用来指定要转写什么、在什么条件下转写;普通 ASR 则是无条件的,音频进、文字出,仅此而已。论文的封面图把四种能力画得很直观:

- 热词条件化(Hotword ASR):用户给一个词表(人名、产品名、专业术语),模型要优先往这些词上偏。解决的是”罕见实体和领域术语识别不准”——一个没见过”Amphion”这个词的模型会把它转成”an fion”或者”安非”。
- 目标说话人识别(TS-ASR):给一段 3-5 秒的注册音频,输入是多人重叠的混合语音,模型只转写注册那个人说的话,其他人的内容一个字都不能出。注意这比”说话人分离”要求更高——它还必须能在目标人没说话时输出空。
- 退化鲁棒(Degradation-robust ASR):远场拾音、加性噪声、混响回声、录音染色、电子失真、传输丢包,以及这些的叠加。
- 耳语识别(Whispered-speech ASR):耳语的发声机制和正常说话不一样——声带不振动,没有基频,能量低、频谱结构完全不同。对一个只在正常语音上训过的模型来说,这基本是分布外输入。
论文强调的一点是:这四种设定的”边信息”和声学条件各不相同,但期望输出完全一样——就是被请求那段语音的文字。这个观察是统一建模的立足点:既然输出空间一样,那差异就可以全部推到输入侧去表达。
3. 架构:所有条件都从 prompt 进来
整体结构如下图,三个部件:音频编码器、文本分支、检索分支。

对着图走一遍数据流:
- 底部三个输入:Instruction(文字指令)走 Text Tokenizer;Input Speech(待识别音频)走 Audio Encoder;Enrollment Speech(注册音频,虚线表示可选)走同一个 Audio Encoder。
- 中间的检索分支(虚线框):编码后的语音当 query 去查 Hotword Database,RAG 模块取出 top-K 热词,经 Contextual Biasing 变成一串 context text token 插进序列。这里的 RAG 还是熟悉的那个检索增强生成,只是被检索的不是文档而是热词条目,query 也不是文字而是音频;contextual biasing 则是 ASR 的老词了,就是”用外部给的上下文把解码结果往某些词上带”。
- LLM 顶部:把 instruction token + context token + speech embedding + enrollment embedding 拼成一个 prefix,自回归解码出转写结果,每个吐出来的 token 回喂给下一步。
几个参数量的账(论文 Table 1):
| 组件 | 参数量 | 来源 |
|---|---|---|
| 音频编码器 | 300 M | Qwen3-ASR-1.7B 的 AuT encoder |
| LLM | 1.7 B | Qwen3-ASR-1.7B 的语言主干 |
| RAG adapters | 2.6 M | 两个 MLP adapter,从零训 |
| 总计 | 2.0 B |
按 LLM-based 系统的惯例,模型规模按 LLM 报,所以叫 1.7B 模型,实际总参数 2.0B。检索分支只花了 2.6M 参数,这个数字后面会变得很关键。
编码器的细节:16 kHz 单声道进来,log-mel 前端(128 个 mel bin、10 ms hop),过一个卷积下采样器,再过 24 层 Whisper 式 pre-LN Transformer,输出 12.5 Hz 的 2048 维帧级 embedding(也就是每 80 ms 一帧)。推理时用 800 帧的分块窗口,把有效输入时长推到标准 30 秒上限之外。LLM 是 28 层 decoder-only、2048 维隐状态、原生 64K 上下文。
四个任务靠 prompt 模板区分(论文 Table 2),全部共享同一套参数:
| 任务 | Prompt 模板 |
|---|---|
| 通用 ASR | Transcribe the following audio.{speech} |
| 热词 ASR | Transcribe the following audio.[Hotwords:...].{speech} |
| TS-ASR | Given the speaker's voice:{enroll} Transcribe what this speaker says in the following audio.{speech} |
| 耳语 ASR | Transcribe the following whispered audio.{speech} |
这里有个容易忽略的设计细节:热词列表没有专门的分隔符 token,Hotwords: 这个字面量本身就是 prompt 语法的一部分。也就是说模型是在训练里学会”看到 Hotwords: 后面跟的是候选词表”这件事的,没有任何架构改动。TS-ASR 也是同理——注册音频和混合音频走同一条编码器路径,只是作为两段有序的 audio embedding span 送进 LLM(注册在前,混合在后)。
这就是”统一”的实际含义:不是把四个模型的权重平均一下,是把四种条件全部编码进 prompt 的输入形态,然后让同一套参数在四种 prompt 下都表现正常。
4. 热词检索:大词表塞不进 prompt 怎么办
热词这条线是这篇论文写得最细的部分,也是唯一有完整消融的部分,值得单独展开。
4.1 问题:词表一大就塞不下
热词 boosting 的朴素做法是把用户词表整个塞进 prompt。这在词表小的时候没问题,词表一到上万条就两头堵:
- 超上下文预算——1 万条中文实体,按平均 3 个 token 算就是 3 万 token,把 64K 上下文吃掉一半
- 信噪比崩塌——解码器面对 1 万个候选,其中只有零星几个和当前这句话有关,剩下的全是干扰
所以必须先检索、再解码:从大词表里挑出和当前这句话真正相关的 top-K(论文取 K=50)塞进 prompt。问题转移成”怎么用一段音频去检索文字”。
4.2 CLAP 的思路和它的失效点
CLAP(Contrastive Language-Audio Pretraining)建立了对比式音频-文本对齐的基本配方:两个编码器把音频和文本映到同一个 embedding 空间,用对比学习训练,让配对的音频-文本内积高、不配对的低。可以理解成 CLIP 的音频版——CLIP 对齐图和文,CLAP 对齐音和文。套到热词检索上:把整句音频池化成一个音频 token 当 query,和每个候选热词算内积,取分数最高的 K 个。
这个做法在热词场景下有个结构性缺陷:

一句 10 秒的话,在 12.5 Hz 帧率下是 125 帧。里面的热词可能只占 0.3 秒、4 帧。整句池化会把这 4 帧的信息和其余 121 帧平均掉——你要找的那个短词,恰恰是被池化操作稀释得最厉害的东西。论文原话是这个表示会”obscure hotwords that occupy only short spans of a longer utterance”。
4.3 GLCLAP 式的逐帧打分
AmphionASR 跟随 GLCLAP(Global-Local CLAP,在 CLAP 的全局对齐之外多加一个局部对齐分支)改成帧级局部打分:

看图:原始音频过冻结的音频编码器,热词池 H 过冻结的 LLM 文本 embedding 表,然后各自过一个小的可训练 MLP adapter,映到共享的 512 维空间。打分公式是:
\[a_t = g_{\text{audio}}(\text{AuT}(x)_t), \quad k_h = g_{\text{text}}(E_{\text{tok}}(h)), \quad s_h = \max_t a_t^\top k_h, \quad H' = \text{TopK}_{h \in H}\, s_h\]关键是 $s_h = \max_t a_t^\top k_h$ 这个 max-over-time 归约:音频侧不做任何池化,保持帧级;每个候选热词和每一帧都算一次内积,取最大值作为这个词的分数。
这一下就把稀释问题解掉了——一个只出现 0.3 秒的词,只要在那 4 帧里有一帧匹配得足够强,它的分数就足够高。池化是取平均,这里是取最大,对短时事件的敏感度完全不同。
检索器的训练也很省:只更新那两个 MLP adapter(2.6M 参数),编码器和 token embedding 表全程冻结。训练目标沿用 GLCLAP 的全局-局部双向对比损失,唯一改动是局部分支的负样本采法——不用 GLCLAP 的 in-batch negatives,而是每条样本从同语言热词池里采 N=4095 个负样本,排除 batch 自己的热词,并且整个 batch 共享这批负样本,这样负样本的 embedding 每步只编码一次。10 个 epoch、lr 3e-4、可学习温度初始化 0.07、fp16、6 卡有效 batch 384,按 CommonVoice 上最佳 Recall@1 选 checkpoint。
2.6M 参数、编码器全冻——这个成本低到基本可以忽略,这也是我觉得这条技术路线最有吸引力的地方:它不动主模型,纯外挂。
5. 数据与训练:三阶段 LoRA SFT + GRPO
训练数据是 8 个精心构造的训练集、共 374 万条 utterance(语音这边的计数单位,一条就是一段话),从 11 个公开语料库搭出来。整条链路是三阶段 LoRA 微调打底,后面再挂 GRPO 和检索器训练,我画了张图:

分阶段说一下每一步为什么这么切:
Stage 1 — 退化 + 耳语,编码器和 LLM 一起训。用 Voice-in-the-Wild-2M(556,421 条,覆盖远场、噪声、混响、削波、丢包及其叠加)和 WhispEar(222,440 条双语耳语,其中英文 Emilia 子集 199,805 条、WTIMIT 子集 18,588 条、中文 wEar 子集 4,047 条)。这两个域的共同点是声学条件本身偏离干净语音,所以必须让编码器也动——退化和耳语要改的是”怎么听”,不是”怎么写”。
Stage 2 — 热词 + 目标说话人,编码器冻结。热词用五语料混合(104 万条),TS-ASR 用三个合成分区(62 万条)。这两个任务改的是”给定条件怎么组织输出”,属于 LLM 侧的能力,所以编码器锁住,只训 LLM。
Stage 3 — 回放防遗忘,编码器冻结。把 Stage 1-2 的数据全部回放,再混进 AISHELL-2 全量训练集(1,009,223 条)和 LibriSpeech(train-clean-100/360 + train-other-500,281,241 条)。目的很直接:前面两阶段全在训”特殊情况”,通用转写能力会退化。
GRPO。三阶段 SFT 之后,在 LLM 上再跑一轮 GRPO(编码器保持冻结)。这就是 DeepSeek 那个强化学习算法——同一个输入采一组 G 个候选输出,用组内奖励的相对高低当优势估计,省掉了单独训 value network 的麻烦。这里的序列级奖励由两项组成:
\[R_{\text{asr}}(\hat y, y) = \max(0,\ 1 - \text{CER}(\hat y, y))\] \[R_{\text{hw}}(\hat y, y; C) = \frac{1}{|C|}\sum_{c \in C} \mathbb{1}\{\mathbb{1}[c \in \text{Pred}] = \mathbb{1}[c \in \text{Ref}]\}\] \[R = 1.0 \cdot R_{\text{asr}} + 0.3 \cdot R_{\text{hw}}\]第一项是裁剪到 [0,1] 的负 CER,第二项是逐候选热词的二值一致性——注意它奖励的不是”把热词都写出来”,而是”该出现的出现、不该出现的不出现”。这个设计是有针对性的:热词 boosting 最典型的失败模式就是过度偏置,把 prompt 里的词硬塞进不该出现的位置。$R_{\text{hw}}$ 对假阳性和假阴性同等惩罚,正好压这个。GRPO 用 hotword 数据和通用转写数据 4:1 混合,group size G=16、采样温度 0.6、PPO clip ε=0.2、KL 系数 β=1e-3、lr 1e-6 训一个 epoch。
SFT 超参:全线性层 LoRA,rank 64、α=128;ms-swift + DeepSpeed ZeRO-1;每阶段一个 epoch,lr 1e-6 余弦衰减、5% warmup,6 卡有效 batch 384,1% 数据留作验证。
5.1 热词列表是怎么”造脏”的
训练时的热词列表不是把 ground-truth 直接塞进去——那样模型会学成”prompt 里有什么就抄什么”。论文的构造是三步:
- 真词:每个 ground-truth 热词以概率 0.05 独立丢弃,模拟检索召回不完美
- 难负样本:在线检索器按
0.6 · 字符重叠 + 0.4 · bigram-Jaccard的加权分数,从语料级热词索引里取最多 10 个易混词,中文额外加一层音节级最近邻搜索 - 随机干扰词:剩下的槽位从全局热词池随机填,总列表长度控制在 [10, 50]
最后,整行热词 prompt 以概率 0.8 保留、0.2 丢掉,让模型同时见过”有热词侧信道”和”没有”两种输入。
这一套的用意很清楚:丢真词教模型别依赖列表完整,难负样本教模型区分形近/音近词,随机词教模型忽略无关候选。三种失败模式各堵一个。
5.2 TS-ASR 的训练数据全是合成的
目标说话人的训练数据没有现成的,论文写了个离线合成器:

对着图走一遍:从 16 个单说话人语料(10 中文 + 6 英文)里采一个目标说话人 $s_{\text{tgt}}$,取两条不同录音——一条 3-5 秒当注册音频 $u_A$,一条当目标波形 $u_B$;把 $u_B$ 和 $K$ 个干扰人混合($K \sim \text{Cat}({1:0.8,\ 2:0.2})$,SNR $\sim \mathcal{N}(5, 7^2)$ dB,重叠比例 [0.1, 1.0],干扰人必须来自和目标不同的语料);以 0.5 的概率卷一个截断到 1.5 秒的房间冲激响应(RIR,来自 OpenSLR-26/28 的仿真和真实 RIR 池);再加背景噪声(SNR $\sim \mathcal{U}(0, 25)$ dB,MUSAN noise/music 权重 0.30/0.20 + AudioSet 路噪 0.50);最后峰值归一化。输出是一个三元组:(注册音频, 混合波形, 目标转写)。
图最下面那个虚线框是我觉得最值得注意的设计:anti-hallucination negatives——把一部分样本的目标说话人从混合里删掉,转写标成空。两种子类型:noise-only(真实注册音频 + 1-2 段噪声/静音)和 distractor-only(真实注册音频 + 1-3 个非目标说话人)。
为什么必须有这个?回到前言那个数字:Qwen3-ASR 在 164 条静音负样本上误报率 100%。一个只在”目标人在场”的正样本上训过的模型,从来没学过”输出空”这个动作,所以给它一段和注册人无关的音频,它一定会编。空输出是一个必须被显式教的行为。
(这里有个小瑕疵值得指出:图里写负样本占 shards 的 5-10%,但正文写的是”Five to fifteen percent”,而表 7 的实际数字是 66,194 / 624,503 ≈ 10.6%,多语料分区里更是 51,651 / 333,640 ≈ 15%。三处对不上,技术报告的常见小毛病。)
6. 实验:哪些是真赢,哪些要打折
论文评测覆盖 7 类任务(论文 Table 8):中文 ASR、英文 ASR、热词 ASR、TS-ASR、退化鲁棒、实体 ASR、耳语 ASR。我按”结论强度”重排一下顺序讲。
6.1 耳语识别:这个赢得最干净

中文 wEar 0.58% CER,英文 WTIMIT 6.11% WER,两个都是第一。这个结果值得单独夸,理由有三层:
第一,领先幅度不是误差范围内。WTIMIT 上比自己的 base 模型 Qwen3-ASR-1.7B(9.56%)低 3.45 个绝对点,比最好的非耳语训练基线 Kimi-Audio-7B-Instruct(10.95%)低 4.84 点。
第二,它是唯一在两个语言上同时最优的系统。看这张表的分布挺有意思:中文侧的系统间差距极大——Whisper-large-v3 16.33%、GLM-ASR-nano 15.41%,而耳语感知的几个系统(AmphionASR、FireRed-ASR2、Qwen3-ASR、Kimi-Audio)全部聚在 1.5% 以下。中文耳语对没见过耳语激励方式的主干来说基本是分布外输入。英文侧则是顶部被压缩(九个基线里六个落在 9.56%-11.99%),但有两个崩得很惨:Step-Audio 2 37.45%、MiniCPM-o 和 MOSS-Audio 都超过 21%——论文判断是插入型错误主导的失败模式。
第三,这个提升可以干净地归因。中文侧领先所有基线的幅度说明 Stage 1 的耳语 SFT 带来的是耳语发声本身的增益,不是通用识别质量的溢出(不然英文侧也该同比例领先,但实际英文侧提升幅度小得多)。而且两个语言同时最优,说明 Stage 1 的配方在中英耳语子语料上都泛化了,没有出现语言间的 trade-off。
6.2 热词检索:赢得实在,但两个坑要说清楚
先看中文垂域实体识别,GigaSpeechBench 的 12 个领域(农业、AI 技术、艺术、生物、电商、工程、娱乐、金融、人文、法律、医学、军事)。这里的指标是 B-CER,前面那个 B 是 biased,只统计实体 token 上的错误,句子其他部分错了不算。为什么要这么算?因为垂域场景在乎的从来不是整句准确率——虚词错一个无所谓,药品名错一个就是事故。英文那边对应的是 B-WER。

英文侧同样 12 个领域:

CommonVoice 上的大词表评测(这里能看到检索器本身的 Recall):

先说赢的部分:
- Recall@50 中文 94.52%、英文 95.19%,词表是 10,112 条中文和 10,000 条英文。Recall@50 就是”取回的这 50 条候选里,包住了多少比例该出现的热词”,越高越好。从一万条里捞 50 条,把 94% 以上的目标词捞进来了——干这活的只有那 2.6M 参数的 adapter
- 完整流水线把 GigaSpeechBench 的平均实体错误率从 23.18% 降到 10.39%(中文,相对降 55%)、从 14.78% 降到 9.35%(英文,相对降 37%)
- CommonVoice 上从 9.27% 降到 2.30%(中文 B-CER)、从 28.93% 降到 9.81%(英文 B-WER)
- 分领域看,检索条件下中文 12 个领域赢 Qwen3-ASR-1.7B 11 个、英文 12 个全赢
再说要打折的两个地方,这两点论文自己都写了,但很容易被读者的目光滑过去:
第一,不给热词的时候,它比自己的 base 模型还差。 中文 AVG B-CER:AmphionASR w/o RAG 23.18%,而 Qwen3-ASR-1.7B 是 18.63%。英文 14.78% vs 13.81%,同样是退化。这是很重要的一条信息——统一化不是免费的,多任务 SFT 在无条件实体识别上付了代价。所以那个”相对降 55%”的基线是它自己退化后的 23.18%,不是它 base 的 18.63%。如果拿 base 当基线,中文实际的相对降幅是 (18.63 − 10.39)/18.63 ≈ 44%,还是很可观,但和 55% 差着 11 个点。
第二,”打赢所有基线”这个话要看比较协议。 中文 AVG 上 AmphionASR w/ RAG 的 10.39% 确实是全表最低,但 FunASR-Realtime 是 10.91%,只差 0.52 个点,而且在单列上 FunASR-Realtime 在 AGR(6.11 vs 10.79)、AIT(15.75 vs 19.10)、MIL(2.41 vs 8.28)这几个领域是加粗领先的。更关键的是——所有基线都是在无热词输入的通用 ASR 条件下评的。论文自己写得很明确:”Because those baselines receive no hotword input, this comparison measures the complete retrieval-conditioned pipeline with added context rather than an isolated contribution of retrieval or a ranking under identical inputs.”
翻译过来:这是”有额外信息的系统”对”没有额外信息的系统”,不是同等输入下的排名。一个拿到了 50 个候选实体的系统赢一个什么都没拿到的系统,本来就该赢。这个比较能证明的是”热词条件化这条路有用”,不能证明”AmphionASR 的实体识别能力比 FunASR 强”。
6.3 检索延迟:几毫秒,但这个结论的适用范围很窄

三种条件:无热词、预计算 Top-50(把在线检索挪到计时区外)、在线检索。核心数字:
- 在线检索 vs 预计算,配对中位数只增加 1.37 ms(英文)和 3.25 ms(中文);配对 P95 增量分别是 7.92 和 7.17 ms
- 在线完整路径 vs 无热词,配对中位数增量 2.82 ms 和 5.61 ms
- 词表从 100 条扩到约 10,000 条,音频投影+检索这一段的均值只从 19.43 ms 涨到 20.46 ms(英文)、18.94 → 19.58 ms(中文),而 Recall@50 从 55.56% 涨到 94.44%、从 43.66% 涨到 97.18%
- K 从 10 加到 50,英文召回 83.33% → 93.75%,中文 75.93% → 92.59%;但延迟在 K ∈ {10, 25, 50} 三个取值上不单调
- 冷启动那一发是 800.91 ms,紧接着重复的那一发是 18.04 ms——差 44 倍
“词表扩 100 倍,召回翻倍,延迟只涨 1 ms”这个 scaling 结论很有说服力。但论文在这一节的自我限定写得极其克制,我原样搬过来:
These measurements are an initial latency characterization rather than a serving-capacity result: each configuration has only 30 utterances, no concurrent requests are tested, the GPU is shared, and the deployed default retriever remains the utterance-pooled variant.
三个限制:每个配置只有 30 条 utterance、没测并发、H20 是和其他服务共享的。而且最后半句信息量最大——实际部署的默认检索器还是整句池化那个版本,帧级检索器只在这组实验里跑了。也就是说 §4.3 那个漂亮的 max-over-time 设计,论文测了、报了,但没上生产。
还有一个细节值得注意:英文的在线均值(71.11)竟然低于预计算均值(72.67)。原因是有一发预计算请求把 P99 拉到 133.36 ms。所以论文用配对分位数而不是边际均值差来做隔离比较——这个处理是对的,共享 GPU 上的尾部噪声不该算进检索开销。
6.4 目标说话人:能力成立,但别当成 SOTA 读

正样本切片 WER 13.02%,对比零样本 Qwen3-Omni-30B-A3B 的 31.91%、Qwen3-ASR-0.6B 的 84.97%、1.7B 的 78.99%。
另一列 FA_sil 更值得看,FA 是 false alarm(误报),衡量的是目标说话人根本没出声时,模型有多大比例还是吐出了文字。AmphionASR 是 6.10%,也就是 93.90% 的情况下它正确地保持了沉默;而两个 Qwen3-ASR 基线都是 100.00%,一次沉默都没有。
从”两个 Qwen3-ASR 基线 78.99%/84.97% 的 WER + 100% 误报”到”13.02% + 6.10%”,这个跨度说明合成数据 + anti-hallucination negatives 这套配方确实把一个原本完全不存在的能力装进去了。
但要读两个附注:
第一,WER 和 FA 必须一起看。 论文特意点出正样本切片的 miss rate 是 4.13%——也就是有 4.13% 的正样本它输出了空。误报率低一部分来自”倾向于输出空”这个偏置,两个指标是耦合的,单看 6.10% 会高估。
第二,测试集是自己合成的。 论文原话:这些结果”do not establish competitiveness with dedicated TS-ASR systems under a matched protocol”,而且”do not isolate corpus or synthesis effects behind the in-house silence behaviour”。测试集是用和训练完全同一条流水线、只换随机种子和说话人生成的——同样的 RIR 池、同样的噪声池、同样的混合公式。这种 in-domain 评测的数字天然偏乐观,换成真实会议录音会掉多少,这篇没答。
6.5 退化鲁棒:16 个子集赢 8 个

Voice-in-the-Wild-Bench 5,000 条 clip,7 种原子退化 + Mixed,分 Real(真实互联网录音,每种原子退化 150 条 + 450 条 Mixed)和 Sim(谱级仿真,每种 350 条 + 1,050 条 Mixed)两个 split,共 16 个子集。
AmphionASR(Amph. 列)在 4 个 Real 子集 + 4 个 Sim 子集上 WER 最低,领先的条件集中在遮挡、回声混响、录音染色、传输丢包、仿真噪声。Mixed 上 Real-Mixed 第二(2.85 vs Mega-ASR 的 2.63)、Sim-Mixed 第一(4.19)。
有意思的是它领先的行恰恰也是它绝对误差最高的行:Sim 的回声混响 11.49%、录音染色 11.55%——比同一列其他子集高一个量级(远场 2.40%、遮挡 1.97%)。领先归领先,这两类退化对所有系统都还是硬骨头。这里的对手 Mega-ASR 是 Voice-in-the-Wild-Bench 自己那篇论文的方法,带环境感知路由——在自己 benchmark 上的主场方法只在 8 个子集上被超过,这个对比是有分量的。
6.6 通用能力保留:Stage 3 的回放起作用了吗
这部分论文放在附录,但我觉得对判断”统一化的代价”很关键:


拿它自己的 base(Qwen3-ASR-1.7B)逐列对:
| 测试集 | Qwen3-ASR-1.7B | AmphionASR | 变化 |
|---|---|---|---|
| LibriSpeech clean | 1.61 | 1.59 | 略好 |
| LibriSpeech other | 3.39 | 3.35 | 略好 |
| GigaSpeech | 8.68 | 9.53 | 退化 0.85 |
| CommonVoice en | 7.24 | 7.87 | 退化 0.63 |
| AIShell-1 | 1.58 | 1.34 | 好 0.24 |
| AIShell-2 | 2.77 | 2.65 | 略好 |
| KeSpeech | 5.21 | 5.71 | 退化 0.50 |
| CommonVoice zh | 5.06 | 5.21 | 退化 0.15 |
| WenetSpeech net | 5.04 | 5.17 | 退化 0.13 |
| WenetSpeech meeting | 5.85 | 6.30 | 退化 0.45 |
十个测试集里四个略好、六个略退化,退化幅度都在 0.15-0.85 个点之间。这个结果我认为算合格但不算漂亮:Stage 3 的回放把灾难性遗忘控制住了(没有出现成倍退化),但没做到完全无损。而且退化集中在 GigaSpeech、KeSpeech、WenetSpeech meeting 这几个更”野”的集合上——正好是训练回放里没有直接对应语料的那些(回放只放了 AISHELL-2 和 LibriSpeech)。回放能保住的是你放进去的那个分布,不是”通用能力”这个抽象概念。
7. 我的几点 take
第一,”统一”的真实价值在工程侧,不在精度侧。 通篇看完,AmphionASR 在几乎每个单任务上都不是无争议的最强——中文实体 FunASR-Realtime 只差 0.52 点,退化 16 个子集赢 8 个,通用 ASR 六个集合小幅退化。但它是同一套 2.0B 参数做完这些的,而且新增能力的边际成本极低(热词那条线只有 2.6M 参数)。对比”四套模型 + 胶水”的方案,这里省掉的是四份部署、四份监控、四份版本管理,以及模块间的误差传播。这个价值不会体现在任何一个 benchmark 的数字上,所以容易被低估。
第二,w/o RAG 那一栏是这篇论文最诚实也最有信息量的地方。 中文实体 23.18% vs base 的 18.63%——多任务 SFT 让它在无条件实体识别上退化了。这个数字放在论文里对作者没有任何好处,但它是判断这条路值不值得走的关键:统一化换来的是”条件通道打开时的大幅提升”,代价是”条件通道关闭时的小幅退化”。业务上如果热词侧信道总是可用,这笔交易划算;如果一半流量拿不到热词,得重新算。
第三,max-over-time 这个改动值得单独记住,它的适用范围比 ASR 宽得多。 池化的本质是求平均,平均操作对”短时强信号”是不友好的——你要找的东西越短,被稀释得越厉害。改成取最大就把这个问题绕开了。这个模式在别的检索场景里同样成立:长视频里检索一个 2 秒的动作、长日志里检索一次异常、长文档里检索一个实体。只要 query 对应的是被检索对象里的一个局部片段,逐位置打分 + max 归约就该优先于全局池化。
第四,anti-hallucination negatives 提醒了我一件容易忘的事:“输出空”是一个需要被显式训练的行为。 Qwen3-ASR 在 164 条静音上 100% 误报,不是因为它弱,是因为它的训练数据里从来没有一条样本的标签是空的。生成模型的默认行为是生成,”什么都不输出”必须作为一个正例被教。这条在 ASR 之外也一样——检索系统要学会返回空结果集,agent 要学会说”我不知道”,都是同一个道理。
第五,”帧级检索器测了但没部署”这个细节,是读技术报告时最该留意的那类信息。 §4.3 花了整节讲 max-over-time 的设计,§6.3 的延迟表也是用帧级检索器测的,但论文在限制说明里写着”the deployed default retriever remains the utterance-pooled variant”。这句话如果漏掉,你会以为帧级检索是这个系统的生产配置。技术报告的自我限定段落信息密度往往高于结论段落,因为结论段落写的是最好情况,限定段落写的是真实边界。
第六,负样本比例三处对不上,说明这篇的工程严谨度高于文本严谨度。 合成流程图里写 5-10%,正文写 5-15%,表 7 的数字算出来是 10.6%(多语料分区 15%)。不影响任何结论,但配合致谢里那句”Portions of this manuscript were drafted with the assistance of large language models”(作者声明所有技术内容、数值和引用都对着原始来源核对过),读起来挺有当下的时代感——LLM 辅助写作在细节一致性上的漏洞,和人类写作的漏洞形态不太一样:人容易前后观点矛盾,LLM 容易同一个数字在不同段落取不同值。
8. 一点吐槽和展望
写完这篇我的感受是:ASR 这个方向的竞争焦点已经从”CER 能压到多低”转到”条件通道能开多少个”了。
AIShell-1 上 1.34% 和 1.58% 的差别,对绝大多数业务来说没有意义。有意义的是:能不能塞热词、能不能指定说话人、噪声环境下会不会崩、小声说话能不能听见。这四件事在流水线时代是四个独立工程,在 SpeechLLM 时代变成四个 prompt 模板——这才是 SpeechLLM 相对传统 ASR 的真正架构收益,不是精度。
还没被回答的问题也不少:
- 条件之间会不会互相打架? 论文测的都是单条件(只给热词,或只给注册音频)。热词 + 目标说话人同时给会怎样?prompt 里既有
Hotwords:又有 enrollment span,这两个条件在训练里从来没同时出现过(Stage 2 里热词混合和 TS-ASR 是两批独立数据)。这个组合在真实场景里很常见(会议记录:只要某个人说的话,同时要保证公司名对)。 - 检索器的召回上限在哪? 一万条词表 Recall@50 是 94%,那十万条呢?max-over-time 是逐帧遍历全部候选,词表规模上去之后打分成本是线性增长的,这一点在 §6.3 的 100→10,000 实验里被 audio tower 的固定开销掩盖了(论文自己也提醒那段计时包含音频塔和投影器,不是纯相似度打分)。真正的检索成本曲线这篇没测。
- GRPO 到底贡献了多少? 论文自己写了”Without an SFT-only control, it does not isolate the contribution of GRPO from the preceding supervised stages”。$R_{\text{hw}}$ 那个双向惩罚的设计我很喜欢,但它值多少个点,现在是未知的。
欢迎评论区交流,尤其是在生产环境做过热词 boosting 或者目标说话人转写的同学——我挺想知道 in-domain 合成测试集和真实会议录音之间的落差实际有多大。
扯一句题外话。这篇论文的做法本质上是给一个固定主干挂上若干”条件适配模块”,再用分阶段训练调度让它们不互相干扰——三阶段决定哪个模块可训、回放阶段控制遗忘、检索器完全外挂只训 2.6M 参数。这个”模块化 + 训练调度”的思路,和 AutoML 里做架构自动化、压缩时考虑的问题是同一类:在给定预算下,哪些部分该动、哪些该冻、按什么顺序动。
我和合作者把这方面的积累整理成了《动手学 AutoML:从 NAS 到大语言模型优化实战》。这本书不涉及 ASR 和语音——检索式上下文偏置、目标说话人合成这些内容书里完全没有,我不想硬扯关系。它讲的是搜索空间设计、搜索策略(进化/贝叶斯/强化学习/DARTS)、架构评估,以及 LLM 方向的架构自动化、压缩(剪枝/量化)、模型融合,最后有几章实战。如果你关心的是”LoRA 该加在哪些层、rank 怎么选、多阶段微调的调度怎么定”这类能不能自动化决策的问题,书里 NAS 和 LLM 压缩那几章可能有些参考价值;如果你是来找语音方案的,这本大概帮不上忙。
