Признание нескольких ключевых слов с помощью PocketSphinx

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

Все, что я хочу, – это код для распознавания отдельных слов, которые я могу затем switch() внутри кода, например, «вверх», «вниз», «влево», «вправо». Я не хочу признавать предложения, только отдельные слова.

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


Одна вещь, которая меня озадачивает, почему мы вообще должны использовать константу «пробуждения»?

 private static final String KWS_SEARCH = "wakeup"; private static final String KEYPHRASE = "oh mighty computer"; . . . recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); 

Что wakeup от чего-нибудь?


Я сделал некоторый прогресс (?): Используя addGrammarSearch я могу использовать файл .gram чтобы перечислить мои слова, например, up,down,left,right,forwards,backwards , что, кажется, хорошо работает, если все, что я говорю, слова. Однако любые другие слова заставят систему соответствовать тому, что сказано «ближайшему» слову от заявленных. В идеале я не хочу, чтобы распознавание происходило, если слова, произнесенные не в файле .gram

вы можете использовать addKeywordSearch который использует файл с addKeywordSearch . Одна фраза на строку с порогом для каждой фразы в //, например

 up /1.0/ down /1.0/ left /1.0/ right /1.0/ forwards /1e-1/ 

Чтобы избежать ложных тревог, необходимо выбрать порог.

Благодаря подсказке Николая (см. Его ответ выше), я разработал следующий код, который отлично работает и не распознает слова, если они не включены в список. Вы можете скопировать и вставить его непосредственно над основным classом в коде PocketSphinxDemo:

 public class PocketSphinxActivity extends Activity implements RecognitionListener { private static final String DIGITS_SEARCH = "digits"; private SpeechRecognizer recognizer; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.main); ((TextView) findViewById(R.id.caption_text)).setText("Preparing the recognizer"); try { Assets assets = new Assets(PocketSphinxActivity.this); File assetDir = assets.syncAssets(); setupRecognizer(assetDir); } catch (IOException e) { // oops } ((TextView) findViewById(R.id.caption_text)).setText("Say up, down, left, right, forwards, backwards"); reset(); } @Override public void onPartialResult(Hypothesis hypothesis) { } @Override public void onResult(Hypothesis hypothesis) { ((TextView) findViewById(R.id.result_text)).setText(""); if (hypothesis != null) { String text = hypothesis.getHypstr(); makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); } } @Override public void onBeginningOfSpeech() { } @Override public void onEndOfSpeech() { reset(); } private void setupRecognizer(File assetsDir) { File modelsDir = new File(assetsDir, "models"); recognizer = defaultSetup().setAcousticModel(new File(modelsDir, "hmm/en-us-semi")) .setDictionary(new File(modelsDir, "dict/cmu07a.dic")) .setRawLogDir(assetsDir).setKeywordThreshold(1e-20f) .getRecognizer(); recognizer.addListener(this); File digitsGrammar = new File(modelsDir, "grammar/digits.gram"); recognizer.addKeywordSearch(DIGITS_SEARCH, digitsGrammar); } private void reset() { recognizer.stop(); recognizer.startListening(DIGITS_SEARCH); } } 

Ваш файл digits.gram должен выглядеть примерно так:

 up /1e-1/ down /1e-1/ left /1e-1/ right /1e-1/ forwards /1e-1/ backwards /1e-1/ 

Вы должны поэкспериментировать с порогами внутри двойных косых // для производительности, где 1e-1 представляет 0,1 (я думаю). Я думаю, что максимум 1.0 .

И это 5:30 вечера, поэтому я могу перестать работать сейчас. Результат.

Давайте будем гением компьютера.