每次在statechange回调函数中重新初始化SpeechRecognizer并StartAsync后,可以再次识别;但是这样几次后,recognizer的state就会变为1后,并且再无法识别了。
SpeechRecognizer 如何在程序进入后台后仍然可以识别语音
fangjj
0
信誉分
大致程序如下:
recognizer = SpeechRecognizer();
recognizer.ContinuousRecognitionSession().ResultGenerated({ this, &MainWindow::ContinuousRecognitionSession_ResultGenerated });
recognizer.ContinuousRecognitionSession().StartAsync()
切换到其他程序,语音识别就自动停了
开发人员技术 | 通用 Windows 平台 (UWP)
开发人员技术 | 通用 Windows 平台 (UWP)
用于构建和发布适用于 Windows 设备的应用的Microsoft平台。
-
Harry Vo (WICLOUD CORPORATION) 4,665 信誉分 Microsoft 外部员工 仲裁人
2025-07-22T08:58:19.4866667+00:00 Hi @fangjj,
UWP 应用在切换到后台后会自动挂起,这会导致麦克风权限被撤销,从而语音识别停止。虽然你在
statechange回调中重新初始化SpeechRecognizer并调用StartAsync能暂时恢复识别,但这样做多次后会导致资源冲突或泄漏,最终导致识别器进入无效状态(state = 1,可能表示“Idle”或“Unrecoverable”),之后无法再正常启动识别。为了解决这个问题,我建议你使用
ExtendedExecutionSessionAPI 来请求额外的运行时间,即使应用处于最小化状态也能继续运行。示例代码如下:ExtendedExecutionSession session = new ExtendedExecutionSession { Reason = ExtendedExecutionReason.Unspecified, Description = "Enable background speech recognition" }; session.Revoked += SessionRevoked; ExtendedExecutionResult result = await session.RequestExtensionAsync(); if (result == ExtendedExecutionResult.Allowed) { // 启动语音识别 } else { // 无法获得扩展执行权限时的备用处理 }此外,不建议在每次
statechange回调时销毁并重新创建识别器。推荐的做法是:- 在整个会话期间保持一个
SpeechRecognizer实例,不要重复初始化; - 监听应用生命周期事件
Suspending和Resuming,在挂起前调用StopAsync()停止识别,在恢复时使用StartAsync()继续识别; - 避免频繁调用
StartAsync(),这样可能导致识别器状态异常;
如果以上方法都无法解决问题,你可以考虑将应用迁移至 WinUI 3 框架。WinUI 3 的桌面应用不会在后台自动挂起,因此可以持续访问麦克风资源,适合实现更稳定的语音识别功能。
希望这些建议对你有帮助!
- 在整个会话期间保持一个