如何用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
相关产品推荐
相关产品推荐

