Использование PocketSphinx для непрерывного распознавания - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь создать аудио-интерфейс для редактирования текста и в настоящее время использую PocketSphinx, чтобы попытаться создать v1 проекта. (Я понимаю, что есть другие решения, которые могут решить эту задачу, и я, вероятно, попробую другие для V2.) Я строю демонстрационное приложение, которое включено в материалы карманного сфинкса здесь: https://github.com/cmusphinx/pocketsphinx-android-demo

Я могу использовать режим поиска по ключевым словам и распознать мою команду: «создать файл», которая создает пустой документ. Как только новый файл будет открыт, я хочу, чтобы распознаватель затем переключился в режим GrammarSearch и, используя небольшой список слов, который я ввел, прослушивал в течение 5 секунд и обновлял заголовок, затем прослушивал в течение 10 секунд и обновлял тело документа.

До сих пор я пытался адаптировать PocketSphinxActivity, представленный в демонстрационном приложении, с ограниченным успехом. Вот мои текущие настройки распознавателя:

private void setupRecognizer(java.io.File assetsDir) throws IOException {
        // The recognizer can be configured to perform multiple searches
        // of different kind and switch between them

        recognizer = SpeechRecognizerSetup.defaultSetup()
                .setAcousticModel(new java.io.File(assetsDir, "en-us-ptm"))
                .setDictionary(new java.io.File(assetsDir, "cmudict-en-us.dict"))

                //.setRawLogDir(assetsDir) // To disable logging of raw audio comment out this call (takes a lot of space on the device)

                .getRecognizer();
        recognizer.addListener(this);

        /* In your application you might not need to add all those searches.
          They are added here for demonstration. You can leave just one.
         */

        //Create keyword-activation search.
        recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);

        //Create grammar-based search for selection between demos
        java.io.File menuGrammar = new java.io.File(assetsDir, "drivemenu.gram");
        recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar);

        java.io.File menuCreate = new java.io.File(assetsDir, "presentation_commands.gram");
        recognizer.addGrammarSearch(CREATE_DOC, menuCreate);
    }

, где команды представления:

#JSGF V1.0;

grammar presentation_commands;

<presentation_command> = welcome |
                          to |
                          my |
                          presentation |
                          everybody |
                          november |
                          demonstration |
                          file;

public <presentation_commands> = <presentation_command>+;

(Просто несколько тестовых слов, которые я буду использовать для заполнения моего простого демонстрационного файла.)

Я могу сказать, что могу сказать: «Создать файл», и мой новый файл будет создан, однако именно в этот момент я хочу, чтобы следующее было счастливым, но я не смог его достичь: Прослушать в течение 3 секунд и взять данный текст в качестве имени файла, заполнить мой файл заголовком EditText элемента. Прослушайте в течение 10 секунд и используйте данный текст в качестве текста для моего элемента Body EditText.

Вот что я сейчас пытаюсь сделать:

@Override
    public void onPartialResult(Hypothesis hypothesis) {
        if (hypothesis == null)
            return;

        String text = hypothesis.getHypstr();
        //Toast.makeText(this, text, Toast.LENGTH_SHORT).show();

        if (text.equals(KEYPHRASE)) {
            //Toast.makeText(this, "Hit Keyphrase in if", Toast.LENGTH_SHORT).show();
            recognizer.stop();
            recognizer.startListening(MENU_SEARCH);
        } else if (text.equals(CREATE_FILE)) {
            recognizer.stop();
            createFile();
            populateFileName();
            Toast.makeText(this, "Created File", Toast.LENGTH_SHORT).show();
        } 
//        } else if (file_name_bool){
//            fillTitle(text);
//        } else if (file_body_bool) {
//            fillBody(text);
//        }
        else {
            ((TextView) findViewById(R.id.update_text)).setText(text);
        }
    }

Я могу поразить блок «text.equals (CREATE_FILE)» надежно, и моя функция createFile () не работает с распознавателем, а только с API Google Drive. Моей целью было отключить прослушивание и заполнение с помощью функции populateFileName ():

public void populateFileName() {
        file_name_bool = true;
        recognizer.startListening(CREATE_DOC, 5000);
    }

    public void fillTitle(String text) {
        recognizer.stop();
        file_name_bool = false;
        file_body_bool = true;
        mFileTitleEditText.setText(text);
        recognizer.startListening(CREATE_DOC, 10000);
    }

    public void fillBody(String text) {
        recognizer.stop();
        file_body_bool = false;
        mDocContentEditText.setText(text);
        recognizer.startListening(KWS_SEARCH);
    }

Первоначально я думал, что, как только я переключусь в режим CREATE_DOC, приложение просто будет ждать, пока оно не достигнет моей функции onResult:

@Override
    public void onResult(Hypothesis hypothesis) {
        Toast.makeText(this, "in onResult", Toast.LENGTH_SHORT).show();
        ((TextView) findViewById(R.id.update_text)).setText("");
        if (hypothesis != null) {
            String text = hypothesis.getHypstr();

            if (file_name_bool)
                fillTitle(text);
            else if (file_body_bool)
                fillBody(text);
            else
                makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
        }
    }

Тем не менее, я, кажется, не нажимаю на мою функцию onResult (). Вместо этого поведение, которое я получаю, является блоком else моего onPartialResult (), который просто обновляет editText моей речью. (Одна хорошая новость заключается в том, что обновляемая речь извлекает правильный словарный запас из моего файла грамматики, так что это небольшая победа). К сожалению, я никогда не могу обновить заголовок файла или тело файла, и я не уверен, почему.

Когда я пытаюсь раскомментировать блоки моего onPartialResult () для проверки логических значений, я могу обновить свое имя файла и тело файла, однако я могу получить только одно слово, поскольку мой распознаватель немедленно останавливается. По этой причине я хотел бы найти способ не использовать onPartialResult, а вместо этого просто использовать onResult, чтобы он мог добавить полный речевой ввод.

Заранее спасибо и извинения, если это основной вопрос. Я также просматривал этого урока , но не смог его успешно адаптировать.

...