SpeechRecognitionEngine.InstalledRecognizers() returns null within Unity.

Hello,

I am trying to use the speech recognition system from the .NET 3.0 framework within Unity. I therefore have imported the System.Speech.dll, from .NET 3.0 since higher version did not work, into the assets folder together with its dependencies. I know that what I am trying to do might not work because Unity uses .NET 2.0, but I still want to give it a try. It all seems to work and I can run the game fine, but when I run it I get the error:

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)

The line of code is:

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

When I run the same line of code outside of Unity it works fine and just grabs the default and first recognizer, but somehow it doesn’t work within Unity.

I have tried switching between using .NET 2.0 instead of .NET 2.0 subset, or running the following code block instead:

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

This gives the same result and this time again at the line of code which uses “SpeechRecognitionEngine.InstalledRecognizers()”.

Does anybody know why it does not return anything?

Edit: switching to Microsoft.Speech.Recognition and importing the Microsoft.Speech.dll didn’t work either and gives the same type of error.

Thanks in advance.

Ron

You need to install Language Packs on windows.

the code
SpeechRecognitionEngine.InstalledRecognizers()
throw NullExceptions when you dont
have any recognizer installed.

See there Add Language Packs to Windows

On Windows 10 it’s simple:

  • Press Windows Key;
  • type “Settings” and press ‘Enter’;
  • select “Time & Language” then “Region & Language”;
  • on “language” section choose “English” (Or Add);
  • click in “Options” button and download the “Speech” content.

I made sure it was installed and selected and still no difference. To note it works outside of Unity3D in a separate command line program just not within Unity3D itself.

I am running into the same issue, but what could be the case is that the Microsoft.Win32.RegistryKey class in the shipped Mono mscorlib is not fully compatible with the Microsoft version.

Having a look with ILSpy in the System.Speech dll it shows the method in which the null reference occurs tries to obtain the non-public ‘hkey’ field of the passed RegistryKey instance using reflection. This field is not available in the mscorlib shipped with Unity.

Since it runs within a regular C# console application, this has nothing to do with installed language packs.