You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:44