Признание нескольких ключевых слов с помощью PocketSphinx
Я установил демо-версию PocketSphinx, и он отлично работает под Ubuntu и Eclipse, но, несмотря на попытки, я не могу понять, как бы добавить распознавание нескольких слов.
Все, что я хочу, – это код для распознавания отдельных слов, которые я могу затем switch()
внутри кода, например, «вверх», «вниз», «влево», «вправо». Я не хочу признавать предложения, только отдельные слова.
Любая помощь в этом была бы благодарна. Я заметил, что другие пользователи сталкиваются с подобными проблемами, но до сих пор никто не знает ответа.
- Android: распознавание речи без использования сервера google
- Использование Android RecognizerIntent с Bluetooth-гарнитурой
- Потоковый ввод в System.Speech.Recognition.SpeechRecognitionEngine
- Android Speech Recognition как услуга на Android 4.1 и 4.2
- API речевой речи Google
Одна вещь, которая меня озадачивает, почему мы вообще должны использовать константу «пробуждения»?
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 вечера, поэтому я могу перестать работать сейчас. Результат.