Whisper 口述转写中,60% 的「错误」其实不是识别问题:填充词、口述修正、语音指令、数字格式各占一类。简单后处理规则将 WER 从 8.51% 降至 6.05%,再加小模型精调到 2.5%。
我录口述笔记:给自己的备注、commit 信息、短规格说明,里面有大量产品名和库名。我用 faster-whisper large-v3-turbo 处理了 101 条自己的录音,得到 8.5% 的词错误率。听起来很高,所以我逐条分析了所有错误。大部分结果出乎我意料。
在 90 个错误词中,大约 60 个并非识别错误:
口述修正(如 "Tuesday, no, Wednesday")
语音命令(如 "new paragraph")
数字格式(如把 "three thirty p m" 识别成 "3:30 PM")
对填充词、语音命令和数字格式做一轮简单规则过滤,WER 就从 8.51% 降到了 6.05%,模型本身没动。在之前的一次跑测中,在规则基础上加一层小 LLM 清理进一步降到了约 2.5%,额外耗时约 450ms。如果你在跑口述的基准测试,先看看你的参考文本假定了什么。
Whisper 支持传入初始提示词。不要直接给词表,我把它写成一句完整的句子:
from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo", device="cuda", compute_type="float16")
terms = ["Kubernetes", "PostgreSQL", "Jetpack Compose"]
prompt = "Notes about " + ", ".join(terms[:-1]) + " and " + terms[-1] + "."
segments, info = model.transcribe(
"clip.wav",
language="en", # 固定语言,不要自动检测
initial_prompt=prompt,
vad_filter=True, # 保持开启,见下文
beam_size=1,
)
我测量到两个关键点:
保持 VAD 开启。 关闭 VAD 且设置了提示词的情况下,我的全部 80 个静音片段都返回了幻觉文本。
提示词有容量上限。 大约 223 个 token,所以适用于十几个到上百个术语。到约 1000 个时就会失效,出现截断和误插入。
在我测试的 15 个术语(19 次出现)中,裸模型只对了 12 个;单独加提示词对了 16 个;下方完整方案全部 19 个都对。
提示词不是万能的("Postgres sequel",或者同一个名字有三种读法)。所以解码之后我会跑一个小型语音 rewriter:用 1 到 3 个词的滑动窗口扫过转写结果,把每个窗口和字典词条比较,选出最佳的非重叠替换。
我的第一个版本用 相似度 × 窗口字符长度 来评分。这样会倾向于更长的窗口,所以 "to Kubernetes" 反而击败了精确匹配的 "Kubernetes",rewriter 把 "to" 给吞了。这个问题发生在 6 个触发重写的片段中的 4 个里。修复只有一行:按匹配词本身的长度加权,而不是按窗口长度加权。
我把这套修复在其他测试集上重新跑了一遍:485 条真实录音(无字典词条,零改动,零误插入)、450 条合成术语录音、以及掺了干扰词的字典。在所有情况下结果都是中性或更好。
在公开数据上微调反而更差。 LoRA 在公开集合上把会议风格基准的误差从 12.5% 压到 5.9%(5 小时数据),然后就平台期了,还把我自己的口述数据集弄得更糟(从 8.2% 到 11.3%,用了 50 小时)。口头形式的标签反而教模型去掉了数字和货币格式。
"Notes about..." 提示词有副作用。 它会让 Whisper 把列表项改成首字母大写,有时还会漏掉一个小词("a jacket, a charger" 变成了 "Jacket, Charger")。在部分录音里,它还把口述的 "period" 拼成了字面的单词。这两个我都没修。
噪音最先搞坏它。 在 10 dB 下混入多说话人的嘈杂声会增加约 20 个百分点的 WER,数字受损最严重。
行话数字是 in-sample 的。 那 15 个术语是我一个人调出来的。提示词加 rewriter 的整体收益(在样本内从 8.51% 到 7.57%)在噪声范围内。规则通过的收益则不是。想对新音频下结论需要 20+ 说话人。我不发布这些录音,因为那是我的声音。
我把这套东西跑在一个小批量转录 API 后面,因为我自己的工具需要。你可以在浏览器里直接试,不需要 API key:https://readaloudai.org/transcribe。用 API key 的话是每分钟音频 $0.11,按秒计费。新账户有免费额度,大约够 54 分钟转录,开始时不需要信用卡。
坦诚说,来自文档:
仅限批量:没有实时流,没有说话人标签。
准确率仅在英语上测量。
安静期后第一个请求需要 10 到 18 秒来拉起 GPU,之后短录音大约一秒。
Whisper 偶尔会在静音或噪音上编造文本。
声明:我是开发者。如果某个录音里你的术语被弄错了,欢迎发给我看。