pocketsphinx NullPointerException в onBeginningOfSpeech (), но объект не является нулевым - PullRequest
0 голосов
/ 25 июня 2018

Я использую приведенный ниже код для начала прослушивания на моем устройстве голосовых команд, но как только я звоню 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");
        }
    }
}
...