SpeechRecognition必须用JS初始化并用户手势触发,先检测SpeechRecognition或webkitSpeechRecognition存在性再实例化,HTTPS环境+点击事件中调用start(),配置lang='zh-CN'且置于start()前,interimResults和continuous需按场景合理搭配,不支持浏览器须降级为文本输入。

不能直接在 HTML 标签里写属性启用语音识别,SpeechRecognition 是 JavaScript 接口,必须用 JS 初始化、配置并手动触发,否则点不动、没权限、不返回中文都是常态。
怎么创建兼容的 SpeechRecognition 实例
Chrome/Edge 用 webkitSpeechRecognition,Firefox 不支持,Safari 完全没实现(截至 2026 年 4 月)。硬写 new SpeechRecognition() 在多数浏览器会报错或静默失败。
- 先做特性检测:
'SpeechRecognition' in window || 'webkitSpeechRecognition' in window - 取构造函数:
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; - 再实例化:
const recognition = new SpeechRecognition(); - 如果检测失败,必须降级为普通输入框 + 提示文案,不能留空或抛异常
为什么 start() 调用了却没弹权限框
常见于页面自动执行、HTTPS 缺失、或非用户手势触发。浏览器根本不会理你,连错误都不抛。
- 必须运行在
https://或localhost下,http://域名直接禁用 API -
recognition.start()必须包裹在click、touchend等真实用户交互事件里,window.onload或setTimeout无效 - 首次调用才会弹麦克风权限;若用户点“禁止”,后续所有
start()都静默失败,onerror会收到not-allowed - 移动端 Chrome 对自动启动更严格,哪怕在
click里加了setTimeout(…, 0)也可能被拦截
interimResults 和 continuous 怎么配才不出错
这两个布尔值决定结果结构和生命周期,配错会导致取不到最新文本、重复追加、或识别中途断掉。
-
interimResults = true:每次音频片段都会触发onresult,event.results是类数组,最新项在event.results[event.results.length - 1],不是[0] -
continuous = true:识别完一句不会停,持续收音;但需手动调recognition.stop(),否则麦克风一直占用,且onend不会触发 - 两者都为
false(默认):说一句 → 识别 → 自动停止 →onend触发,适合命令式场景(如“搜索 React”) - 混搭风险:设
continuous = true却没监听onend或没加stop()按钮,用户可能以为功能卡死
为什么 onresult 拿到的是空字符串或英文
不是识别不准,而是 lang 没生效,或浏览器根本不认这个语言码。
-
recognition.lang必须在start()之前设置,写在后面等于白设 - 中文必须写成
'zh-CN'(大小写敏感),'zh-cn'、'cmn-Hans-CN'在 Chrome 中大概率 fallback 到英文模型 - Firefox 实际忽略
lang,只按系统语言走;Safari 不支持整个 API,设了也白设 - 即使写了
'zh-CN',若 Chrome 版本太旧(如低于 110),或系统语言是英文,也可能退化为英文识别
最易被忽略的一点:没有 onend 监听 + continuous = true 的组合下,识别过程不会自动重启,用户说完一句后麦克风就哑了——得靠 recognition.start() 手动续上,否则体验就是“只能讲一句”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











