KDD Cup 2026 DataAgent Top1 ASR 方案学习笔记

这份笔记主要记录我对 DataAgent 赛题中视频 briefing 转写方案的理解。原始方案看起来并不复杂:先把视频里的旁白转成文字,再交给后面的 Agent 去理解任务、操作页面。但真正影响效果的地方不只是“选一个更强的 ASR 模型”,而是语言判断、模型规模、领域上下文、文本归一化和评测口径这些细节如何配合。

一、这个 ASR 模块解决什么问题

DataAgent 的部分任务会给一段 briefing 视频。视频旁白通常会告诉 Agent 当前页面状态、需要操作的表或字段、要关注哪些信息、哪些是干扰项,以及最终要完成什么操作。对 Agent 来说,这段旁白相当于任务说明书;如果转写错了,后面的理解和执行都会被带偏。

整个链路可以简化成:

1
briefing 视频 -> 抽取音频 -> ASR 转写 -> 文本后处理 -> DataAgent 执行

这里的 ASR 指 Automatic Speech Recognition,也就是自动语音识别。它负责把语音变成文字。Whisper 则是 OpenAI 发布的一系列 ASR 模型,是实现 ASR 的具体工具。两者的关系可以理解为:ASR 是任务类型,Whisper 是完成这个任务的一类模型。

这个场景对 ASR 的要求和普通字幕生成不太一样。字幕里错一个语气词,影响可能不大;但在 DataAgent 里,如果把“字段”识别成“自断”,或者把某个股票代码、页面名、按钮名识别错,Agent 可能就找不到正确的 UI 元素。更严重的是,如果模型在音频结束后编造出不存在的指令,下游 Agent 甚至可能执行错误操作。

二、Top1 方案的主流程

这个方案的核心思路是:不要让一个大模型包办所有步骤,而是把任务拆开,每一步用合适的模型。

1
2
3
4
5
6
7
briefing.mp4
-> 抽取音轨
-> Whisper tiny 检测语言
-> Qwen 根据任务资料生成 initial_prompt
-> Whisper medium 按指定语言正式转写
-> 繁简转换、数字和标点归一化
-> 把转写文本交给 DataAgent

几个组件的分工很清楚:

组件 作用
Whisper tiny 快速判断音频是中文还是英文
Qwen 从任务资料中提取领域术语,生成initial_prompt
Whisper medium 正式进行语音转写
DataAgent 根据转写文本理解任务并执行操作

这套流程体现了一个很实用的工程判断:模型越大不一定越适合。语言检测是简单任务,用 tiny 足够;正式转写才需要更强一些的模型;而 Qwen 不负责听音频,只负责从结构化任务资料里提取上下文,帮助 Whisper 少选错词。

三、为什么语言检测用 tiny,转写用 medium

数据集中同时有中文和英文 briefing。如果直接把所有音频都强制设成中文,例如:

1
language = "zh"

英文音频可能会被 Whisper 硬解释成中文,生成一堆不存在的中文内容。所以方案先做语言检测,再根据结果指定 zhen

作者在 30 条 briefing 音频上测试了 tiny、base、small、medium 和 large-v3。样本里有 20 条中文、10 条英文,所有模型的语言检测准确率都是 100%。差别主要在耗时:

模型 检测耗时/条
tiny 0.14 s
base 0.27 s
small 0.93 s
medium 3.10 s
large-v3 5.71 s

既然准确率一样,tiny 就是最合理的选择。这里没必要为了“看起来更强”去用 large-v3。

正式转写时,选择 medium 而不是 large-v3,原因更值得注意。直觉上 large-v3 更大,应该更准;但实验里 large-v3 出现了严重的末尾幻觉:音频正文已经结束,模型仍然继续生成音频中不存在的内容,比如“请点赞、订阅、转发”等,甚至会编出上百字乱码。

模型对比如下:

模型 中文 CER 英文 WER 末尾幻觉
base 10.4% 1.9%
small 6.8% 1.3% 几乎无
medium 3.2% 2.8% 极少
large-v3 7.2% 8.7% 严重

如果只截取正常正文,large-v3 可能并不差,甚至可能更好。但真实系统里不能假设总能准确知道应该从哪里截断。一旦末尾幻觉进入转写文本,下游 Agent 会把它当成真实指令。综合准确率、速度和稳定性,medium 是更稳的选择。

四、initial_prompt 解决的是上下文问题

medium 剩下的一类典型错误是中文同音字或近音词。例如:

正确词 错误识别
字段 自断
送股 颂谷
任职绩效 认值计效
队列 对列

这类错误不一定是模型没听清发音,而是缺少业务上下文。就像输入法只知道拼音 duilie 时,可能给出很多候选;如果它知道当前在讲数据平台,就更应该选“队列”。

Whisper 的 initial_prompt 可以在解码前提供一段上下文。例如:

1
2
该音频涉及数据平台界面操作。
常见术语包括:字段、批次、配置、加载、面板、看板、卡片、队列、筛选、核对、列、口径。

需要注意,initial_prompt 不是转写完成后的纠错,也不是让 LLM 改写结果;它是在 Whisper 解码前影响候选词概率,让模型在相似发音之间更偏向领域内的词。

这里 Qwen 的作用就是自动生成这段上下文。不同任务会涉及不同的表名、字段名、公司名、股票代码、页面名、指标名和 UI 术语。人工为每条任务写 prompt 成本太高,所以方案让 Qwen 读取 knowledge.mdtask.json 和任务描述,提取最可能相关的 8 到 15 个术语。

比较合理的 prompt 生成原则是:

  • 以当前任务问题为核心,而不是把所有背景资料都塞进去;
  • 优先提取看板名、字段名、实体名、路径和关键指标;
  • knowledge.md 用来理解规范,不要直接全文灌入;
  • 术语要少而准,避免无关词变成噪声;
  • 可以把任务特定术语和通用 UI 术语组合起来。

示例:

1
2
3
4
5
任务特定术语:
股票代码 600234、董事会秘书、公司档案

通用 UI 术语:
字段、批次、配置、加载、看板、卡片、队列、筛选、核对、列、口径

实验结果也说明 prompt 是有效的:

方法 中文 CER 英文 WER
medium,无 prompt 约 3.5% 约 4.0%
加入 Qwen 自动生成 prompt 2.8% 0.75%
再加入通用 UI 术语 1.9% -

可以理解为,领域 prompt 对中文术语、同音字,以及英文任务关键词都有明显帮助。

五、评测时不能只看 CER/WER

CER 是 Character Error Rate,字符错误率,常用于中文 ASR;WER 是 Word Error Rate,词错误率,常用于英文 ASR。两者公式类似:

1
ErrorRate = (S + D + I) / N

其中 S 是替换错误,D 是删除错误,I 是插入错误,N 是标准答案长度。区别在于 CER 按字符统计,WER 按单词统计。

中文更常用 CER,是因为中文没有天然空格。如果用词来算,就会受到分词方式影响。比如“用户信息表”可以分成“用户 / 信息表”,也可以分成“用户信息 / 表”。按字符计算能减少这类评测口径带来的干扰。

不过,真正做 ASR 评测时,不能把模型输出和标准答案直接逐字比较。很多格式差异并不代表语义错误:

1
2
标准答案:字段配置
模型输出:字段配置。

多一个句号不应该被当成实质错误。因此评测前需要做文本归一化,包括:

  • 繁体转简体;
  • 中文数字转阿拉伯数字;
  • 英文字母统一大小写;
  • 去掉不重要的标点;
  • 去除多余空格;
  • 只保留汉字、字母和数字。

繁简转换尤其重要。faster-whisper 有时会输出繁体,而 gold 是简体。如果不统一,“標準答案”和“标准答案”会被算成字符差异。作者提到,某次结果中未归一化 CER 是 26%,繁简归一化后降到 9.5%。这说明评测口径本身会显著影响结论。

这里的 gold 也要理解清楚。方案使用 Azure Fast Transcription 的转写文本作为 reference,再计算 Whisper 输出和 Azure 文本之间的差异。所以严格来说,这些 CER/WER 表示的是“相对 Azure 转写结果的错误率”,不是相对人工标注真值的绝对错误率。Azure 本身也可能错,更严谨的评测应该有人工作为最终标准。

另外,CER/WER 只是平均指标,不足以完全评价 DataAgent 场景下的 ASR。漏掉一个“的”和把“字段”识别成“自断”,可能在指标上都是小错误,但对下游任务的影响完全不同。这个场景还应该关注:

  • 领域术语错误率;
  • 数字、股票代码、实体名称识别错误率;
  • 幻觉率,尤其是末尾幻觉;
  • 转写错误对下游任务成功率的影响。

六、几个工程细节

第一,中文输出必须做繁简转换。如果 gold 是简体,模型输出是繁体,直接比较会虚高 CER。可以用 OpenCC 做处理:

1
2
3
4
from opencc import OpenCC

cc = OpenCC("t2s")
text = cc.convert(text)

第二,不要跳过语言检测。数据集里既有中文也有英文,强行指定一种语言会放大错误,尤其容易让英文音频变成中文幻觉文本。更稳的流程是先用 tiny 判断语言,再让 medium 按对应语言转写。

第三,VAD 不能根治末尾幻觉。VAD 是 Voice Activity Detection,用来检测语音活动、切掉静音片段。它能减少一部分无效音频,但末尾幻觉可能发生在呼吸声、尾音、背景低噪声这类并非完全静音的片段上。因此 vad_filter=True 有帮助,但不能把它当作解决幻觉的根本办法。

我对这套方案的理解是:它的亮点不在某个单点模型,而在分工和约束。tiny 负责快速语言检测,medium 负责稳定转写,Qwen 负责提取任务上下文,归一化负责让评测更公平。这样做比简单堆大模型更可靠,也更符合 Agent 系统里“上游文本会直接影响下游行动”的特点。