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

如何用JS调用Azure Bing Speech REST API发送分块音频并解决超时问题

解决Bing Speech API分块发送音频时的InitialSilenceTimeout问题

我来帮你排查这个问题——你遇到的InitialSilenceTimeout错误,本质是Speech API在规定时间内没接收到有效的语音数据,虽然返回了200状态码,但实际没有识别到任何可处理的音频内容。咱们从几个关键方向来修复:

1. 先确认音频格式完全符合要求

Bing Speech API对WAV格式有严格要求:16位PCM编码、单声道、16kHz采样率。你代码里的Blob类型声明是对的,但要确保实际录制的audioChunks确实是这个格式:

  • 如果用浏览器的MediaRecorder录制,默认格式可能不是PCM,需要手动指定约束:
    const mediaRecorder = new MediaRecorder(stream, {
      mimeType: 'audio/wav; codecs=1', // 强制PCM编码
      audioBitsPerSecond: 16000 * 16 // 16kHz采样率 + 16位深度
    });
    
  • 可以把生成的Blob保存为本地WAV文件,用播放器打开验证是否有清晰的语音内容,排除音频本身损坏的可能。

2. 实现正确的分块发送逻辑

你目前的代码只完成了音频转Uint8Array的步骤,但没有实现REST API要求的分块传输。分块发送需要设置Transfer-Encoding: chunked请求头,并且逐块发送数据,最后用空块结束请求。这里给你一个完整的示例:

var blob = new Blob(audioChunks, { 'type': 'audio/wav; codec=audio/pcm; samplerate=16000' });
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onloadend = function() {
  const audioData = new Uint8Array(reader.result);
  const chunkSize = 4096; // 推荐的块大小,可根据网络调整
  const apiUrl = `https://speech.platform.bing.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US&format=detailed`;
  
  const xhr = new XMLHttpRequest();
  xhr.open('POST', apiUrl, true);
  
  // 设置必要的请求头
  xhr.setRequestHeader('Transfer-Encoding', 'chunked');
  xhr.setRequestHeader('Content-Type', 'audio/wav; codec=audio/pcm; samplerate=16000');
  xhr.setRequestHeader('Ocp-Apim-Subscription-Key', '你的订阅密钥');
  
  xhr.onload = function() {
    if (xhr.status === 200) {
      console.log('识别结果:', JSON.parse(xhr.responseText));
    } else {
      console.error('请求失败:', xhr.status, xhr.responseText);
    }
  };
  
  // 分块发送函数
  let offset = 0;
  function sendNextChunk() {
    if (offset >= audioData.length) {
      // 发送空块,告知API数据已全部发送完毕
      xhr.send(new Uint8Array());
      return;
    }
    const currentChunk = audioData.slice(offset, offset + chunkSize);
    xhr.send(currentChunk);
    offset += chunkSize;
    // 如果是模拟实时语音,可以添加延迟,比如setTimeout(sendNextChunk, 30);
    sendNextChunk();
  }
  
  // 启动分块发送
  sendNextChunk();
};

3. 调整静音超时参数(可选)

如果你的音频开头确实有一段静音,可以通过URL参数延长超时时间,避免API提前终止:

  • 在请求URL末尾添加&initialSilenceTimeoutMs=5000(表示允许5秒初始静音,可根据需求调整数值)

4. 检查订阅密钥和区域

确保你的订阅密钥对应的区域和API endpoint匹配,比如如果密钥是北美区域的,就用speech.platform.bing.com,如果是其他区域,需要对应调整endpoint地址。

内容的提问来源于stack exchange,提问作者Ali M Safi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:32