本文面向豆包大模型流式语音识别(ASR)的客户和集成开发者,聚焦热词(hotwords)和上下文(context_data)两大能力,帮助你快速理解其作用、限制和正确用法,避免常见误区。
热词用于提升特定专有名词的识别准确率。当你的业务中存在模型不易正确识别的领域词汇(品牌名、产品型号、人名、术语等)时,通过配置热词可以一定程度提升这些词的转写准确率。
核心原则
热词是"提示"而非"强制"。模型会优先考虑热词,但不保证所有热词都 100% 被正确转写。
在请求的 corpus.context 字段中,按以下格式传入热词:
"context": "{\"hotwords\":[{\"word\":\"豆包\"},{\"word\":\"火山引擎\"},{\"word\":\"奥迪A4L\"}],\"context_type\":\"dialog_ctx\",\"context_data\":[{\"text\":\"最近一轮助手的回答\"},{\"text\":\"最近一轮用户的提问\"},{\"text\":\"更早一轮助手的回答\"},{\"text\":\"更早一轮用户的提问\"}]}",
应该放什么
- 领域特有的专有名词:品牌名、产品型号、人名、地名、术语等
- 中英混合词汇:如"奥迪A4L"、"iPhone16",按照希望模型输出的格式添加即可,无需转换为纯中文
- 中文数字混合:如"V8发动机",直接按期望输出格式添加
不应该放什么
- 通用词汇:如"打开"、"帮我"、"你好"等日常用语
- 过多无关热词:添加过多无关热词会增加误识别风险,模型可能在不该出现热词的地方错误匹配
正确示例
用户说"帮我打开飞书",只需要添加热词"飞书"即可,不要把"帮我打开"也加进去。
精简原则
- 宁缺毋滥:只添加模型容易识别错误的领域词,而非把所有业务词汇都塞进去
- 定期维护:根据实际识别效果增删热词,去掉已经能正确识别的词
当热词仍无法满足要求时,可以考虑使用替换词作为补充。替换词是"命中即强替"的规则。
对于容易识别错误的词语,首先可以将其添加到热词列表中。热词相当于向 ASR 提供一组需要重点关注的候选词,使模型听到相似发音时,更倾向于输出这些词。
热词主要适用于以下类型:
有些词即使被添加为热词,识别效果仍可能不理想。常见原因包括:
- 此时,可以为热词增加一段容易识别的解释,利用解释中的高频词帮助模型锁定目标字。
- 例如,要识别的词是“逐玉”,可以将孤立的“逐玉”扩充为:
其中,“追逐”和“玉石”都是更常见、更容易识别的词。模型可以借助解释建立发音、字形和目标词之间的联系。
类似的表达还有:
除了直接解释单个字,还可以增加与目标词高度相关的背景,让模型知道这个词属于哪个领域、品牌或话题。
例如,“覃海洋”单独出现时,可能被识别成更高频的“秦海洋”,可以扩充为:
对于“疯四”,可以扩充为:
在多轮语音交互中,历史对话通常是最直接、最有效的 Context。用户当前说出的内容往往会延续之前的话题,其中还可能包含省略、指代或重复出现的专有名词。
可作为 Context 的信息包括:
如果系统无法获取多轮对话历史,可以在 Context 中传入简短、明确的场景描述。例如:
这是肯德基点餐场景。用户可能会说菜品名称、套餐名称、数量、规格、堂食、外带、优惠券和支付方式。
还可以增加可能出现的实体类型和表达范围,使 Context 更具体:
这是肯德基点餐场景,可能涉及原味鸡、香辣鸡腿堡、蛋挞、全家桶、疯狂星期四、疯四、堂食、外带和优惠券。
这样做相当于提前为 ASR 划定识别范围。当用户发音不够清楚时,模型可以优先从点餐领域的候选词中进行判断,而不是在所有通用词汇中搜索。
上下文允许你将对话历史、业务背景信息、个性化信息等传入模型,帮助模型在语音转写时做出更准确的判断。核心原理:
- 当上下文中包含语音中可能出现的词汇时,效果最明显
- 模型具备一定的基于上下文推理的能力,但推理效果不保证,预期优于无上下文输入
上下文通过 corpus.context 字段传入,使用 dialog_ctx 类型。context_data 按从新到旧排列,需序列化为 JSON 字符串(转义引号)。
"context": "{\"context_type\":\"dialog_ctx\",\"context_data\":[{\"text\":\"最近一轮的回答\"},{\"text\":\"最近一轮的提问\"},{\"text\":\"更早的回答\"},{\"text\":\"更早的提问\"}]}"
限制
- 总量限制:800 tokens,20 轮(含)以内
注意
如果传满20轮会对性能有影响,800token以内对延时的影响在平均50-100ms以内。
- 超出限制时:按照从新到旧的顺序截断,优先保留更新的对话
- 图片支持(仅 2.0 模型):可传入 1 张图片(500KB 以内,jpeg/jpg/png),通过 image_url 字段传入
含图片的示例
"context": "{\"context_type\":\"dialog_ctx\",\"context_data\":[{\"text\":\"请描述这张图片\"},{\"image_url\":\"https://example.com/image.jpg\"},{\"text\":\"这是一张产品图片\"}]}"
场景一:对话历史中包含正确答案
当用户第一次说某个词被识别错误,但大模型回复中包含了正确写法时,将对话历史传入上下文,后续识别就更可能输出正确结果。
第 1 轮用户:"秦海洋最近怎么了?"(ASR 识别错误)
第 1 轮 LLM:"覃海洋最近被爆料……"(包含正确写法)
将上述对话传入上下文 → 第 2 轮用户:"覃海洋得过冠军吗?"(识别准确率显著提升)
场景二:上下文帮助模型推理
即使上下文中没有直接出现正确词汇,模型也能基于语义关联进行推理。
第 1 轮用户:"介绍一下风四活动。"(ASR 识别错误)
第 1 轮 LLM:"是肯德基的吗?"(关联信息)
将上述对话传入上下文 →第 2 轮用户:"对,介绍一下疯四活动。"(模型基于"肯德基"推理出"疯四")
- 优先传入对话历史:多轮对话场景下,把最近几轮对话传入是最直接有效的方式
- 背景信息尽量包含领域词汇:如果知道语音中会出现哪些专有名词,把它们写进背景信息中
- 控制长度:800 tokens 上限不大,传入最相关的信息即可,不要灌入大段无关文本
- 从新到旧排列:context_data 中最新的对话放在最前面,超出限制时系统会截断旧的内容
在实际业务中,热词和上下文通常配合使用效果最佳:
"context": "{\"hotwords\":[{\"word\":\"覃海洋\"},{\"word\":\"巴黎奥运会\"}],\"context_type\":\"dialog_ctx\",\"context_data\":[{\"text\":\"覃海洋是中国游泳运动员,曾在巴黎奥运会获得金牌\"},{\"text\":\"介绍一下覃海洋\"}]}",
- 热词直传和上下文可以在同一个 context 字段中同时传入,两者互不冲突
- 上下文 + 热词的组合在非流式/二遍链路中效果最优
- 检查是否添加了过多无关热词,精简到只保留领域专有名词
- 确认热词格式是否正确(中英混合按期望输出格式添加)
- 考虑使用非流式或二遍模式,热词在这些模式下效果更好
- 优先尝试热词,热词是"软引导",对整体识别准确率影响小
- 如果某个词始终无法正确识别,再使用替换词做"硬替换"
- 检查上下文是否包含语音中可能出现的关键词汇(这是效果最明显的场景)
- 确认 context_data 的排列顺序(从新到旧)
- 检查是否超出 800 tokens 限制导致关键信息被截断
Q4:context 直传热词的 100 tokens 限制具体是多少词?
- tokens 不等于词数,中文一般 1 个字约占 1~2 个 token
- 建议在双向流式场景下控制在 30~50 个短词以内
- 一遍(流式)结果:上下文和热词均生效,但流式链路热词效果有限
- 二遍(非流式)结果:上下文和热词效果更优,最终定稿建议以二遍结果为准