java android speech-recognition google-speech-api

java - ¿Hay alguna forma de forzar que Google Speech api devuelva solo palabras como respuesta?



android speech-recognition (2)

Echa un vistazo a esta pregunta y responde .

Puede dar sugerencias de "contexto de voz" a la API, como esta:

"speech_context": { "phrases":["zero", "one", "two", ... "nine", "ten", "eleven", ... "twenty", "thirty,..., "ninety"] }

Me imagino que esto podría funcionar para otros idiomas también, como el alemán.

"speech_context": { "phrases":["eins", "zwei", "drei", ..., "elf", "zwölf" ... ] }

Estoy usando Google este api: -

https://www.google.com/speech-api/v2/recognize?output=json&lang= "+ language_code +" & key = "My key"

Para el reconocimiento de voz y está funcionando muy bien.

El problema es con los números, es decir, si digo one two three four el resultado será 1234 y si digo one thousand two hundred thirty four el resultado sigue siendo 1234 .

Otro problema es que con otros idiomas, es decir, la palabra elf en alemán es eleven . Si dices elf el resultado es 11 , en lugar de elfo.

Sé que no tenemos control sobre la api, pero ¿hay algunos parámetros o trucos que podamos agregar a esta api para forzarla a devolver solo palabras?

La respuesta algunas veces tiene el resultado correcto pero no siempre.

Estas son respuestas de muestra.

1) Cuando digo "uno dos tres cuatro"

{"result":[{"alternative":[{"transcript":"1234","confidence":0.47215959},{"transcript":"1 2 3 4","confidence":0.25},{"transcript":"one two three four","confidence":0.25},{"transcript":"1 2 34","confidence":0.33333334},{"transcript":"1 to 34","confidence":1}],"final":true}],"result_index":0}

2) Cuando digo "mil doscientos treinta y cuatro"

{"result":[{"alternative":[{"transcript":"1234","confidence":0.94247383},{"transcript":"1.254","confidence":1},{"transcript":"1284","confidence":1},{"transcript":"1244","confidence":1},{"transcript":"1230 4","confidence":1}],"final":true}],"result_index":0}

Que he hecho.

Verifique si el resultado es un número, luego divida cada número por espacio y verifique si hay la misma secuencia en la matriz de resultados. En este ejemplo, el resultado 1234 se convierte en 1 2 3 4 y buscará si hay una secuencia similar en la matriz de resultados y luego la convertirá en palabras. En el segundo caso, no hay 1 2 3 4, por lo que se mantendrá con el resultado original.

Este es el código.

String numberPattern = "[0-9]"; Pattern r1 = Pattern.compile(numberPattern); Matcher m2 = r1.matcher(output); if (m2.find()) { char[] digits2 = output.toCharArray(); String digit = ""; for (char c: digits2) { digit += c + " "; } for (int i = 1; i < jsonArray2.length(); i++) { String value = jsonArray2.getJSONObject(i).getString("transcript"); if (digit.trim().equals(value.trim())) { output = digit + " "; } } }

Entonces, el problema es cuando "digo trece cuatro ocho" este método dividirá 13 en uno tres y por lo tanto no es una solución confiable.

Actualizar

Probé la nueva API de Cloud Vision ( https://cloud.google.com/speech/ ) y es un poco mejor que la v2. El resultado para one two three four es en palabras para las que mi solución también funciona. Pero cuando digo thirteen four eight , sigue siendo el mismo resultado que en v2.

Y también el elfo es todavía 11 en alemán.

También probé speech_context que tampoco funcionó.


Es posible que tenga que convertir números (no dígitos) en palabras por sí mismo. Como hay algo de lógica en la mayoría de los idiomas (por ejemplo, inglés, alemán), puede hacerlo con un enfoque algorítmico.

Vea Cómo convertir números a palabras en java.