speechrecognition识别率低主因是lang参数未匹配实际语言,须显式设为'zh-cn'等对应值;其为一次性行为,需在onend中手动start()维持监听;仅chromium系浏览器稳定支持,ios全不支持。

SpeechRecognition 识别率低,先检查 lang 参数是否匹配实际说话语言
浏览器语音识别对语言模型敏感,lang 不匹配是识别不准最常见原因。比如用户说中文,但实例化时没设或错设成 'en-US',识别结果基本不可用。
-
lang必须显式设置,不能依赖浏览器默认值;中文推荐用'zh-CN'(Chrome 支持最好) - 同一页面多个
SpeechRecognition实例,每个都要单独设lang,不继承全局 - 部分小语种(如
'yue-HK')在 Chrome 中支持有限,识别会回退到通用模型,准确率明显下降 - 测试时用耳麦比笔记本内置麦克风稳定得多,环境噪音大时识别几乎失效
连续识别失败后 onend 触发但没自动重启?必须手动调用 start()
SpeechRecognition 是一次性行为:识别结束(无论成功或失败)、出错、超时都会触发 onend,但不会自动重连。很多开发者以为“它会一直听”,结果用户说完没反应,其实是识别器已静默停止。
- 在
onend回调里加recognition.start()才能维持监听(注意防重复启动) - 不要在
onerror中无条件重启——比如错误码network或not-allowed说明权限或连接问题,硬启会报错堆叠 - Chrome 对频繁
start()/stop()有节流,间隔太短(
返回的 results 里为什么只有部分文字?关键看 isFinal 和索引逻辑
SpeechRecognitionEvent.results 是只读的 SpeechRecognitionResultList,不是普通数组。每次语音片段返回,它可能追加新项,也可能更新旧项的 isFinal 状态——这是实时修正的核心机制。
- 只取
event.results[0][0].transcript是错的:当用户停顿后继续说,results长度可能 >1,真正最终结果在最后一项的第 0 个备选里 - 必须遍历
event.results,对每个result再遍历其内部备选项(result[i]),检查result.isFinal -
isFinal: false的结果是临时推测,常含错字;isFinal: true才算确认,但可能延迟 1–2 秒才来 - 示例判断逻辑:
if (result.isFinal) { finalText += result[0].transcript; }
Chrome 以外的浏览器基本不可用,别在 Safari 或 Firefox 上强行适配
SpeechRecognition 是 Web Speech API 的一部分,目前仅 Chromium 内核浏览器(Chrome、Edge、新版 Opera)有完整实现。Safari 完全未启用,Firefox 仅实验性支持且需手动开启 media.webspeech.recognition.enable,实际无法稳定使用。
立即学习“前端免费学习笔记(深入)”;
- 检测可用性不能只靠
typeof window.SpeechRecognition !== 'undefined',还要试创建实例并监听onstart - 移动端 Chrome Android 支持良好,但 iOS 所有浏览器均不支持——这点极易被忽略,尤其做微信内嵌页时
- 没有跨浏览器兜底方案;想兼容就得引入第三方 SDK(如 Web Speech Polyfill 效果极差,不建议)
真实项目里,语音识别不是“加个按钮就行”的功能,它高度依赖设备、环境、浏览器版本和用户权限状态。哪怕参数全对,一次静音、一次网络抖动、一次麦克风被占,都可能让整个流程卡死——这些边界情况比语法本身更消耗调试时间。











