Reconocer múltiples palabras clave usando PocketSphinx

He instalado la demo de PocketSphinx y funciona bien en Ubuntu y Eclipse, pero a pesar de intentarlo no puedo entender cómo agregaría el reconocimiento de varias palabras.

Todo lo que quiero es que el código reconozca palabras sueltas, que luego puedo switch() dentro del código, por ejemplo, “arriba”, “abajo”, “izquierda”, “derecha”. No quiero reconocer oraciones, solo palabras sueltas.

Cualquier ayuda en esto sería agradecida. Descubrí que otros usuarios tienen problemas similares, pero nadie sabe la respuesta hasta el momento.


Una cosa que me desconcierta es por qué tenemos que usar la constante de “despertar” en absoluto?

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

¿Qué tiene que ver el wakeup con algo?


He progresado un poco (?): Utilizando addGrammarSearch puedo usar un archivo .gram para enumerar mis palabras, por ejemplo up,down,left,right,forwards,backwards , lo que parece funcionar bien si todo lo que digo son esas particularidades palabras. Sin embargo, cualquier otra palabra hará que el sistema haga coincidir lo que se dice con la palabra “más cercana” de las indicadas. Idealmente, no quiero que se produzca el reconocimiento si las palabras habladas no están en el archivo .gram

puede usar addKeywordSearch que utiliza para archivar con frases clave. Una frase por línea con umbral para cada frase en //, por ejemplo

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

El umbral debe ser seleccionado para evitar falsas alarmas.

Gracias a la sugerencia de Nikolay (ver su respuesta más arriba), he desarrollado el siguiente código que funciona bien, y no reconoce palabras a menos que estén en la lista. Puede copiar y pegar esto directamente sobre la clase principal en el código 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); } } 

Su archivo digits.gram debería ser algo así como:

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

Debería experimentar con los umbrales dentro de las doble barras // para el rendimiento, donde 1e-1 representa 0.1 (creo). Creo que el máximo es 1.0 .

Y son las 5.30pm así que puedo dejar de trabajar ahora. Resultado.