continuous=true仅表示识别完一句不自动停止,但需手动监听onend并调用start()续命,否则因超时或权限释放而中断;interimresults=true必须配合使用才能稳定获取连续结果。

continuous = true 之后为什么识别一会儿就停了
不是 continuous 失效,而是你没管住它——浏览器不会自动续命。设为 true 只表示「识别完一句不自动 stop」,但实际是否持续收音,取决于麦克风权限是否被释放、onend 是否意外触发、以及有没有其他逻辑中途调了 stop() 或 abort()。
常见错误现象:
- 点了开始,说两句话后 UI 没反应,控制台也无报错 → 很可能是
onend被静默触发(比如用户短暂沉默超 10 秒,Chrome 默认超时) - 识别结果突然中断追加,后续语音完全没回调 → 检查是否在
onresult里误写了recognition.stop()
实操建议:
- 必须监听
onend并在其中主动调用recognition.start(),否则一次会话结束就彻底断连 - 避免在
onresult中做耗时操作(如发请求、DOM 大量重绘),否则可能阻塞事件循环,间接导致超时 - 加个手动
stop()按钮,别全依赖自动行为;用户真想停,得有明确出口
interimresults 和 continuous 必须一起配对使用才稳定
continuous = true 单独开没意义:它只决定“识别完一句还继不继续听”,但不解决“怎么拿到中间字”或“结果怎么拼”。真正让连续识别可用的,是 interimresults = true + 正确读取 event.results 的结构。
常见错误现象:
- 开了
continuous = true却只读event.results[0][0].transcript→ 只拿到第一句,后面所有结果都被丢弃 - 没开
interimresults,但期望实时显示“正在识别中…” → 永远等不到中间结果,只有最终句才回调
实操建议:
-
interimresults = true是连续识别的刚需,不是可选项 - 每次
onresult触发,都要取最后一项:const latest = event.results[event.results.length - 1],再取latest[0].transcript - 区分
isFinal字段:latest[0].isFinal === true才是确认句,之前都是临时推测,适合灰字显示、加个「…」提示
lang 必须在 start() 前设置,且值要严格匹配
continuous 开了但识别出英文或空字符串?八成是 lang 没生效。这个字段不是“建议语言”,而是识别引擎的硬性输入约束,而且必须在 start() 之前设好,之后改无效。
使用场景:
- 中文识别务必用
'zh-CN'(注意大小写和短横),'zh'或'zh-cn'在部分 Chrome 版本下会被忽略 - 如果页面支持多语言,切换语言时必须先
recognition.stop(),再改lang,再start()
性能影响:
- 错设
lang不仅识别失败,还会让引擎 fallback 到默认语种(通常是 en-US),增加首字延迟 - 某些地区版 Chrome 对非本地
lang支持更弱,比如日版系统跑zh-CN可能直接静默失败
start() 必须由用户手势触发,否则 continuous 从头就无效
这是最隐蔽的坑:continuous = true 看似是参数问题,实则是启动时机违规。Chrome/Edge 要求 start() 必须发生在 click、touchend 等明确用户动作的回调里,否则既不弹权限框,也不报错,整个 SpeechRecognition 实例就卡死在“准备就绪但无法激活”状态。
容易踩的坑:
- 用
setTimeout(() => recognition.start(), 100)模拟延时启动 → 权限被拒,且后续任何start()都无效 - 在
onload或DOMContentLoaded里直接调start()→ 同样静默失败 - 按钮用了
preventDefault()但没处理好事件冒泡,导致手势链断裂
实操建议:
- 绑定 click 事件到真实按钮上,回调里直接
recognition.start() - 首次调用后,如果用户拒绝权限,
onerror会收到error: 'not-allowed',这时必须引导用户去地址栏点小锁图标手动开启 - 移动端注意 touchstart/touchend 兼容性,优先用
click(iOS Safari 对 touch 事件的权限策略更严)
连续识别真正难的不是开开关,而是稳住整个生命周期:权限、超时、结果拼接、UI 同步,四者缺一不可。很多人卡在「为什么说两句就停」,其实问题不在 continuous,而在没接住 onend 后的自动重启,或者根本没让 start() 合法发生。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











