树莓派3(Windows IoT Core)上UWP语音识别功能失效问题
首先先看你的代码里有个小细节:你连续调用了两次await speechRecognizer.CompileConstraintsAsync();,第一次调用的时候还没添加webSearchGrammar约束,这一步其实是多余的,建议删掉第一次调用,只在添加约束后执行一次编译,避免不必要的资源消耗——虽然这可能不是导致树莓派识别失效的核心原因,但先修正代码会更规范:
var speechRecognizer = new SpeechRecognizer(); // 移除多余的CompileConstraintsAsync调用 var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint( Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch"); speechRecognizer.Constraints.Add(webSearchGrammar); await speechRecognizer.CompileConstraintsAsync(); SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync(); var question = speechRecognitionResult;
接下来针对你提到的「更新Win10 IoT Core后失效,之前正常」的情况,给你几个针对性的排查方向:
检查语音识别语言包是否正常安装
Win10 IoT Core更新后,有时会重置语言相关组件。你需要确认树莓派上安装了目标语言的语音识别包:- 通过浏览器访问树莓派的设备门户(默认地址是
http://<你的树莓派IP>:8080) - 进入System > Language设置页面
- 找到你使用的语言,确认「Speech recognition」组件已安装;如果没有,点击安装并等待完成,之后重启设备。
- 通过浏览器访问树莓派的设备门户(默认地址是
确认应用麦克风权限未被重置
系统更新后,应用的权限可能被重置。你需要:- 在树莓派的IoT Core开始菜单里找到你的应用,右键选择Settings
- 确认Microphone权限已开启
- 同时检查你的UWP应用清单文件(Package.appxmanifest)里是否已经声明了麦克风权限:
<Capabilities> <Capability Name="internetClient" /> <DeviceCapability Name="microphone" /> </Capabilities>
尝试切换无UI的识别模式测试
RecognizeWithUIAsync()依赖系统的语音识别UI,在IoT Core的某些版本更新后,UI组件可能出现兼容性问题。你可以暂时换成RecognizeAsync()测试,看是否能正常获取识别结果:SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeAsync();如果这个方式能正常工作,那问题可能出在UI层,可以考虑保持无UI模式,或者尝试修复系统UI组件。
排查语音识别服务状态
你可以通过PowerShell连接到树莓派,检查语音相关服务是否正常运行:- 打开PowerShell,执行
Enter-PSSession -ComputerName <你的树莓派IP> -Credential <IoT Core用户名>(默认用户名是Administrator) - 执行
Get-Service | Where-Object {$_.Name -like "*Speech*"},查看相关服务的状态;如果服务未运行,尝试启动服务:Start-Service <服务名>
- 打开PowerShell,执行
简化约束测试
暂时移除WebSearch约束,使用默认的语音识别约束测试,看是否能正常识别:var speechRecognizer = new SpeechRecognizer(); // 不添加自定义约束,使用默认配置 await speechRecognizer.CompileConstraintsAsync(); var result = await speechRecognizer.RecognizeAsync();如果这样能正常识别,说明WebSearch场景在更新后的IoT Core上有兼容性问题,可以尝试更换其他场景(比如
Dictation)看看。
内容的提问来源于stack exchange,提问作者Raviteja

