SpeechRecognizer 如何在程序进入后台后仍然可以识别语音

fangjj 0 信誉分
2025-03-14T06:43:29.0733333+00:00

大致程序如下:

recognizer = SpeechRecognizer();

recognizer.ContinuousRecognitionSession().ResultGenerated({ this, &MainWindow::ContinuousRecognitionSession_ResultGenerated });

recognizer.ContinuousRecognitionSession().StartAsync()

切换到其他程序,语音识别就自动停了

开发人员技术 | 通用 Windows 平台 (UWP)
{count} 票

2 个答案

排序依据: 非常有帮助
  1. fangjj 0 信誉分
    2025-03-15T01:14:52.0266667+00:00

    每次在statechange回调函数中重新初始化SpeechRecognizer并StartAsync后,可以再次识别;但是这样几次后,recognizer的state就会变为1后,并且再无法识别了。

    0 个注释 无注释

  2. 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”),之后无法再正常启动识别。

    为了解决这个问题,我建议你使用 ExtendedExecutionSession API 来请求额外的运行时间,即使应用处于最小化状态也能继续运行。示例代码如下:

    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 实例,不要重复初始化;
    • 监听应用生命周期事件 SuspendingResuming,在挂起前调用 StopAsync() 停止识别,在恢复时使用 StartAsync() 继续识别;
    • 避免频繁调用 StartAsync(),这样可能导致识别器状态异常;

    如果以上方法都无法解决问题,你可以考虑将应用迁移至 WinUI 3 框架。WinUI 3 的桌面应用不会在后台自动挂起,因此可以持续访问麦克风资源,适合实现更稳定的语音识别功能。

    希望这些建议对你有帮助!


你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。