Pocketsphinx Android - возвращает одно и то же слово для каждого другого произнесенного слова - PullRequest
0 голосов
/ 27 апреля 2018

Я скачал демо pocketsphinx-android-demo с Github и сделал некоторые модификации для своих собственных целей.

Я создал новый my-en-us.dict (словарь) файл для слов моего приложения и добавил следующие слова

hey HH EY
smarty S M AA R T IY

login L AA G IH N

Затем я создал файл login.gram (Grammer) с кодом ниже

#JSGF V1.0;

grammar login;

public <item> = login;

Затем я выполнил инициализацию распознавателя в своей активности следующим образом

public static final String KWS_SEARCH = "wakeup";
public static final String LOGIN_SEARCH = "login";

/* Keyword we are looking for to activate menu */
public static final String KEYPHRASE = "hey smarty";

private void setupRecognizer(File assetsDir) throws IOException {
    recognizer = SpeechRecognizerSetup.defaultSetup()
                .setAcousticModel(new File(assetsDir, "en-us-ptm"))
                .setDictionary(new File(assetsDir, "my-en-us.dict"))
                .getRecognizer();
    recognizer.addListener(this);

    recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);

    File loginGrammar = new File(assetsDir, "login.gram");
    recognizer.addGrammarSearch(LOGIN_SEARCH, loginGrammar);
}

Остальная часть кода такая же, как у pocketsphinx-android-demo для запуска распознавателя, прослушивания слов и т. Д.

После запуска приложения для Android я сказал «эй, умник», чтобы активировать распознавание слова «логин». Когда я говорю «логин», он возвращает «логин», но когда я говорю любое другое слово, такое как «привет», «настройки» и т. Д., Он возвращает только «логин».

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

Другой вопрос: как проверить процент точности «частичного результата» или «результата»?

1 Ответ

0 голосов
/ 28 апреля 2018

Предположительно, вы изменили реализацию onPartialResult() для обработки switchSearch(LOGIN_SEARCH).

Гипотеза постоянно "вход в систему", потому что это единственное слово, которое у вас есть в вашей грамматике. Другие слова («привет», «настройки»), вероятно, неправильно интерпретируются как «вход в систему», поскольку этому ключевому слову не присвоено значение «kws-threshold».

Для этого варианта использования вы хотите использовать addKeywordSearch() вместо грамматики. Это очень похоже на addKeyPhraseSearch(), но позволяет вам использовать несколько ключевых слов, каждое со своими порогами:

File f = new File( context.getCacheDir(), "temp.gram" );
PrintWriter p = new PrintWriter( f );
p.print(
 "hello/1e-10/\n" +
 "login/1e-10/\n" +
 "settings/1e-10/\n"
);
p.close();
recognizer.addKeywordSearch( LOGIN_SEARCH, f );

(я использовал PrintWriter здесь, потому что addKeywordSearch() требуется файл).

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

Это также должно ответить на ваш второй вопрос: вам не нужно проверять процент точности (я не думаю, что PocketSphinx даже предоставляет его для ключевых слов), потому что порог эффективно делает это для вас.

Естественно, все ваши ключевые слова должны появляться и в словаре.

...