Azure语音转文字:设置1分钟静音等待识别或手动触发问题求助
解决方案
问题分析
你当前代码的核心问题:
- 同时调用了
startContinuousRecognitionAsync()和recognizeOnceAsync(),这两个API互斥,不能同时使用,会导致逻辑冲突。 SpeechServiceConnection_EndSilenceTimeoutMs是控制识别过程中检测到静音后结束当前识别的超时,不是控制开始识别前的等待时长。
方案1:点击按钮触发语音转文字
这是更可靠的交互方式,完全由用户控制识别时机:
- 页面加载时初始化语音配置和识别器,不主动启动识别
- 给按钮绑定点击事件,按需触发单次或连续识别
示例代码:
// 初始化配置(页面加载时执行) 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
相关产品推荐
相关产品推荐

