如何在JavaScript中调整Azure语音转文本的沉默超时时间
Azure Speech SDK recognizeOnceAsync 延长沉默超时时长问题
问题描述
使用Azure Speech SDK的recognizeOnceAsync实现语音转文本,当前代码如下:
var SpeechSDK, recognizer, synthesizer; var speechConfig = SpeechSDK.SpeechConfig.fromSubscription('SUB_KEY', 'SUB_REGION'); var audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput(); recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig); new Promise(function(resolve) { recognizer.onend = resolve; recognizer.recognizeOnceAsync( function (result) { recognizer.close(); recognizer = undefined; resolve(result.text); }, function (err) { alert(err); recognizer.close(); recognizer = undefined; } ); }).then(r => { console.log(`Azure STT interpreted: ${r}`); });
HTML中引入SDK的方式:
<script src="https://aka.ms/csspeech/jsbrowserpackageraw"></script>
希望延长recognizeOnceAsync返回结果前允许的沉默时长(避免说话停顿换气时被判定为识别结束),尝试过以下设置但无效:
const SILENCE_UNTIL_TIMEOUT_MS = 5000; speechConfig.SpeechServiceConnection_EndSilenceTimeoutMs = SILENCE_UNTIL_TIMEOUT_MS; audioConfig.setProperty("Speech_SegmentationSilenceTimeoutMs", SILENCE_UNTIL_TIMEOUT_MS);
需要解决在使用fromDefaultMicrophoneInput时的有效设置方法。
解决方法
正确的属性设置方式
问题出在直接给speechConfig赋值属性的方式错误,必须使用SDK提供的setProperty()方法,结合官方定义的PropertyId常量来配置,而非直接访问属性名。针对recognizeOnceAsync场景,只需配置服务端的结束沉默超时即可:
- 使用
SpeechSDK.PropertyId.SpeechServiceConnection_EndSilenceTimeoutMs作为属性标识,通过speechConfig.setProperty()设置超时值,注意属性值需要传入字符串类型:
const SILENCE_UNTIL_TIMEOUT_MS = 5000; // 设置为5秒 speechConfig.setProperty( SpeechSDK.PropertyId.SpeechServiceConnection_EndSilenceTimeoutMs, SILENCE_UNTIL_TIMEOUT_MS.toString() );
- 无需在
audioConfig上设置Speech_SegmentationSilenceTimeoutMs,该属性用于本地音频分段处理,不适用于recognizeOnceAsync的服务端结束判定逻辑。
完整修改后的代码
var SpeechSDK, recognizer, synthesizer; var speechConfig = SpeechSDK.SpeechConfig.fromSubscription('SUB_KEY', 'SUB_REGION'); // 配置延长沉默超时 const SILENCE_UNTIL_TIMEOUT_MS = 5000; speechConfig.setProperty( SpeechSDK.PropertyId.SpeechServiceConnection_EndSilenceTimeoutMs, SILENCE_UNTIL_TIMEOUT_MS.toString() ); var audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput(); recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig); new Promise(function(resolve) { recognizer.onend = resolve; recognizer.recognizeOnceAsync( function (result) { recognizer.close(); recognizer = undefined; resolve(result.text); }, function (err) { alert(err); recognizer.close(); recognizer = undefined; } ); }).then(r => { console.log(`Azure STT interpreted: ${r}`); });
额外说明
recognizeOnceAsync为单次短语音识别设计,若需处理长语音或频繁停顿的场景,更推荐使用startContinuousRecognitionAsync,配合自定义结束逻辑控制识别周期。- 超时时长最大值受Azure Speech服务限制,当前最大可设置为10000ms(10秒),超出范围会被服务端自动调整为默认值。
内容的提问来源于stack exchange,提问作者Steinn Hauser Magnússon
相关产品推荐
相关产品推荐

