.NET中SpeechSynthesizer调用抛出System.NullReferenceException问题求助
问题根因
该异常和代码逻辑无关,由System.Speech库的底层依赖缺失导致:从堆栈信息可看出,库在读取Windows语音相关注册表项时拿到空值,最终触发空引用报错。
可行解决方案
- 检查系统已安装的TTS语音包
System.Speech依赖Windows桌面版SAPI语音,不兼容UWP应用商店提供的语音包。你可以打开控制面板→语音识别→文本到语音,查看「语音选择」下拉框是否有可选语音,若为空需安装对应语言的桌面版TTS语音包,比如中文场景需安装Microsoft Huihui Desktop类桌面语音。 - 调整程序编译架构
如果你的系统是64位,程序编译时若指定为x86架构,会优先读取Wow6432Node下的语音注册表项,若该路径下无对应语音注册信息就会报错。你可以修改项目的目标平台,和系统架构保持一致,或切换「首选32位」开关测试。 - 修复语音注册表项
若控制面板能正常看到可选语音仍报错,就是对应注册表路径缺失。64位系统需检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices、32位系统需检查HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Speech\Voices路径下是否存在已安装语音的对应子项,缺失的话可以从正常运行的同版本系统导出对应注册表项,导入到当前设备即可。 - 调整运行权限
如果程序在服务、沙箱等受限环境运行,默认权限无法读取HKEY_LOCAL_MACHINE下的注册表项,你可以尝试以管理员身份运行程序,或给程序运行账号授予上述语音注册表路径的读取权限。
另外注意:System.Speech.Synthesis仅支持Windows平台,若你在.NET Core/.NET 5+的跨平台场景使用该库,也会出现依赖报错,需更换跨平台TTS方案。
内容的提问来源于stack exchange,提问作者Soniczac7
相关产品推荐
相关产品推荐

