tutorial source recognition pocketsphinx open cmu android speech-recognition cmusphinx

android - source - Reconociendo mĂșltiples palabras clave usando PocketSphinx



speech to text open source (3)

He instalado la demostración 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 individuales, que luego puedo switch() dentro del código, por ejemplo, "arriba", "abajo", "izquierda", "derecha". No quiero reconocer oraciones, solo palabras simples.

Cualquier ayuda en esto sería agradecida. He visto que otros usuarios tienen problemas similares, pero hasta ahora nadie sabe la respuesta.

Una cosa que me desconcierta es por qué necesitamos usar la constante "despertar".

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 hecho algunos progresos (?): Usando 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 esos en particular palabras. Sin embargo, cualquier otra palabra hará que el sistema coincida con lo que se dice con la palabra "más cercana" de las indicadas. Idealmente, no quiero que se produzca el reconocimiento si las palabras pronunciadas no están en el archivo .gram ...


Gracias al consejo de Nikolay (vea 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 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 barras diagonales // para el rendimiento, donde 1e-1 representa 0.1 (creo). Creo que el máximo es 1.0 .

Y son las 5.30 p.m., así que puedo dejar de trabajar ahora. Resultado.


Trabajando para actualizar la enmienda Antinous a la demostración de PocketSphinx para permitir que se ejecute en Android Studio. Esto es lo que tengo hasta ahora

//Note: change MainActivity to PocketSphinxActivity for demo use... public class MainActivity extends Activity implements RecognitionListener { private static final String DIGITS_SEARCH = "digits"; private SpeechRecognizer recognizer; /* Used to handle permission request */ private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 1; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.main); ((TextView) findViewById(R.id.caption_text)) .setText("Preparing the recognizer"); // Check if user has given permission to record audio int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO); return; } new AsyncTask<Void, Void, Exception>() { @Override protected Exception doInBackground(Void... params) { try { Assets assets = new Assets(MainActivity.this); File assetDir = assets.syncAssets(); setupRecognizer(assetDir); } catch (IOException e) { return e; } return null; } @Override protected void onPostExecute(Exception result) { if (result != null) { ((TextView) findViewById(R.id.caption_text)) .setText("Failed to init recognizer " + result); } else { reset(); } } }.execute(); ((TextView) findViewById(R.id.caption_text)).setText("Say one, two, three, four, five, six..."); } /** * In partial result we get quick updates about current hypothesis. In * keyword spotting mode we can react here, in other modes we need to wait * for final result in onResult. */ @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) { return; } else if (hypothesis != null) { if (recognizer != null) { //recognizer.rapidSphinxPartialResult(hypothesis.getHypstr()); String text = hypothesis.getHypstr(); if (text.equals(DIGITS_SEARCH)) { recognizer.cancel(); performAction(); recognizer.startListening(DIGITS_SEARCH); }else{ //Toast.makeText(getApplicationContext(),"Partial result = " +text,Toast.LENGTH_SHORT).show(); } } } } @Override public void onResult(Hypothesis hypothesis) { ((TextView) findViewById(R.id.result_text)).setText(""); if (hypothesis != null) { String text = hypothesis.getHypstr(); makeText(getApplicationContext(), "Hypothesis" +text, Toast.LENGTH_SHORT).show(); }else if(hypothesis == null){ makeText(getApplicationContext(), "hypothesis = null", Toast.LENGTH_SHORT).show(); } } @Override public void onDestroy() { super.onDestroy(); recognizer.cancel(); recognizer.shutdown(); } @Override public void onBeginningOfSpeech() { } @Override public void onEndOfSpeech() { reset(); } @Override public void onTimeout() { } private void setupRecognizer(File assetsDir) throws IOException { // The recognizer can be configured to perform multiple searches // of different kind and switch between them recognizer = defaultSetup() .setAcousticModel(new File(assetsDir, "en-us-ptm")) .setDictionary(new File(assetsDir, "cmudict-en-us.dict")) // .setRawLogDir(assetsDir).setKeywordThreshold(1e-20f) .getRecognizer(); recognizer.addListener(this); File digitsGrammar = new File(assetsDir, "digits.gram"); recognizer.addKeywordSearch(DIGITS_SEARCH, digitsGrammar); } private void reset(){ recognizer.stop(); recognizer.startListening(DIGITS_SEARCH); } @Override public void onError(Exception error) { ((TextView) findViewById(R.id.caption_text)).setText(error.getMessage()); } public void performAction() { // do here whatever you want makeText(getApplicationContext(), "performAction done... ", Toast.LENGTH_SHORT).show(); } }

Advertencia: este es un trabajo en progreso. Vuelva más tarde. Se agradecerán sugerencias.


puede usar addKeywordSearch que utiliza para presentar 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/

Se debe seleccionar el umbral para evitar falsas alarmas.