【问题标题】:SpeechRecognitionEngine.InstalledRecognizers() returns null within UnitySpeechRecognitionEngine.InstalledRecognizers() 在 Unity 中返回 null
【发布时间】:2015-12-18 07:25:35
【问题描述】:

我正在尝试在 Unity 中使用 .NET 3.0 框架中的语音识别系统。因此,我从 .NET 3.0 导入了 System.Speech.dll,因为更高版本不起作用,连同它的依赖项一起进入 assets 文件夹。我知道我正在尝试做的事情可能行不通,因为 Unity 使用 .NET 2.0,但我仍然想尝试一下。一切似乎都正常,我可以正常运行游戏,但是当我运行它时出现错误:

 NullReferenceException: Object reference not set to an instance of an object
 System.Speech.Internal.ObjectTokens.RegistryDataKey.HKEYfromRegKey (Microsoft.Win32.RegistryKey regKey)
 System.Speech.Internal.ObjectTokens.RegistryDataKey.RootHKEYFromRegPath (System.String rootPath)
 System.Speech.Internal.ObjectTokens.RegistryDataKey.Open (System.String registryPath, Boolean fCreateIfNotExist)
 System.Speech.Internal.ObjectTokens.ObjectTokenCategory.Create (System.String sCategoryId)
 System.Speech.Recognition.SpeechRecognitionEngine.InstalledRecognizers ()
 VoiceCommandListener.Start () (at Assets/Scripts/VoiceCommandListener.cs:14)

代码行是:

 SpeechRecognitionEngine speechRecognitionEngine = new SpeechRecognitionEngine(SpeechRecognitionEngine.InstalledRecognizers()[0]);

当我在 Unity 之外运行同一行代码时,它可以正常工作并且只获取默认和第一个识别器,但不知何故它在 Unity 中不起作用。

我尝试在使用 .NET 2.0 而不是 .NET 2.0 子集之间切换,切换到 Microsoft.Speech.Recognition 并导入 Microsoft.Speech.dll 也不起作用,并给出了相同类型的错误。 我还尝试运行以下代码块:

 SpeechRecognitionEngine speechRecognitionEngine = null;
 foreach (RecognizerInfo info in SpeechRecognitionEngine.InstalledRecognizers()) {
     if (info.Culture.Equals(requiredCulture) && info.Id == requiredId ) {
         speechRecognitionEngine = new SpeechRecognitionEngine(info);
         break;
     }
 }

这给出了相同的结果,这一次再次出现在使用“SpeechRecognitionEngine.InstalledRecognizers()”的代码行。

有人知道为什么它不返回任何东西吗?

切换到 Microsoft.Speech.Recognition 并导入 Microsoft.Speech.dll 也不起作用,并出现相同类型的错误。

提前致谢。

罗恩

【问题讨论】:

标签: .net dll unity3d nullreferenceexception speech


【解决方案1】:

我遇到了同样的问题,但似乎是随附的 Mono mscorlib 中的 Microsoft.Win32.RegistryKey 类与 Microsoft 版本不完全兼容。

查看 System.Speech dll 中的 ILSpy,它显示了发生空引用的方法尝试使用反射获取传递的 RegistryKey 实例的非公共“hkey”字段。 Unity 附带的 mscorlib 中没有此字段。

【讨论】:

    【解决方案2】:

    正如 user3071284 所指出的,MS .NET 和 Mono 的要求不同,从 Microsoft .NET 版本的角度来看,unity 基本上只允许 .NET。从 Mono 的角度来看,即使它运行的是更高的 .NET 版本。

    Unity 论坛上已经详细介绍了这个主题,几年前我尝试了一下,并想出了这个。 https://www.youtube.com/watch?v=CuLwwcekoi8 我不再拥有该项目的源代码,但它基本上使用 UDP 网络协议与在更高 .NET 版本上运行语音识别的后端服务进行通信,您可以做的一件事是查看UnityBridge 它本质上做同样的事情,只是让它更加用户友好。你可以看看manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多