voz reconocimiento reconoce programar google funciona configurar conexión activar android speech-recognition

reconoce - Descargar automáticamente el lenguaje de reconocimiento de voz sin conexión en Android



reconocimiento de voz google (3)

¿Hay alguna forma en Java de detectar si un dispositivo Android tiene instalado un lenguaje de reconocimiento de voz sin conexión y si no solicita al usuario que lo descargue?

Sé que puede solicitar voz a texto para que prefiera voz fuera de línea, pero ¿cómo sabe si el dispositivo tiene el idioma instalado?

Esta pregunta no es sobre cómo usar el habla sin conexión, esto funciona. La pregunta es "cómo detectar y descargar / instalar idiomas de voz sin conexión" desde el código de la aplicación Java. es decir, haga que la aplicación detecte si tienen instalado el idioma alemán sin conexión y, si no, solicite al usuario que lo descargue / instale.


Esta no es la respuesta que está esperando, ya que en el momento de escribir esto, no creo que haya una solución directa para esto. Espero sinceramente que se demuestre lo contrario.

Solicité una mejora para proporcionar esta información programáticamente hace mucho tiempo, code.google.com/p/android/issues/detail?id=59145

La mejora sugirió un parámetro adicional RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES :

Seguramente sería trivial que esto se agregue y se use de la siguiente manera:

final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS); getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final ArrayList<String> vrStringLocales = intent.getExtras().getStringArrayList( RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); // This would be nice final ArrayList<String> vrStringOfflineLocales = intent.getExtras().getStringArrayList( RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES); } }, null, 1234, null, null);

Por desgracia, nunca ha sucedido.

Tienes otras dos opciones para tratar de manejar esto con gracia.

En el improbable caso de que la aplicación se ejecute con permisos de root, puede verificar la ubicación de /data/data/com.google.android.googlequicksearchbox/app_g3_models/ que contiene los archivos sin conexión, etiquetados muy fácilmente por su ubicación.

El segundo implica saber cuándo el usuario necesita un mensaje para instalar los archivos sin conexión que faltan.

Desde mi experiencia, el error de reconocimiento de SpeechRecognizer.ERROR_SERVER lo denota con mayor frecuencia, pero no es infalible.

@Override public void onError(final int error) { switch (error) { case SpeechRecognizer.ERROR_SERVER: // TODO - prompt to install offline files break; } }

Cuando se detecte, puede guiar al usuario a la pantalla de instalación correcta.

public static final String PACKAGE_NAME_GOOGLE_NOW = "com.google.android.googlequicksearchbox"; public static final String ACTIVITY_INSTALL_OFFLINE_FILES = "com.google.android.voicesearch.greco3.languagepack.InstallActivity"; public static boolean showInstallOfflineVoiceFiles(@NonNull final Context ctx) { final Intent intent = new Intent(); intent.setComponent(new ComponentName(PACKAGE_NAME_GOOGLE_NOW, ACTIVITY_INSTALL_OFFLINE_FILES)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); try { ctx.startActivity(intent); return true; } catch (final ActivityNotFoundException e) { } catch (final Exception e) { } return false; }

El uso de valores codificados como este, por supuesto, no es ideal, ¡pero esta situación tampoco!

Una vez que haya terminado con todo lo anterior y piense que tiene una buena solución provisional, ¡piénselo nuevamente! Independientemente de si el usuario ha instalado correctamente los archivos sin conexión que faltan, es muy probable que todavía no funcione ...

Mi respuesta aquí describe el proceso con el que todavía tengo que guiar a mis usuarios. Es muy frustrante.

Finalmente, un error más para lanzar en la mezcla - RecognitionListener.onError(int) se puede lanzar cuando no hay un error. Verifique mi esencia en la respuesta aquí para usar un BugRecognitionListener para que pueda verificar que las devoluciones de llamadas se están enviando en el orden correcto e ignorar las que no lo están. Esto sigue siendo un problema, a pesar de que mi respuesta sugiere una solución en una versión anterior.

Lo anterior debería mantenerte ocupado! Buena suerte....


Para detectar si el idioma (alemán) necesario está disponible, siga estos pasos:

  • Iterar la lista Locale y verificar si Locale está disponible para el idioma alemán.

  • Si a cambio no obtuvo ningún objeto de configuración regional, puede concluir que el idioma alemán no está disponible sin conexión. Luego puedes escribir código para descargar y hacer otras cosas.

  • Lo hice debajo de la implementación para mi proyecto. Espero que el código de abajo te ayude !!!

    private TextToSpeech t1; private void setForOtherLangAudio() { Locale[] locales = Locale.getAvailableLocales(); Locale loc = null; for (Locale locale : locales) { // Replace XXX with your German codes if (locale.getDisplayCountry().equals("XXX") && locale.getDisplayLanguage().equals("XXX")) { loc = locale ; break; } } final Locale germanLocale = loc; t1 = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status != TextToSpeech.ERROR) { t1.setLanguage(germanLocale); } } });

    }