voz reconocimiento programar por para google español dictado descargar control como comandos comando activar android speech-recognition offline speech-to-text google-now

por - reconocimiento de voz android programar



Reconocimiento de voz fuera de línea en Android(JellyBean) (8)

Parece que Google ha puesto a disposición el reconocimiento de voz fuera de línea de Google Now para aplicaciones de terceros. Está siendo utilizado por la aplicación llamada Utter .

¿Alguien ha visto alguna implementación de cómo hacer comandos de voz simples con este rec de voz sin conexión? ¿Simplemente usas la API SpeechRecognizer regular y funciona automáticamente?


Aparentemente es posible instalar manualmente el reconocimiento de voz sin conexión descargando los archivos directamente e instalándolos en las ubicaciones correctas de forma manual. Supongo que esto es solo una forma de eludir los requisitos de hardware de Google. Sin embargo, personalmente no tuve que reiniciar ni nada, simplemente cambié al Reino Unido y de nuevo lo hice.


CMUSphinx, un juego de herramientas de reconocimiento de voz de código abierto, implementa un reconocimiento fuera de línea sencillo y flexible en Android. Funciona de manera puramente fuera de línea, rápido y configurable. Puede escuchar continuamente palabras clave, por ejemplo.

Puede encontrar el último código y tutorial aquí .


El ejemplo de trabajo se da a continuación,

MyService.class

public class MyService extends Service implements SpeechDelegate, Speech.stopDueToDelay { public static SpeechDelegate delegate; @Override public int onStartCommand(Intent intent, int flags, int startId) { //TODO do something useful try { if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { ((AudioManager) Objects.requireNonNull( getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true); } } catch (Exception e) { e.printStackTrace(); } Speech.init(this); delegate = this; Speech.getInstance().setListener(this); if (Speech.getInstance().isListening()) { Speech.getInstance().stopListening(); } else { System.setProperty("rx.unsafe-disable", "True"); RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> { if (granted) { // Always true pre-M try { Speech.getInstance().stopTextToSpeech(); Speech.getInstance().startListening(null, this); } catch (SpeechRecognitionNotAvailable exc) { //showSpeechNotSupportedDialog(); } catch (GoogleVoiceTypingDisabledException exc) { //showEnableGoogleVoiceTyping(); } } else { Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show(); } }); } return Service.START_STICKY; } @Override public IBinder onBind(Intent intent) { //TODO for communication return IBinder implementation return null; } @Override public void onStartOfSpeech() { } @Override public void onSpeechRmsChanged(float value) { } @Override public void onSpeechPartialResults(List<String> results) { for (String partial : results) { Log.d("Result", partial+""); } } @Override public void onSpeechResult(String result) { Log.d("Result", result+""); if (!TextUtils.isEmpty(result)) { Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); } } @Override public void onSpecifiedCommandPronounced(String event) { try { if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { ((AudioManager) Objects.requireNonNull( getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true); } } catch (Exception e) { e.printStackTrace(); } if (Speech.getInstance().isListening()) { Speech.getInstance().stopListening(); } else { RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> { if (granted) { // Always true pre-M try { Speech.getInstance().stopTextToSpeech(); Speech.getInstance().startListening(null, this); } catch (SpeechRecognitionNotAvailable exc) { //showSpeechNotSupportedDialog(); } catch (GoogleVoiceTypingDisabledException exc) { //showEnableGoogleVoiceTyping(); } } else { Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show(); } }); } } @Override public void onTaskRemoved(Intent rootIntent) { //Restarting the service if it is removed. PendingIntent service = PendingIntent.getService(getApplicationContext(), new Random().nextInt(), new Intent(getApplicationContext(), MyService.class), PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); assert alarmManager != null; alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service); super.onTaskRemoved(rootIntent); } }

Para más detalles,

https://github.com/sachinvarma/Speech-Recognizer

Espero que esto ayude a alguien en el futuro.


En resumen, no tengo la implementación, sino la explicación.

Google no habilitó el reconocimiento de voz fuera de línea para aplicaciones de terceros. El reconocimiento fuera de línea solo es accesible a través del teclado. Ben Randall (el desarrollador de pronunciar!) Explica su solución en un artículo en Android Police:

Había implementado mi propio teclado y estaba cambiando entre Google Voice Typing y el teclado predeterminado de los usuarios con un campo de texto de edición invisible y una actividad transparente para obtener la entrada. Sucio hack!

Esta era la única forma de hacerlo, ya que un solo IME o una aplicación del sistema (que era el hack de mi raíz) podía activar el tipeo de voz fuera de línea . El otro tipo de API de reconocimiento ... no lo activó y simplemente falló con un error del servidor. ... ¡Un montón de trabajo perdido para mí en la solución! Pero al menos estaba listo para la implementación ...

De Utter! Afirma ser la primera aplicación que no es IME para utilizar el reconocimiento de voz fuera de línea en Jelly Bean


Estaba lidiando con esto y noté que necesita instalar el paquete fuera de línea para su Idioma. Mi configuración de idioma era "Español (Estados Unidos)" pero no hay un paquete fuera de línea para ese idioma, así que cuando apagué toda la conectividad de red, recibí una alerta de RecognizerIntent que decía que no podía llegar a Google, luego cambié el idioma a "English (US)" (porque ya tengo el paquete fuera de línea) y lanzó RecognizerIntent, funcionó.

Teclas: configuración de idioma == Paquete de reconocimiento de voz sin conexión


Google silenciosamente habilitó el reconocimiento fuera de línea en esa actualización de búsqueda, pero todavía no hay API ni parámetros adicionales disponibles dentro de la clase SpeechRecognizer . {Ver Editar en la parte inferior de esta publicación} La funcionalidad está disponible sin codificación adicional, sin embargo, el dispositivo del usuario deberá configurarse correctamente para que comience a funcionar y aquí es donde reside el problema y me imagino por qué muchos desarrolladores asumir que están ''perdiendo algo''.

Además, Google ha restringido ciertos dispositivos Jelly Bean de utilizar el reconocimiento fuera de línea debido a restricciones de hardware. A qué dispositivos se aplica esto no está documentado, de hecho, nada está documentado, por lo que la configuración de las capacidades para el usuario ha demostrado ser una cuestión de prueba y error (para ellos). Funciona para algunos directamente - Para aquellos que no, esta es la ''guía'' que les proporciono.

  1. Asegúrese de que el reconocedor de voz predeterminado de Android esté configurado en Google, no en Samsung / Vlingo
  2. Desinstale los archivos de reconocimiento sin conexión que ya tiene instalados desde la Configuración de búsqueda por voz de Google
  3. Vaya a la Configuración de la aplicación de Android y vea si puede desinstalar las actualizaciones de las aplicaciones Búsqueda de Google y Búsqueda de Google.
  4. Si no puede hacer lo anterior, vaya a Play Store para ver si tiene la opción allí.
  5. Reiniciar (si alcanzó 2, 3 o 4)
  6. Actualice Google Search y Google Voice Search desde Play Store (si logró 3 o 4 o si hay una actualización disponible de todos modos).
  7. Reiniciar (si has logrado 6)
  8. Instalar archivos de idioma fuera de línea de English UK
  9. Reiniciar
  10. ¡Utiliza todo utter! con una conexión
  11. Cambia al modo avión y pruébalo
  12. Una vez que esté funcionando, el reconocimiento fuera de línea de otros idiomas, como el inglés de EE. UU., También debería comenzar a funcionar.

EDITAR: Cambiar temporalmente la configuración regional del dispositivo a inglés. El Reino Unido también parece impulsar esto para que funcione.

Algunos usuarios informaron que aún tenían que reiniciar varias veces antes de que comenzara a funcionar, pero todos llegaron eventualmente, a menudo de forma inexplicable a lo que fue el desencadenante, cuya clave está dentro de la Búsqueda de Google APK , por lo que no está en el dominio público o parte de AOSP .

Según lo que puedo establecer, Google prueba la disponibilidad de una conexión antes de decidir si usa el reconocimiento fuera de línea o en línea. Si una conexión está disponible inicialmente pero se pierde antes de la respuesta, Google proporcionará un error de conexión, no se volverá a desconectar. Como nota al margen, si se ha realizado una solicitud de voz sintetizada en la red, no se proporciona ningún error si falla: se silencia.

La actualización de Búsqueda de Google no habilitó funciones adicionales en Google Now y, de hecho, si intenta usarla sin conexión a Internet, se producirá un error. Menciono esto ya que me preguntaba si la capacidad se retiraría tan silenciosamente como parecía y, por lo tanto, no debería confiarse en su producción.

Si tiene la intención de comenzar a usar la clase SpeechRecognizer, tenga cuidado, hay un error muy importante asociado, que requiere su propia implementación.

No poder solicitar específicamente sin conexión = verdadero hace que el control de esta característica sea imposible sin manipular la conexión de datos. Basura. Obtendrá cientos de correos electrónicos de usuarios preguntándole por qué no ha habilitado algo tan simple.

EDITAR: Desde el nivel 23 de la API, se ha agregado un nuevo parámetro EXTRA_PREFER_OFFLINE que parece adherirse el servicio de reconocimiento de Google.

Espero que lo anterior ayude.


Implementé con éxito mi Speech-Service con capacidades fuera de línea utilizando onPartialResults cuando estoy fuera de línea y onResults cuando estoy en línea.


Me gustaría mejorar la guía que la respuesta https://.com/a/17674655/2987828 envía a sus usuarios, con imágenes. Es la frase "Para aquellos que no, esta es la ''guía'' que les proporciono". que quiero mejorar

El usuario debe hacer clic en los cuatro botones resaltados en azul en estas imágenes:

Entonces el usuario puede seleccionar los idiomas deseados. Cuando finaliza la descarga, debe desconectarse de la red y luego hacer clic en el botón "micrófono" del teclado.

Funcionó para mí (Android 4.1.2), luego el reconocimiento de idiomas funcionó de la caja, sin reiniciar. ¡Ahora puedo dictar instrucciones al shell de Terminal Emulator! Y es dos veces más rápido sin conexión que en línea, en un padfone 2 de ASUS.

Estas imágenes están licenciadas bajo cc by-sa 3.0 con atribución requerida para .com/a/21329845/2987828; por lo tanto, puede agregar estas imágenes en cualquier lugar junto con esta atribución.

(Esta es la política estándar de todas las imágenes y textos en .com)