把「Mrs. Patel」听成「Mrs. Battle」、「Pixel 10」听成「pixel ten」——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 条关键词,超出部分直接丢弃。这不是 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
① 单字符与极短词:会过度触发,污染所有结果。② 常见词(the、and、is):偏置它们没有意义,反而会拉低整句准确率。③ 过长的短语:短语越长越难被完整命中,建议控制在 3 个词以内。④ 大小写不同的同一词:偏置是匹配层面的,重复条目只会浪费那 32 个名额。
如果你的音频本身接近 Whistle 的弱项——会议多人抢话(AMI 26.07%)、非英语有声书(MLS 24.9%)——加关键词救不回来。这时该换模型或换云端服务,而不是继续调词表。另一个边界:偏置只能影响解码搜索,改不了声学模型对错音的判断。
封装层限制。Whistle 模型本身不设这个数字,但主流集成(如 NeuroLink 的 whistle provider)会截断到 32 条。直接用官方 CLI 或 Python 包时不受此限,但仍建议控制在几十条内。
会。偏置是把概率质量从其他词移到你指定的词上,列表里的词变准,表外的词可能变差。所以词表要小而准,只放真正会被听错的专有名词。
不能。Whistle 只支持英语、德语、法语、西班牙语、意大利语、荷兰语、波兰语七种语言,中文、日语、阿拉伯语等均不支持。