Whistle 关键词偏置:让模型认对你的专有名词

把「Mrs. Patel」听成「Mrs. Battle」、「Pixel 10」听成「pixel ten」——keyword biasing 是官方给的解法,但官方没告诉你上限是多少、什么时候会适得其反。

官方没说清楚的部分:官方介绍了 keyword biasing 功能,但未公布条目上限;长列表会让解码器进入重复循环这一副作用也未写在文档里。

关键词表体检

一行一个。会剔除过短词与常见词,检查 32 条上限,并生成可直接粘贴的调用代码。

它到底解决什么

Whistle 的词表只有 8,192 个文本片段。人名、地名、产品名这类低频专有名词不在词表的高概率区,模型会「听写成它认识的最近的词」。真实案例:Mrs. Patel → Mrs. Battle,Pixel 10 → pixel ten 或更糟。keyword biasing 让解码搜索偏向你给出的词。官方实现基于 Aho-Corasick 匹配,命中后提升该词的搜索权重。

怎么用

keywords 接受一个列表,也接受换行分隔的字符串。语言参数可以省略让它自动检测。

import needle

needle.transcribe("clip.wav",
                  keywords=["Aoife", "Wojciech", "Pixel 10", "Mrs. Patel"],
                  language="en",
                  word_timestamps=True)

上限是 32 条

上层封装最多发送 32 条关键词,超出部分直接丢弃。这不是 Whistle 模型本身的硬限制,而是封装层为避免搜索空间膨胀设的闸门。官方 Python 文档没有写这个数字,只在集成方文档里出现。

MAX_ENTRIES = 32

keywords = keywords[:MAX_ENTRIES]   # 超出部分不会生效

坑:长列表会让解码器复读

这是官方文档没提的副作用。关键词列表过长时,解码器可能进入循环,反复输出同一个短语。判断方法:转写结果里出现大段重复文本。处理办法是先砍掉一半关键词再试——如果你有几百个产品名要偏置,正确做法不是加大列表,而是在转写完成后做一次纠错替换(后处理词典)。

# 长词表的正确做法:后处理纠错,而不是硬塞进 keywords
CORRECTIONS = {"mrs battle": "Mrs. Patel", "pixel ten": "Pixel 10"}

def fix(text):
    low = text.lower()
    for wrong, right in CORRECTIONS.items():
        low = low.replace(wrong, right.lower())
    return low

什么词不该放进 keywords

① 单字符与极短词:会过度触发,污染所有结果。② 常见词(the、and、is):偏置它们没有意义,反而会拉低整句准确率。③ 过长的短语:短语越长越难被完整命中,建议控制在 3 个词以内。④ 大小写不同的同一词:偏置是匹配层面的,重复条目只会浪费那 32 个名额。

偏置解决不了的情况

如果你的音频本身接近 Whistle 的弱项——会议多人抢话(AMI 26.07%)、非英语有声书(MLS 24.9%)——加关键词救不回来。这时该换模型或换云端服务,而不是继续调词表。另一个边界:偏置只能影响解码搜索,改不了声学模型对错音的判断。

常见问题

32 条是模型限制还是封装限制?

封装层限制。Whistle 模型本身不设这个数字,但主流集成(如 NeuroLink 的 whistle provider)会截断到 32 条。直接用官方 CLI 或 Python 包时不受此限,但仍建议控制在几十条内。

偏置会让整体准确率下降吗?

会。偏置是把概率质量从其他词移到你指定的词上,列表里的词变准,表外的词可能变差。所以词表要小而准,只放真正会被听错的专有名词。

中文能用 keyword biasing 吗?

不能。Whistle 只支持英语、德语、法语、西班牙语、意大利语、荷兰语、波兰语七种语言,中文、日语、阿拉伯语等均不支持。

用你自己的音频测 —— 算出 Whistle 在你的音频上的真实词错率,30 秒出结果。

相关页面

数据口径:Whisper 与 Moonshine 的数值为各自作者公布值,Whistle 为 Cactus 自测(86,174 条,Whisper 归一化器),非同条件复跑。
核对日期:2026-10-09。