Obtener locales disponibles para tts

Estoy trabajando en una implementación de texto a voz de un programa de flashcard. Debe leerse el texto en diferentes idiomas. Para hacer esto correctamente el usuario tiene que seleccionar el idioma del texto para leer (se almacenará y utilizará más tarde sin duda).

¿Existe alguna posibilidad de obtener los tts-languages disponibles en un sistema android? Si no, ¿existe la posibilidad de obtener todas las localidades disponibles en el sistema?

¡gracias por su consejo!

Editar: Supongo que lo tengo: getAvailableLocales() y tts.isLocaleAvailable(locale)

Puede encontrar toda la configuración local del dispositivo utilizando la siguiente función.

 Locale loc = new Locale("en"); Log.i("-------------",Arrays.toString(loc.getAvailableLocales())); 

Salida

 I/-------------( 4390): [ar, ar_EG, bg, bg_BG, ca, ca_ES, cs, cs_CZ, da, da_DK, de, de_AT, de_BE, de_CH, de_DE, de_LI, de_LU, el, el_CY, el_GR, en, en _AU, en_BE, en_BW, en_BZ, en_CA, en_GB, en_HK, en_IE, en_IN, en_JM, en_MH, en_MT, en_NA, en_NZ, en_PH, en_PK, en_RH, en_SG, en_TT, en_US, en_US_POSIX, en_VI, en_ZA, en_ZW, es, es_AR, es_BO, es_CL, es_CO, es_CR, es_DO, es_EC, es_ES, es_GT, es_HN, es_MX, es_NI, es_PA, es_PE, es_PR, es_PY, es_SV, es_US , es_UY, es_VE, et, et_EE, eu, eu_ES, fa, fa_IR, fi, fi_FI, fr, fr_BE, fr_CA, fr_CH, fr_FR, fr_LU, fr_MC, gl, gl_ES, hr, hr_HR, hu, hu_HU, in, in_ID, is, is_IS, it, it_CH, it_IT, iw, iw_IL, ja, ja_JP, kk, kk_KZ, ko, ko_KR, lt, lt_LT, lv, lv_LV, mk, mk_MK, ms, ms_BN, ms_MY, nl, nl_BE, nl_NL, no, no_N O, no_NO_NY, pl, pl_PL, pt, pt_BR, pt_PT, ro, ro_RO, ru, ru_RU, ru_UA, sh, sh_BA, sh_CS, sh_YU, sk, sk_SK, sl, sl_SI, sq, sq_AL, sr, sr_BA, sr_ME, sr_ RS, sv, sv_FI, sv_SE, th, th_TH, tr, tr_TR, uk, uk_UA, vi, vi_VN, zh, zh_CN, zh_HK, zh_HANS_SG, zh_HANT_MO, zh_MO, zh_TW] 

Alguien más ha hecho el trabajo duro, en http://kaviddiss.com/2012/08/12/android-text-to-speech-languages/

Para ahorrar tiempo, he aquí su extracto de código

 TextToSpeech tts = ... // let's assume tts is already inited at this point: Locale[] locales = Locale.getAvailableLocales(); List<Locale> localeList = new ArrayList<Locale>(); for (Locale locale : locales) { int res = tts.isLanguageAvailable(locale); if (res == TextToSpeech.LANG_COUNTRY_AVAILABLE) { localeList.add(locale); } } // at this point the localeList object will contain // all available languages for Text to Speech 

Los resultados dependen del motor TTS que se haya seleccionado. Por ejemplo, uno de mis teléfonos incluye los motores Pico-TTS y Google-texto-a-voz.

Q-Smart (Teléfono vietnamita con Google TTS como motor seleccionado)

 D/SpeakRepeatedly( 3979): Engine Google Text-to-speech Engine:com.google.android.tts D/SpeakRepeatedly( 3979): Engine Pico TTS:com.svox.pico D/SpeakRepeatedly( 3979): German (Germany):German:de_DE D/SpeakRepeatedly( 3979): English (United Kingdom):English:en_GB D/SpeakRepeatedly( 3979): English (United States):English:en_US D/SpeakRepeatedly( 3979): English (United States,Computer):English:en_US_POSIX D/SpeakRepeatedly( 3979): Spanish (Spain):Spanish:es_ES D/SpeakRepeatedly( 3979): French (France):French:fr_FR D/SpeakRepeatedly( 3979): Italian (Italy):Italian:it_IT D/SpeakRepeatedly( 3979): Portuguese (Brazil):Portuguese:pt_BR D/SpeakRepeatedly( 3979): Portuguese (Portugal):Portuguese:pt_PT 

Y con Pico seleccionado

 D/SpeakRepeatedly( 4837): Engine Google Text-to-speech Engine:com.google.android.tts D/SpeakRepeatedly( 4837): Engine Pico TTS:com.svox.pico D/SpeakRepeatedly( 4837): German (Germany):German:de_DE D/SpeakRepeatedly( 4837): English (United Kingdom):English:en_GB D/SpeakRepeatedly( 4837): English (United States):English:en_US D/SpeakRepeatedly( 4837): English (United States,Computer):English:en_US_POSIX D/SpeakRepeatedly( 4837): Spanish (Spain):Spanish:es_ES D/SpeakRepeatedly( 4837): French (France):French:fr_FR D/SpeakRepeatedly( 4837): Italian (Italy):Italian:it_IT 

Nota: El portugués no aparece en la interfaz de usuario de configuración de TTS. Cuando elijo portugués programaticamente en mi aplicación que habla con un acento portugués! FWIW aquí está mi código para seleccionar el portugués (acepta tanto locales brasileños como portugueses).

 if (locale.getDisplayName().startsWith("Portuguese")) { Log.i(SPEAK_REPEATEDLY, "Setting Locale to: " + locale.toString()); tts.setLanguage(locale); } } 

Dado que diferentes motores TTS devuelven resultados diferentes para isLanguageAvailable , he descubierto que la siguiente solución funciona mejor en varios motores TTS comunes.

Tenga en cuenta también que a partir de Android Lollipop, hay un método simple en TextToSpeech llamado getAvailableLanguages que hace que fácilmente para usted (si el dispositivo está ejecutando API 21 o posterior).

Es necesario llamar a los métodos siguientes en el método onInit de su OnInitListener asignado al objeto TextToSpeech .

 ArrayList<Locale> languages; TextToSpeech initTTS; private void initSupportedLanguagesLollipop() { Set<Locale> availableLocales = initTTS.getAvailableLanguages(); for (Locale locale : availableLocales) { languages.add(locale); } } private void initSupportedLanguagesLegacy() { Locale[] allLocales = Locale.getAvailableLocales(); for (Locale locale : allLocales) { try { int res = initTTS.isLanguageAvailable(locale); boolean hasVariant = (null != locale.getVariant() && locale.getVariant().length() > 0); boolean hasCountry = (null != locale.getCountry() && locale.getCountry().length() > 0); boolean isLocaleSupported = false == hasVariant && false == hasCountry && res == TextToSpeech.LANG_AVAILABLE || false == hasVariant && true == hasCountry && res == TextToSpeech.LANG_COUNTRY_AVAILABLE || res == TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE; Log.d(TAG, "TextToSpeech Engine isLanguageAvailable " + locale + " (supported=" + isLocaleSupported + ",res=" + res + ", country=" + locale.getCountry() + ", variant=" + locale.getVariant() + ")"); if (true == isLocaleSupported) { languages.add(locale); } } catch (Exception ex) { Log.e(TAG, "Error checking if language is available for TTS (locale=" + locale +"): " + ex.getClass().getSimpleName() + "-" + ex.getMessage()); } } } 
  • Android: escucha un comando de voz (todo el tiempo)
  • ¿Por qué la intención de ACTION_CHECK_TTS_DATA es "incómoda de usar"?
  • Usar texto a voz en una llamada de voz
  • Android TextToSpeech: obtener la longitud de tiempo de audio
  • Android texto a voz es muy lento para inicializar
  • Cómo crear un motor de texto a voz personalizado
  • ¿Cómo puedo guardar el archivo Text to Speech como formato .wav / .mp3 en idioma árabe en External Storage?
  • ¿Cómo saber si un motor TTS específico está activado?
  • ¿Cómo interpretar audiblemente la pronunciación IPA en Android?
  • Ampliación del paquete de idiomas de texto a voz (TTS) de Android
  • La salida TTS siempre va a A2DP
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.