lang属性必须在speechrecognition实例创建后、start()前设为bcp 47格式(如"zh-cn"),设错、设晚或动态修改均静默失败;仅chrome稳定支持,且依赖预置语言白名单与系统语音模型。

lang 属性必须在 start() 之前设置,且仅对新创建的 SpeechRecognition 实例生效;设错、设晚、或试图动态修改都会静默失败。
lang 值必须是 BCP 47 格式且在浏览器白名单内
Chrome 是目前唯一稳定支持 SpeechRecognition 的主流浏览器,它只接受预置语言列表中的 BCP 47 标识符。写成 "zh"、"chinese" 或 "zh_CN"(下划线)均无效,会回退到默认语言(通常是 "en-US")。
- 正确写法:
recognition.lang = "zh-CN"、"en-US"、"ja-JP"、"ko-KR" - 错误写法:
recognition.lang = "zh"、"Chinese"、"zh_CN"、"zh-cn"(大小写不敏感但格式必须严格) - 没有运行时枚举 API,无法查“当前支持哪些语言”,只能靠试探:先用
"en-US"验证流程通不通,再换目标语言测试
切换语言必须新建 SpeechRecognition 实例
lang 是实例初始化时传给底层语音引擎的提示,一旦实例创建完成,修改该属性完全无效——既不会报错,也不会改变行为。
- 错误操作:
recognition.lang = "ja-JP"; recognition.start();→ 仍按原语言识别 - 正确操作:调用
recognition.abort()清理旧实例,再new (window.SpeechRecognition || window.webkitSpeechRecognition)()创建新实例,并立即赋值lang - 注意:频繁新建实例本身不导致内存泄漏,但需手动解绑旧事件(如
onresult),否则可能重复触发
lang 不生效的典型现象和排查路径
如果识别结果明显不是目标语言(比如设了 "zh-CN" 却返回英文),大概率是 lang 没起作用,而非模型不准。
-
onaudiostart不触发、onend立即触发 → 很可能是lang不被支持,引擎跳过初始化 -
onerror触发且event.error === "not-allowed"→ 和lang无关,检查是否 HTTPS / localhost 环境或麦克风权限被拒 -
onresult返回空字符串或乱码,但interimResults: true下有中间结果 → 说明引擎已启动,lang设置大概率有效,问题可能出在设备未安装对应语音模型(如海外版 Chrome 缺中文离线包)
真正容易被忽略的是:即使 lang = "zh-CN" 写对了,Chrome 也依赖系统级语音模型。某些精简版或企业策略锁定的 Chrome 可能根本不加载中文识别组件,此时没有任何 JS 层面的错误提示,只有识别结果持续异常——这种情况下,前端无解,得换环境或引导用户检查系统语音设置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











