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

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,英文识别对采样率兼容度更高,而中文识别对格式要求更严格,导致无法识别。

修复步骤:

  1. 强制设置AudioContext采样率为16kHz
    修改客户端创建AudioContext的代码,指定采样率:

    const output = new AudioContext({ sampleRate: 16000 });
    

    若部分浏览器不支持强制设置,可使用音频转换库(如audio-decode)将高采样率音频转成16kHz。

  2. 验证音频格式正确性
    用Audacity等工具导入服务器保存的audio.pcm文件,导入时选择16000 Hz、16-bit、Mono参数,若播放速度异常或声音失真,说明采样率仍不匹配,需调整客户端音频处理逻辑。

  3. 确认语音服务区域支持中文识别
    检查Azure语音服务的部署区域是否支持zh-CN语言,部分区域仅支持特定语言,需确保所选区域兼容中文识别。

内容的提问来源于stack exchange,提问作者Goo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:37:06