Web Speech API recognition监听器默认超时如何配置
Web Speech API长时转录超时问题解决方案
根因说明
Web Speech API的W3C规范本身没有定义识别会话的默认超时时长,实际观测到的2分钟左右自动触发no-speech、end事件终止识别的现象,是Chromium内核浏览器(Chrome、Edge等)的底层硬编码限制:浏览器会在单次识别会话运行到固定阈值、且未检测到持续有效语音输入时主动断开会话,该阈值没有对外暴露配置入口,无法通过API参数直接修改。
直接在onend中无脑重启的方案确实存在缺陷,会违背麦克风静音时停止识别的业务逻辑,可以通过状态标记的方式解决这个矛盾。
具体实现方案
- 维护独立的识别运行状态标记,和识别实例本身的运行状态解耦:
- 新增布尔类型变量
isRecognitionExpectedToRun,标记当前业务层面是否需要保持识别运行。当用户取消麦克风静音、需要开启转录时,将该值设为true并启动识别;当用户主动静音麦克风、需要停止转录时,将该值设为false并主动停止识别。 - 在识别实例的
onend、onerror回调中,不直接执行重启逻辑,先判断上述状态标记:仅当标记为true时,说明是浏览器超时/异常导致的断连,此时再执行重启;标记为false时说明是主动停止,不做任何操作。
- 新增布尔类型变量
- 参考实现代码:
// 业务层维护的识别运行状态标记,默认关闭 let isRecognitionExpectedToRun = false; const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); recognition.continuous = true; recognition.interimResults = true; recognition.lang = 'zh-CN'; // 按需设置识别语言 // 麦克风开启时调用,主动启动转录 function startTranscription() { if (isRecognitionExpectedToRun) return; isRecognitionExpectedToRun = true; recognition.start(); } // 麦克风静音时调用,主动停止转录 function stopTranscription() { isRecognitionExpectedToRun = false; recognition.stop(); } // 识别会话结束回调 recognition.onend = () => { // 仅业务层要求运行时才自动重启,加100ms延迟避免触发浏览器调用频率限制 if (isRecognitionExpectedToRun) { setTimeout(() => recognition.start(), 100); } }; // 识别错误回调 recognition.onerror = (e) => { // no-speech、网络闪断属于非致命错误,等待onend触发走重启逻辑即可 if (['no-speech', 'network', 'aborted'].includes(e.error)) return; // 其余致命错误按需加日志或用户提示 console.error('语音识别异常:', e.error); }; // 识别结果回调,自行维护结果数组做长文本拼接 const transcriptionResult = []; recognition.onresult = (event) => { const result = event.results[event.resultIndex]; if (result.isFinal) { transcriptionResult.push(result[0].transcript); } };
注意事项
- 重启时增加100~200ms的延迟,不要在
onend回调中同步调用start(),否则会触发浏览器「识别实例已在运行」的报错。 - 不要依赖
no-speech事件判断麦克风静音状态,该事件触发时机完全由浏览器底层逻辑控制,和实际麦克风输入状态无绑定关系,麦克风状态要通过音轨enabled属性、用户点击静音按钮的交互动作自行维护。 - 长通话场景下识别重启不会丢失已生成的转录内容,只要自行维护结果数组存储每次
onresult返回的最终结果,即可实现30分钟及以上时长的连续转录。
内容的提问来源于stack exchange,提问作者adyry
相关产品推荐
相关产品推荐

