Я использую приведенный ниже код для начала прослушивания на моем устройстве голосовых команд, но как только я звоню SpeechRecognizer.StartListening()
, я получаю исключение NullPointerException.
Вот полная ошибка:
Java.Lang.NullPointerException: попытка вызвать метод интерфейса 'void edu.cmu.pocketsphinx.RecognitionListener.onBeginningOfSpeech ()' для ссылки на пустой объект
Как вы можете видеть из кода ниже, я проверяю, чтобы убедиться, что моя ссылка на объект НЕ является нулевой. Кто-нибудь может пролить немного света здесь?
public VoiceRecognizer(MainActivity mainActivity)
{
_mainActivity = mainActivity;
InitializeVoiceRecognizer();
}
private async void InitializeVoiceRecognizer()
{
await SetupRecognizer();
SwitchSearch("wakeup");
}
private async Task SetupRecognizer()
{
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
var config = Edu.Cmu.Pocketsphinx.Decoder.DefaultConfig();
Java.IO.File filePath = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory + "/MyApp/voice_recognition");
speechRecognizer = SpeechRecognizerSetup
.DefaultSetup()
.SetAcousticModel(new Java.IO.File(filePath, "en-us-ptm"))
.SetDictionary(new Java.IO.File(filePath, "cmudict-en-us.dict"))
.SetKeywordThreshold(1e-45f)
.SetBoolean("-allphone_ci", true)
.Recognizer;
speechRecognizer.AddListener(this);
speechRecognizer.AddKeywordSearch("wakeup", new Java.IO.File(filePath, "commands.lst"));
}
private void SwitchSearch(string searchName)
{
speechRecognizer.Stop();
if (searchName == "wakeup")
{
if (speechRecognizer != null)
speechRecognizer.StartListening(searchName);
}
}
ТИА
Редактировать: Включая весь класс VoiceRecognizer
для большего контекста:
using System;
using System.Threading.Tasks;
using Edu.Cmu.Pocketsphinx;
namespace ExpeditionSpotMobile.Droid.Utilities
{
public class VoiceRecognizer : Java.Lang.Object, IRecognitionListener
{
private SpeechRecognizer speechRecognizer;
public IntPtr Handle
{
get; set;
}
MainActivity _mainActivity;
public VoiceRecognizer()
{
}
public VoiceRecognizer(MainActivity mainActivity)
{
_mainActivity = mainActivity;
InitializeVoiceRecognizer();
}
private async Task InitializeVoiceRecognizer()
{
await SetupRecognizer();
SwitchSearch("wakeup");
}
private async Task SetupRecognizer()
{
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
var config = Edu.Cmu.Pocketsphinx.Decoder.DefaultConfig();
Java.IO.File filePath = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory + "/MyApp/voice_recognition");
speechRecognizer = SpeechRecognizerSetup
.DefaultSetup()
.SetAcousticModel(new Java.IO.File(filePath, "en-us-ptm"))
.SetDictionary(new Java.IO.File(filePath, "cmudict-en-us.dict"))
.SetKeywordThreshold(1e-45f)
.SetBoolean("-allphone_ci", true)
.Recognizer;
speechRecognizer.AddListener(this);
speechRecognizer.AddKeywordSearch("wakeup", new Java.IO.File(filePath, "commands.lst"));
}
private void SwitchSearch(string searchName)
{
speechRecognizer.Stop();
if (searchName == "wakeup")
{
if (speechRecognizer != null)
speechRecognizer.StartListening(searchName);
}
}
public void Dispose()
{
if (speechRecognizer != null)
{
speechRecognizer.Cancel();
speechRecognizer.Shutdown();
}
}
public void OnBeginningOfSpeech()
{
}
public void OnEndOfSpeech()
{
if (speechRecognizer.SearchName != "wakeup")
SwitchSearch("wakeup");
}
public void Stop()
{
speechRecognizer.Stop();
}
public void OnError(Java.Lang.Exception p0)
{
//throw new NotImplementedException();
}
public void OnPartialResult(Hypothesis hypothesis)
{
if (hypothesis == null)
return;
SwitchSearch("wakeup");
}
public void OnResult(Hypothesis hypothesis)
{
if (hypothesis != null)
{
string text = hypothesis.Hypstr;
// do something here
}
}
public void OnTimeout()
{
SwitchSearch("wakeup");
}
}
}