Azure语音识别切换至zh-CN时无匹配结果问题求助
问题:Azure语音服务切换为zh-CN后无法识别WebSocket传输的音频流
通过WebSocket接收浏览器捕获的音频流数据,使用默认英文语音识别时一切正常,但切换为zh-CN语言后持续返回NOMATCH错误,几乎无法识别任何内容。
相关代码与错误日志
服务器端语音识别配置代码
... const speechConfig = SpeechConfig.fromSubscription( process.env.AZURE_SPEECH_SERVICE_KEY || '', process.env.AZURE_SPEECH_SERVICE_REGION || '', ) speechConfig.speechRecognitionLanguage = 'zh-CN' console.log(speechConfig.speechRecognitionLanguage) // log zh-CN wss.on('connection', (ws) => { const audioPushStream = PushAudioInputStream.create() const audioConfig = AudioConfig.fromStreamInput(audioPushStream) const speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig) speechRecognizer.recognizing = (s, e) => { if (e.result.reason == ResultReason.RecognizingSpeech) { logger.info(`RECOGNIZING: Text=${e.result.text}`) } else if (e.result.reason === ResultReason.NoMatch) { logger.info( 'Recognizing NOMATCH: Speech could not be recognized: ' + e.result.errorDetails ) } else { throw new Error('Unexpected result reason') } } ... speechRecognizer.startContinuousRecognitionAsync() }
错误日志
info: NOMATCH: Speech could not be recognized: undefined info: NOMATCH: Speech could not be recognized: undefined info: NOMATCH: Speech could not be recognized: undefined info: NOMATCH: Speech could not be recognized: undefined
WebSocket处理逻辑
客户端代码(捕获并发送音频流)
// websocket client const ws = new WebSocket(import.meta.env.VITE_WS_URL); async function startRecording(streamId) { media = await navigator.mediaDevices.getUserMedia({ audio: { mandatory: { chromeMediaSource: 'tab', chromeMediaSourceId: streamId } }, }); // 播放捕获的音频给用户 const output = new AudioContext(); const source = output.createMediaStreamSource(media); source.connect(output.destination); // 处理音频数据 scriptNode = output.createScriptProcessor(8192, 1, 1); source.connect(scriptNode); scriptNode.connect(output.destination); scriptNode.onaudioprocess = async (audioProcessingEvent) => { const inputBuffer = audioProcessingEvent.inputBuffer; const inputData = inputBuffer.getChannelData(0); // 将Float32Array转换为Int16Array const intBuffer = new Int16Array(inputData.length); for (let i = 0; i < inputData.length; i++) { intBuffer[i] = Math.max(-32768, Math.min(32767, Math.round(inputData[i] * 32767))); } // 发送音频数据 ws.send(intBuffer.buffer); }; }
服务器端代码(接收并转发音频流)
// websocket server ... const wss = new WebSocketServer({ port: port }) wss.on('connection', (ws) => { ... speechRecognizer.startContinuousRecognitionAsync() ws.on('message', (data) => { audioPushStream.write(data) // 保存音频数据用于验证 appendFile('audio.pcm', data, { flag: 'a' }) }) }
排查与解决方案
核心问题是音频采样率不匹配:Azure语音服务要求输入音频必须为16kHz采样率、16位深度、单声道PCM,浏览器AudioContext默认采样率通常为44.1kHz或48kHz,英文识别对采样率兼容度更高,而中文识别对格式要求更严格,导致无法识别。
修复步骤:
强制设置AudioContext采样率为16kHz
修改客户端创建AudioContext的代码,指定采样率:const output = new AudioContext({ sampleRate: 16000 });若部分浏览器不支持强制设置,可使用音频转换库(如
audio-decode)将高采样率音频转成16kHz。验证音频格式正确性
用Audacity等工具导入服务器保存的audio.pcm文件,导入时选择16000 Hz、16-bit、Mono参数,若播放速度异常或声音失真,说明采样率仍不匹配,需调整客户端音频处理逻辑。确认语音服务区域支持中文识别
检查Azure语音服务的部署区域是否支持zh-CN语言,部分区域仅支持特定语言,需确保所选区域兼容中文识别。
内容的提问来源于stack exchange,提问作者Goo
相关产品推荐
相关产品推荐

