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

Azure语音转文字:设置1分钟静音等待识别或手动触发问题求助

解决方案

问题分析

你当前代码的核心问题:

  1. 同时调用了startContinuousRecognitionAsync()和recognizeOnceAsync(),这两个API互斥,不能同时使用,会导致逻辑冲突。
  2. SpeechServiceConnection_EndSilenceTimeoutMs是控制识别过程中检测到静音后结束当前识别的超时,不是控制开始识别前的等待时长。

方案1:点击按钮触发语音转文字

这是更可靠的交互方式,完全由用户控制识别时机:

  1. 页面加载时初始化语音配置和识别器,不主动启动识别
  2. 给按钮绑定点击事件,按需触发单次或连续识别

示例代码:

// 初始化配置(页面加载时执行)
const speechConfig = SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
const recognizer = new SpeechRecognizer(speechConfig, audioConfig);

// 绑定「开始识别」按钮事件
document.getElementById('start-rec-btn').addEventListener('click', () => {
  // 单次识别(适合短语音场景)
  recognizer.recognizeOnceAsync((result) => {
    if (result.reason === ResultReason.RecognizedSpeech) {
      console.log(new Date().toString());
      console.log('识别结果:', result.text);
    } else if (result.reason === ResultReason.NoMatch) {
      console.log('未检测到有效语音');
    }
  });

  // 如果是长语音场景,替换上面的recognizeOnceAsync为连续识别逻辑:
  // recognizer.startContinuousRecognitionAsync();
  // recognizer.recognized = (s, e) => {
  //   if (e.result.reason === ResultReason.RecognizedSpeech) {
  //     console.log('连续识别结果:', e.result.text);
  //   }
  // };
});

// 可选:绑定「停止识别」按钮事件(仅连续识别场景需要)
document.getElementById('stop-rec-btn').addEventListener('click', () => {
  recognizer.stopContinuousRecognitionAsync();
});

方案2:等待1分钟静音后自动触发识别

Azure语音服务没有直接提供「开始识别前等待静音」的配置,需要通过Web Audio API自行实现静音检测逻辑:

const speechConfig = SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
const recognizer = new SpeechRecognizer(speechConfig, audioConfig);

// 初始化Web Audio API用于音量检测
const audioContext = new AudioContext();
const microphone = await navigator.mediaDevices.getUserMedia({ audio: true });
const source = audioContext.createMediaStreamSource(microphone);
const analyser = audioContext.createAnalyser();
source.connect(analyser);

const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
let silenceStartTime = null;
const SILENCE_THRESHOLD = 20; // 静音阈值(需根据实际环境调整)
const REQUIRED_SILENCE_DURATION = 60000; // 1分钟静音时长

// 定时检测麦克风输入音量
setInterval(() => {
  analyser.getByteFrequencyData(dataArray);
  const averageVolume = dataArray.reduce((sum, value) => sum + value, 0) / bufferLength;

  if (averageVolume < SILENCE_THRESHOLD) {
    if (!silenceStartTime) {
      silenceStartTime = Date.now();
    } else {
      const elapsed = Date.now() - silenceStartTime;
      if (elapsed >= REQUIRED_SILENCE_DURATION) {
        // 达到指定静音时长,启动识别
        recognizer.recognizeOnceAsync((result) => {
          if (result.reason === ResultReason.RecognizedSpeech) {
            console.log(new Date().toString());
            console.log('识别结果:', result.text);
          }
          // 识别完成后重置静音计时
          silenceStartTime = null;
        });
      }
    }
  } else {
    // 检测到有效声音,重置静音计时
    silenceStartTime = null;
  }
}, 100); // 每100毫秒检测一次音量

关键注意事项

  • 不要同时调用recognizeOnceAsync和startContinuousRecognitionAsync,根据场景选择其一即可
  • 浏览器环境下需要获取麦克风权限,确保代码在HTTPS环境或localhost下运行
  • 静音阈值需根据实际环境调整,避免环境噪音导致误触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:57:32