热词注入 ASR 与润色——同一词条在两个环节分别生效
词典词条的两级生效
一个启用的词典词条会在 OpenLess 链路的两个不同位置各自生效,机制完全不同:
录音 → ASR 识别(热词注入)→ 转写文本 → 润色(语义提示)→ 润色结果
第一级:ASR 识别环节的热词注入
机制:词典词条作为 context.hotwords 数组传给 ASR 提供商的流式 API。
火山引擎、StepFun、Whisper 兼容端点等主流 ASR 都支持热词功能——告诉 ASR「这是一个我特别希望你能正确识别的词,请优先匹配」。热词是声学层面的提示——ASR 在语音分析时就会给这些词的发音特征更高的概率权重。
生效时机:ASR 还在处理音频帧的时候就开始生效,直接影响最终的转写文本。
第二级:润色环节的语义提示
机制:词典词条作为 semantic hints 注入润色 LLM 的 prompt——告诉模型「这些词在这个用户的语境里很重要,请正确保留/使用」。
生效时机:润色 LLM 接收转写文本时,prompt 里会附上一份词典摘要。模型在语义理解阶段可以根据上下文判断要不要替换某个同音字。
一个例子:你说的话里有「Cloud」。ASR 把它转写成了「Cloud」(可能是对的),但润色模型结合词典里的「Claude」词条和上下文(你在聊 AI 助手),判断这里应该是「Claude」,就自动替换。
不同 ASR 提供商的热词支持
| ASR 提供商 | 热词参数 | 和 OpenLess 词典配合 |
|---|---|---|
| 火山引擎 bigasr | context.hotwords 数组 | ✅ 完整配合,自动打包发送 |
| StepFun | hotwords 数组 | ✅ 完整配合 |
| Whisper 兼容端点 | prompt 参数前缀 | ✅ 自动把词典拼成 prompt 前缀注入 |
| 讯飞 RTASR | ❌ 无请求级参数 | ❌ 不支持请求级热词 |
| Apple Speech | ❌ 无热词 API | ❌ 不支持 |
热词不支持的提供商,词典词条仍然会在润色环节作为语义提示注入 LLM——但精度不如 ASR 识别阶段就生效。
热词预算限制
ASR 提供商给 hotwords 参数的空间是有限的——通常只能传几百个字符。如果你词典里有几千个词条,不可能全部塞进去。
OpenLess 做了两层处理:
- 按命中频率排序——真正被识别命中过的词条排在前面,热词预算优先给高频使用的词条
- 手动添加的词条保留席位——你刚手动添加的词条(还没来得及被高频使用)会保留几个额外席位,确保新添加的词条能生效
这套机制确保:你真正在用的词条永远有位置,不会被老词条挤掉。
润色环节的词典注入不需要预算限制
润色 LLM 的 prompt 空间通常比 ASR 热词的字符预算大得多,词典的语义提示不受这个限制——哪怕词典有几千个词条,也可以完整注入。
但这里有一个故意的保守策略:润色模型不会无脑替换转写文本里的每个同音词——它只会在上下文明显指向词典词条时才替换。这样避免了「Cloud」(云计算)被错误替换成「Claude」(AI 助手)的情况。