Node.js调用Google Speech API流式识别超时自动重启问题求助
解决Node.js流式语音识别60秒超时后自动重启的问题
我之前做过长语音流式识别的项目,刚好碰到和你一模一样的60秒超时问题,折腾一番后搞定了自动重启的逻辑,给你分享下具体实现思路和代码:
核心思路
既然官方流式接口有60秒的硬超时限制,我们的核心应对逻辑就是:
- 把录音+识别的整套流程封装成一个可重复调用的函数
- 精准捕获识别过程中的超时错误(或导致流程中断的关键错误)
- 错误触发后先优雅停止当前录音流和请求连接,避免资源泄漏
- 立即(或加短延迟)启动新的录音和识别会话,实现无缝衔接
完整代码实现
const record = require('node-record-lpcm16'); const unirest = require('unirest'); // 全局变量:用于拼接多次识别的完整文本(如果需要的话) let fullTranscript = ''; // 封装录音+识别的核心函数 function startStreamingRecognition() { // 配置录音参数(根据你的硬件和需求调整) const recording = record.start({ sampleRateHertz: 16000, threshold: 0, verbose: false, recordProgram: 'rec', // 系统是Linux/macOS用'rec',Windows可以用'sox' silence: '10.0' }); // 发起流式识别请求(替换成你实际使用的API地址和认证信息) const request = unirest.post('YOUR_STREAMING_RECOGNITION_API_ENDPOINT') .headers({ 'Content-Type': 'audio/l16; rate=16000', 'Authorization': 'Bearer YOUR_AUTH_TOKEN' // 若API需要认证则添加 }) .send(recording); // 直接将录音流传入请求体 // 处理实时识别结果 request.on('data', (chunk) => { try { const result = JSON.parse(chunk.toString()); const currentText = result.transcript || ''; console.log('当前识别片段:', currentText); // 拼接完整文本(根据业务需求调整,比如处理上下文衔接) fullTranscript += currentText + ' '; } catch (parseErr) { console.error('解析识别结果出错:', parseErr); } }); // 处理错误(重点:捕获超时并触发重启) request.on('error', (err) => { console.error('识别会话出错:', err.message); // 根据API返回的超时错误信息调整判断条件(不同平台提示可能不同) const isTimeoutError = err.message.includes('timeout') || err.message.includes('60 seconds'); if (isTimeoutError) { console.log('触发60秒超时,准备重启录音和识别...'); // 先停止当前录音,释放系统资源 record.stop(); // 加100ms延迟避免瞬间重启导致资源过载(可选) setTimeout(() => { startStreamingRecognition(); }, 100); } else { // 非超时错误的处理逻辑:比如重试3次后终止,或直接终止 console.error('非超时错误,终止流程:', err); record.stop(); } }); // 处理会话正常结束(比如主动停止录音) request.on('end', () => { console.log('当前识别会话正常结束'); console.log('完整识别文本:', fullTranscript.trim()); // 如果需要持续识别,可以在这里也调用重启逻辑 // startStreamingRecognition(); }); } // 启动第一个识别会话 startStreamingRecognition();
关键细节提醒
- 错误判断适配:不同语音识别平台返回的超时错误提示可能不同,你需要根据实际返回的错误内容调整
isTimeoutError的判断条件,确保只在超时场景下触发重启。 - 资源释放:一定要调用
record.stop()终止当前录音,否则会出现多个录音流同时占用麦克风的情况。 - 文本拼接优化:如果需要完整的长文本,要注意处理两次识别会话之间的上下文衔接(比如避免重复识别末尾的词语)。
- 重试策略:如果担心频繁重启影响性能,可以添加重试次数限制,或者根据错误类型调整重试间隔。
内容的提问来源于stack exchange,提问作者Rémi C.
相关产品推荐
相关产品推荐

