SpeechRecognitionEngine.InstalledRecognizers()在Unity

时间:2015-09-21 14:32:00

标签: .net dll unity3d nullreferenceexception speech

我正在尝试在Unity中使用.NET 3.0框架中的语音识别系统。因此,我将System.Speech.dll从.NET 3.0导入,因为更高版本不起作用,并将其连同其依赖项一起导入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也不起作用,并提供相同类型的错误。

提前致谢。

罗恩

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

正如user3071284指出的那样,MS .NET和Mono的要求不同,而Unity基本上只允许.NET从Microsoft .NET版本的角度出发。即便如此从Mono的角度来看,它正在运行更高的.NET版本。

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