如何调整认知服务中语音关键词触发后的超时等待时长?
解决方案:调整语音助手关键词触发后的超时等待时长
核心问题分析
你之前设置的SpeechServiceConnection_InitialSilenceTimeoutMs和SpeechServiceConnection_EndSilenceTimeoutMs是针对连续语音识别的属性,在关键词识别阶段设置不会生效;同时你监听的事件不正确,应该监听KeywordRecognized事件(这是关键词被成功识别的专属触发点),而非SessionStarted/Stopped等事件。
正确配置与流程
1. 监听正确的触发事件
关键词识别成功后,会触发KeywordRecognized事件,你需要在这个事件回调里切换到连续识别,并设置超时参数。
2. 针对连续识别阶段设置超时
切换到连续识别前,给SpeechRecognizer设置初始静音超时(即等待用户下达指令的最长时间),这个设置才会生效。
3. 完整代码示例
// 初始化语音配置与识别器 var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "你的区域"); var recognizer = new SpeechRecognizer(speechConfig); // 加载自定义关键词模型(需提前训练生成) var keywordModel = KeywordRecognitionModel.FromFile("你的关键词模型.table"); // 注册关键词识别成功事件 recognizer.KeywordRecognized += async (sender, args) => { // 停止关键词识别 await recognizer.StopKeywordRecognitionAsync(); // 设置连续识别的初始静音超时为15秒(等待用户指令的最长时间) recognizer.Properties.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "15000"); // 可选:设置结束静音超时(用户说完指令后,等待多久结束识别) recognizer.Properties.SetProperty(PropertyId.SpeechServiceConnection_EndSilenceTimeoutMs, "5000"); // 注册连续识别的结果事件 recognizer.Recognized += (recogSender, recogArgs) => { if (recogArgs.Result.Reason == ResultReason.RecognizedSpeech) { Console.WriteLine($"识别到指令:{recogArgs.Result.Text}"); // 处理完指令后,重新启动关键词识别,等待下一次触发 recognizer.StartKeywordRecognitionAsync(keywordModel); } }; // 注册连续识别取消/超时事件 recognizer.Canceled += (cancelSender, cancelArgs) => { if (cancelArgs.Reason == CancellationReason.EndOfStream) { Console.WriteLine("等待指令超时,重新监听关键词"); } // 超时或取消后,重新启动关键词识别 recognizer.StartKeywordRecognitionAsync(keywordModel); }; // 启动连续识别,等待用户下达指令 await recognizer.StartContinuousRecognitionAsync(); }; // 启动关键词识别,进入监听状态 await recognizer.StartKeywordRecognitionAsync(keywordModel);
关键说明
- 关键词识别阶段的超时由模型本身或
SpeechServiceConnection_KeywordDetectionSilenceTimeoutMs控制,但你核心需求是关键词触发后等待用户指令,因此重点是连续识别阶段的InitialSilenceTimeoutMs设置。 - 必须在启动连续识别之前设置超时属性,否则不会生效。
- 处理完指令或超时后,记得重新启动关键词识别,回到监听状态。
内容的提问来源于stack exchange,提问作者Phineas Phred
相关产品推荐
相关产品推荐

