PocketSphynix не непрерывно выводит речь в текст, как ожидалось - PullRequest
0 голосов
/ 26 января 2019

Мотивация и история (Не нужно читать дополнительно):

У меня был рабочий кусок кода, который использовал бы карманный sphynix и распознаватель Google вместе, чтобы поддерживать как голосовую навигацию на основе меню, так и непрерывную передачу текста.

Поэтому код пользователя перемещается по приложению по голосу, если слова, которые они использовали, соответствуют элементу меню, например:

"Хорошо, атом, начни х" "Хорошо, атом, останови х" "Ок, атом, делай г"

Примечание: PocketSphinx обнаружил триггерную фразу "Ok atom", затем убитый PocketSphinx был отменен, а голос Google использовался для более длинных фраз из-за большей точности.

Также, если распознаватель не совпадал, он начал бы непрерывную речь к тексту, который был отправлен бэкенду как чат-бот (обрабатывается google voice):

"Привет, меня зовут доктор Грин палец. "Что за ужин сегодня вечером ..."

Если в течение 10 секунд было тихо, голос Google был бы отменен, и PocketSphinx был бы снова запущен для ключевого слова / wakeword trigger = "Ok atom"

** Все было хорошо, пока мне не нужны фактические необработанные аудио-байты также для бэкэнд-приложения. У меня есть поиск по всему стеку, и ни одно из решений не работает и не является реалистичным для моего проекта.

Затем я обнаружил, что PocketSphinx может вернуть вам необработанные данные, поэтому мне пришлось выделить Google Voice и использовать ТОЛЬКО PocketSphinx **

Актуальная проблема:

Однако после рефакторинга / удаления распознавателя голоса Google и использования только PocketSphinx, поскольку мне требуется легкий доступ к «необработанным аудио-байтам» распознавания, PocketSphinx продолжает слышать свое триггерное слово «ok atom», а не любые другие слова / голос до или после этого триггерного слова !!!

Независимо от того, что я говорю, например, "привет", "привет", "1,2,3" и т. Д. ... он слышит только триггер "атом атома", см. Мой соответствующий фрагмент кода :

Фрагмент кода AsynTask, который устанавливает карманного сфинкса:

 @Override
        protected Exception doInBackground(Void... params) {
            try {
                SpeechRecognitionService speechService = serviceReference.get();

                Assets assets = new Assets(speechService);


                File assetDir = assets.syncAssets();


                speechService.pocketSphinxRecognizer = defaultSetup()
                        .setAcousticModel(new File(assetDir, "en-us-ptm"))
                        .setDictionary(new File(assetDir, "cmudict-en-us.dict"))
                        // threshold to balance between false +/- (higher is less sensitive, was 1e-45f)
                        .setKeywordThreshold(1e-30f)
                        .getRecognizer();
                speechService.pocketSphinxRecognizer.addListener(listener);

                // create keyword-activation search
                speechService.pocketSphinxRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
            } catch (IOException e) {
                return e;
            }
            return null;
        }

Фрагмент кода для методов жизненного цикла карманного сфинкса:

private String KWS_SEARCH = "ok atom"; 

private void switchSearch(String searchName) {
            pocketSphinxRecognizer.stop();
            if (searchName.equals(KWS_SEARCH))
                pocketSphinxRecognizer.startListening(searchName);
            else
                pocketSphinxRecognizer.startListening(searchName, 10000);
        }

        private class PocketSphinxRecognitionListener implements edu.cmu.pocketsphinx.RecognitionListener {
            @Override
            public void onPartialResult(Hypothesis hypothesis) {

                try {
                    if (hypothesis != null) {
                        String cmd = hypothesis.getHypstr();

                        Log.d(TAG, "onPartialResult:" + cmd);

                        if (cmd.equalsIgnoreCase(KWS_SEARCH))
                        {

                            handleResults(cmd);
                        }
                        else
                        {
                            sendToBacknedForProcessing(cmd);
                        }

                    }

                }
                catch (NullPointerException exc)
                {
                    exc.printStackTrace();
                }
            }

            @Override
            public void onBeginningOfSpeech() {}

            @Override
            public void onEndOfSpeech() {

                if (!pocketSphinxRecognizer.getSearchName().equals(KWS_SEARCH))
                {
                  switchSearch(KWS_SEARCH);
                }
            }

            @Override
            public void onResult(Hypothesis hypothesis) {


                if (hypothesis != null) {
                    String cmd = hypothesis.getHypstr();
                    Log.d(TAG, "onResult:" + cmd);

                        sendToBacknedForProcessing(cmd);
                }
                }


            @Override
            public void onError(Exception e) {
                Log.e(TAG, "Pocketsphinx encounted an exception: " + e.getMessage());
            }

            @Override
            public void onTimeout() {
                switchSearch(KWS_SEARCH);
            }
        }

Я действительно следил за этой популярной статьей (https://www.guidearea.com/pocketsphinx-continuous-speech-recognition-android-tutorial/) шаг за шагом, но все еще нет правильных результатов.

То, что я хочу сделать, - это поддерживать режимы голосовой навигации, если правильные слова распознаются, или непрерывное отображение текста, отправляемого на сервер.

Спасибо за миллион!

...