SpeechRecognitionEngine.InstalledRecognizers() returns 在 Unity 中为空

SpeechRecognitionEngine.InstalledRecognizers() returns null within Unity

我正在尝试使用 Unity 中 .NET 3.0 框架的语音识别系统。因此,我从 .NET 3.0 导入了 System.Speech.dll,因为更高版本不起作用,连同它的依赖项一起导入到资产文件夹中。我知道我尝试做的事情可能行不通,因为 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()".

的代码行

有人知道为什么它 return 什么都没有吗?

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

提前致谢。

罗恩

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

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

我 运行 遇到了同样的问题,但似乎是 Microsoft.Win32.RegistryKey class 附带的 Mono mscorlib 与微软版本。

在 System.Speech dll 中使用 ILSpy 查看它显示出现空引用的方法试图获取传递的 RegistryKey 实例的非 public 'hkey' 字段使用反射。该字段在 Unity 附带的 mscorlib 中不可用。