AgenticASR:语音识别不用等你说完一整句话,就能边听边改
AgenticASR:语音识别不用等你说完一整句话,就能边听边改
原文:AgenticASR: Refining Speech Recognition in Real-World Scenarios via an Agentic Approach
1. 前言:识别对了,不代表读得懂
这几年语音识别(ASR,Automatic Speech Recognition)的准确率已经卷得很高了,不管是 Whisper 还是 Qwen3-ASR 这类模型,字错率都压到了个位数。但把识别出来的文字直接读一遍,你会发现一个挺反直觉的现象:识别是对的,转录出来的文字却很难读。
原因很简单,人说话不是照着稿子念的。会有”嗯”“啊”这类填充词,会重复(”给他,给他发一下报告”),会说错了立刻改口,甚至说到一半改变主意重新组织句子。传统 ASR 做的是逐字转录(verbatim transcription)——你说什么它记什么,包括所有这些口语现象。这对法律取证之类的场景是刚需,但对语音助手、会议转录、口述录入这些场景来说,这些内容只会增加阅读负担,甚至可能被后面的意图识别、对话系统误解。
于是有了”口语转书面语”(spoken-to-written)这类后处理方案:等一整句话说完,再用一个模型把逐字稿转写成干净的书面文字,去掉填充词、修正自我纠错。Typeless 是这类系统的代表。
问题出在”等一整句话说完”这个前提上。真实对话里,说话人经常在后半句才修正前半句的内容——比如先说了”发给 Mary”,说完又想起对方名字拼法不一样,补一句”哦对了,是那个结尾 R-I-E 的 Marie”。这时候 offline 的后处理系统已经把”Mary”这段文字提交完了,没有机制回头改。
所以这里真正要解决的问题,不是”要不要清理口语内容”——这个已经有答案了——而是:能不能一边监听语音一边吐出干净文字,同时保留”过会儿反悔”的能力,用后面听到的内容去修正已经吐出来的那部分文本?
这篇论文给出的答案叫 AgenticASR,来自上海交大 X-LANCE 实验室。
2. 先分清两个名字:任务定义和系统实现
论文里有两个很像的名字,容易混。
AgenticSR(Agentic Speech Recognition)是论文定义的一个任务类别——把带口语现象的语音,识别成一份保留说话人最终意图的干净书面转录,而且要支持在说话过程中持续修正。它不是某个具体模型的名字,是一类问题的统称:去掉语义上空的填充词、重复和被放弃的自我修正片段;保留所有真正想表达的内容;把口语数字、日期这类表达转成书面形式(这个操作叫 ITN,逆文本归一化,比如把”三点二五”变成”3.25”);对已经干净的输入原样返回。
AgenticASR 则是论文提出的一套具体实现这个任务的系统。下图对比了传统 ASR、offline 后处理(以 Typeless 为代表)和 AgenticASR 三种做法的差异:

图里的例子很典型:用户说”帮我把报告发给 Mary”,中间用了”嗯”“对”这些填充词。传统 ASR 原样转录,连填充词和识别错的”Mary”都保留。Typeless 这类 offline 系统等一句话说完才处理,转出干净版本但名字还是错的——直到用户后面又补充”抱歉,我是说 Marie,那个结尾是 R-I-E 的”,Typeless 已经提交过的文本没法再改,只能靠用户自己发现说”哎,名字拼错了”。而 AgenticASR 在用户说完第一句时就先吐出一版干净转录,等听到后面的纠正后,直接把之前吐出的”Mary”原地替换成”Marie”。
3. 架构:现成的 ASR 前端,加一个专门”翻译口语”的小模型
AgenticASR 的设计思路很直接:不去动 ASR 模型本身,在它后面接一个专门做口语转书面语的小模型,论文里管这个小模型叫 Refiner。整体架构如下:

右半部分(b)是推理时的工作流程,分 offline 和 online 两种模式:
- Offline 模式:等一段完整音频识别完,ASR 前端产出完整的口语版转录 $H$,Refiner 只调用一次,把整段 $H$ 转成干净文本 $Y$。
- Online 模式:这是论文的重点。用 VAD(voice activity detection,检测语音里的停顿和句子边界)配合一个 Chunk Manager,把持续到来的 ASR 文本切成一个个 chunk(每个 chunk 最多 80 个字符,在标点处断开)。每次更新时,Chunk Manager 取出”当前 chunk 加上前面 $K-1$ 个 chunk”(默认 $K=3$)拼在一起喂给 Refiner,Refiner 吐出一份干净文本,替换掉这个窗口原来对应的旧输出。等下一个 chunk 到来,窗口往后滑一格,重复这个过程。
这样设计有两个好处:Refiner 每次只处理一个有限长度的窗口,不需要每次都从头重算完整历史;而且因为窗口是滑动的,后面新到的语音有机会”回头”修正前面最多 $K-1$ 个 chunk 之内的内容——这正是图 1 里”Mary”变成”Marie”的机制来源。
左半部分(a)是训练数据怎么来的问题:现实里没有大量”口语转录—书面转录”的配对语料可以直接拿来微调,所以作者搭了一条五阶段的合成 pipeline,全程用 Gemma-4-31B-IT 生成和质检:先按场景生成候选实体、术语池(seed generation);基于这些 seed 生成带口语现象的 Oral 文本(比如插入填充词、重复、多阶段自我修正);把 Oral 转写成对应的 Clean 书面版本作为训练目标;再故意在 20% 的样本里模拟 ASR 识别错误(词漏识别、截断、误判),剩下 80% 保持不变;最后用 LLM 筛掉不忠实的样本,并用文本 3-gram Jaccard 相似度(阈值 0.75)去重。这套流程一共产出了 10 万条训练对,85% 用来训练、15% 用来验证,把 Refiner 从 MiniCPM-5-1B 微调了 5 个 epoch。默认的 ASR 前端是 Qwen3-ASR-1.7B。
4. AASR-Bench:为什么不能直接拿 WER 来评这类任务
评测这类任务本身是个问题。传统的 WER / CER / MER(word / character / match error rate,字错率、词错率,都是逐字比对识别结果和标准答案差多少,数值越低越好)只会比较逐字匹配度,没法区分”格式变了但语义对”和”语义真的错了”这两种情况——比如把口语的”三点二五”写成书面的”3.25”,WER 会把这个当成一次完整的替换错误来算,但这恰恰是我们想要的行为。
所以作者搭了 AASR-Bench,一个专门给 AgenticSR 用的双语(中英文)基准。它包含 917 条 utterance(510 条中文 + 407 条英文,共 4.218 小时音频),覆盖 10 个使用场景(日常聊天、客服、口述录入、解释澄清、会议、导航、技术讨论、编程口述、语音搜索、学术场景),每条样本配一组”原子级”的判断题,一共 6637 道,平均每条 7.24 道。判断题分四个维度:Content(该保留的语义内容有没有保留)、Format(数字日期符号有没有规范化)、Filter(填充词重复有没有清干净)、Rephrase(自我修正、多阶段修订、解释澄清有没有处理对),每道题由 Gemma-4-31B-IT 当裁判打分。
这套裁判打分靠不靠谱?作者拉了两位独立的领域专家做双盲评估,跟裁判的判断对比,Spearman 相关系数在 0.6B 和 1.7B 前端上分别是 0.8222 和 0.8064,加权 kappa 分别是 0.8313 和 0.7918——一致性相当高,说明这套基于 rubric 的评测框架站得住。
5. 效果:大模型后处理慢一个量级,小 Refiner 更快也更准
主要结果对比了两类 baseline:一类是把完整识别结果扔给一个大模型 API 做后处理(比如 Qwen3.5-Flash、Gemini-2.5-Flash),一类是 FormalASR——直接对 ASR 模型做微调,让它自己输出干净文字,不需要额外的 LM。

用 Qwen3-ASR-1.7B 当 ASR 前端时,AgenticASR 拿到 79.95 的 Overall 分数,大幅超过 Qwen3.5-Flash 后处理的 69.93 和 FormalASR 的 52.50,在四个维度都是最好——尤其是 Format(65.19 对 19.69)和 Rephrase(72.83 对 15.70),这两项 FormalASR 差距最明显,说明单纯让 ASR 模型自己学着输出干净文字,处理复杂的格式化和自我修正逻辑力有不逮,还是需要一个专门的转换步骤。
更值得注意的是延迟那一列:Qwen3.5-Flash 做后处理平均要 60.89 秒,而 AgenticASR 只要 9.59 秒,差了六倍多。这不是说 AgenticASR 的算法效率有多离谱,更本质的原因是问题被拆小了——大模型 API 是对着完整转录文本做一次性、无状态的重写;AgenticASR 用一个专门训练过的 1B 级别小 Refiner,每次只处理局部的、有限长度的窗口。
把结果拆到 10 个场景看:

配 Qwen3-ASR-1.7B 时,AgenticASR 在全部 10 个场景加 pass-through 控制组里都领先两个 baseline;换成 0.6B 前端时 9 个场景领先,唯一输的是 Tech(技术讨论)场景,Qwen3.5-Flash 后处理反而高了将近 2 分——技术类内容里专业术语密度高,直接靠大模型的世界知识兜底可能更稳。
作者还换了 Whisper 系列(Base / Small / Large)当 ASR 前端做泛化验证,趋势一致:换成 Whisper Large 时,AgenticASR 的 Overall 从 62.90(Gemini-2.5-Flash 后处理)提升到 70.29,延迟只要 4.42 秒,是 Gemini 后处理(8.04 秒)的一半左右。但也有一个诚实的局限——用最弱的 Whisper Base 当前端时,AgenticASR 的 Content 分数反而比 Gemini-2.5-Flash 低了 8.35 分,说明 Refiner 再强,也补不齐 ASR 前端本身漏掉的语义内容,这是这套两阶段架构绕不开的天花板。
6. 消融:Refiner 多大够用?窗口开多大才能追上 offline?
Refiner 容量的影响。 固定 Qwen3-ASR-1.7B 当前端,换三种 Refiner 规格对比:

分数随参数量单调上升——Qwen2.5-0.5B-Instruct 78.76 分,默认用的 MiniCPM-5-1B 79.95 分,Qwen2.5-4B-Instruct 83.42 分——但延迟只从 9.21 秒涨到 10.77 秒,涨幅不到 20%。说明 Refiner 这一层的计算量相对 ASR 主干本身不算重,拿更大的 Refiner 换效果在延迟上是划算的。
窗口大小的影响,这是最有意思的一组消融:

Offline 模式(等完整识别完再 refine 一次)的 Rephrase 分数是 72.83、Explanation 场景分数是 75.20。切换成 online 流式模式后,窗口只留 1 个 chunk 时,这两个分数直接崩到 36.17 和 19.43;窗口开到 2 个 chunk,回升到 65.08 和 55.06;开到 3 个 chunk(论文的默认设置),几乎追平 offline 水平——70.47 和 74.00。
为什么窗口大小影响这么大?下图给了一个具体例子:用户先说”我的火车从北京南站出发”,接着自我修正”不对,是北京西站”,最后又改口”应该是北京朝阳站”。

如果窗口只有 1 个 chunk,Refiner 每次只能看到当前这一小段,前两次修正各自被当成独立片段处理,结果转录里同时留着”南站”和”西站”两个已经被放弃的地名。窗口开到 2 个 chunk,能把最后一次修正和紧挨着它的上一个候选连起来、删掉那个候选,但最早提到的”南站”已经滑出窗口之外,救不回来。只有窗口开到 3 个 chunk,才能把整段修正序列完整覆盖,一边保留没被修正过的”出发时间”,一边把所有被放弃的地名统一替换成最终的”朝阳站”。
这个例子说明,online revision 不是”看到新证据就无脑覆盖上一段”这么简单——修正的证据链条可能跨越好几个语音片段,窗口开小了,系统会陷入”知道错了但改不回去”的状态。
7. 一些冷静的讨论
这篇工作最实在的地方,是没有去卷 ASR 模型本身的准确率,而是把”清理口语内容”这件事拆成一个可以流式处理、可以回头修正的独立任务,用一个专门训练的小 Refiner 配合滑动窗口来做。但几个地方值得留意:
- 两阶段架构有天花板。 Whisper Base 那组结果已经说明,Refiner 再强也补不齐 ASR 前端漏掉的语义内容——这套架构本质上是”锦上添花”,不是”点石成金”。
- 固定 $K=3$ 窗口是个经验选择。 如果修正链条跨度超过 3 个 chunk(比如同一个地名被改了四五次),现在的机制依然会漏,论文没有讨论自适应窗口大小的方案。
- 60 秒级别的 API 延迟对比稍显夸张。 这更像是在对比”专门为这个任务训练过的小模型”和”没针对这个任务优化、拿现成大模型硬跑完整重写”,两者不是同一计算量级的公平对比,但确实反映了一个真实的工程选择:要不要为一个高频子任务单独训练一个小模型。
- 评测本身依赖 LLM 当裁判。 rubric 由 Qwen3.7-Plus 生成,打分由 Gemma-4-31B-IT 完成,尽管做了人类一致性验证,但 rubric 的覆盖面和潜在偏见终究取决于生成它的那个 LLM。
顺带扯句题外话:AgenticASR 做的事情严格说属于语音识别和实时交互系统,书里没有直接讲 ASR 或者流式修正这块。不过它”用一个专门训练过的小模型处理局部窗口,取代对着全量文本重跑一次大模型”的设计思路,跟我们在《动手学 AutoML:从 NAS 到大语言模型优化实战》里讨论 LLM 压缩、模型融合时反复出现的取舍是一致的——很多时候提速不是靠更聪明的算法,而是靠把一个大任务拆成可以用小模型 cover 的局部子任务。
