Unity中System.Speech.Recognizer后台运行失效问题求助
问题原因及解决办法
核心原因
Windows系统自带的Speech.Recognizer(听写识别器)存在前台激活依赖机制:系统为了优化资源占用,会在程序失去前台焦点时自动暂停或终止识别器进程,即便项目设置了允许后台运行,也无法绕过这个系统层面的限制。另外,OnLostFocus事件触发时程序已失去前台权限,此时重启识别器的操作会被系统权限拦截,导致无法生效。
解决办法
1. 替换为SpeechRecognitionEngine(推荐)
改用程序自主控制的SpeechRecognitionEngine,它不依赖系统前台激活状态,只要程序进程在运行,就能持续进行语音识别。示例代码:
using System.Speech.Recognition; // 初始化自定义识别引擎 var speechEngine = new SpeechRecognitionEngine(); // 加载听写语法(支持自由语音输入) speechEngine.LoadGrammar(new DictationGrammar()); // 设置默认音频输入设备 speechEngine.SetInputToDefaultAudioDevice(); // 绑定识别结果处理事件 speechEngine.SpeechRecognized += (sender, e) => { // 在这里处理识别到的文本 string result = e.Result.Text; }; // 启动异步持续识别 speechEngine.RecognizeAsync(RecognizeMode.Multiple);
这个引擎完全由程序控制,不受窗口焦点切换影响,是解决该问题最稳定的方案。
2. 针对Speech.Recognizer的折中方案(不推荐)
如果必须使用系统识别器,可以通过全局窗口钩子监听系统切换事件,在程序即将失去焦点前提前重启识别器;或者在后台定时检查识别器状态,若检测到已停止,尝试重新初始化。但这种方法稳定性差,因为系统仍可能拦截后台的识别器启动请求,仅作为临时过渡方案。
3. 确认系统权限
检查Windows设置中的应用权限:
- 确保程序拥有音频录制权限(设置→隐私和安全性→麦克风)
- 确认程序在后台应用权限中被允许运行(设置→应用→安装的应用→找到你的程序→高级选项→后台应用权限设为“始终允许”)
内容的提问来源于stack exchange,提问作者Floris Hooge
相关产品推荐
相关产品推荐

