2015-09-21 4 views
0

Я пытаюсь использовать систему распознавания речи из платформы .NET 3.0 в Unity. Поэтому я импортировал файл System.Speech.dll из .NET 3.0, так как более высокая версия не работала, в папку с активами вместе со своими зависимостями. Я знаю, что то, что я пытаюсь сделать, может не работать, потому что Unity использует .NET 2.0, но я все же хочу попробовать. Все это, кажется, работает, и я могу запустить игру штраф, но когда я запускаю его я получаю сообщение об ошибке:SpeechRecognitionEngine.InstalledRecognizers() возвращает null в Unity

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 не работает и дает такой же тип ошибки.

Заранее спасибо.

Рон

+0

Unity использует Mono вместо .NET. Сведения о том, как Mono сравнивается с .NET для Unity, см .: http://docs.unity3d.com/410/Documentation/ScriptReference/MonoCompatibility.html – user3071284

ответ

1

Как user3071284 отметил, MS .NET и Mono различны в своих требованиях, и единство в основном только позволяет .NET с точки зрения Microsoft .NET версии. Даже «он использует более высокую версию .NET с точки зрения Mono.

Эта тема была подробно освещена на форумах Unity, я несколько раз нанёс ей удар, и придумал это. https://www.youtube.com/watch?v=CuLwwcekoi8 У меня больше нет исходного кода для этого проекта, но он по существу использовал сетевой протокол UDP для связи с бэкэнд-сервисом, использующим распознавание речи на более высокой версии .NET, одна вещь, которую вы могли бы сделать, это посмотреть на UnityBridge Что по существу делает то же самое, просто делает его более удобным для пользователя. Вы можете посмотреть на manual.

2

Я столкнулся с той же проблемой, но, похоже, что класс Microsoft.Win32.RegistryKey в поставляемом Mono mscorlib не полностью совместим с версией Microsoft.

Обращаясь к ILSpy в dll System.Speech, он показывает метод, в котором происходит пустая ссылка, пытается получить непубличное поле «hkey» прошедшего экземпляра RegistryKey с использованием отражения. Это поле недоступно в mscorlib, поставляемом с Unity.