2011-02-02 15 views
14

Estoy trabajando en una implementación de texto a voz de un programa de tarjeta de memoria. El texto en diferentes idiomas debe leerse. Para hacer esto correctamente, el usuario debe seleccionar el idioma del texto a leer (se almacenará y usará más tarde sin preguntar).Obtener configuraciones regionales disponibles para texto a voz (TTS)

¿Existe la posibilidad de obtener los idiomas TTS disponibles en un sistema Android? De lo contrario, ¿existe la posibilidad de obtener todas las configuraciones regionales disponibles en el sistema?


supongo, lo tengo: getAvailableLocales() y tts.isLocaleAvailable(locale)

Respuesta

12

Usted puede encontrar toda Locale disponible del dispositivo utilizando la función siguiente.

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] 
+11

De acuerdo con la documentación http://developer.android.com/reference/java/util/Locale.html#getAvailableLocales%28%29 getAvailableLocales() es estático, por lo que no es necesario crear un objeto de configuración regional. El uso de "Locale.getAvailableLocales()" es la forma adecuada de usar este método. – JonnyBoy

+0

me ayuda de alguna otra manera. Gracias. –

+4

¿Son compatibles con las tts todas las configuraciones regionales disponibles? –

13

otra persona ha hecho el trabajo duro, en http://kaviddiss.com/2012/08/12/android-text-to-speech-languages/

Para ahorrar tiempo, aquí está el 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 en que se ha seleccionado el motor TTS. Por ejemplo, uno de mis teléfonos incluye los motores Pico-TTS y Google-text-to-speech.

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: portugués no aparece en la interfaz de usuario Configuración TTS. Cuando selecciono el programa de portugués en mi aplicación, ¡habla con acento portugués! FWIW aquí está mi código para seleccionar portugués (acepta lugares locales brasileños y portugueses).

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

Nota: esto no funcionará para todos los dispositivos y todos los motores TTS ya que no coincide con ['LANG_COUNTRY_VAR_AVAILABLE'] (http://developer.android.com/reference/android/speech/tts/ TextToSpeech.html # LANG_COUNTRY_AVAILABLE). Deberías usar 'res> = TextToSpeech.LANG_COUNTRY_AVAILABLE' –

8

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

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

Debe llamar a los siguientes métodos 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()); 
     } 
    } 
} 
0

A partir de Android 5.0 (nivel API 21), TextToSpeech.getAvailableLanguages se ha agregado a buscar un conjunto de todos los entornos locales soportados por el motor TTS.

TextToSpeech tts;    // assume this is initialized 
tts.getAvailableLanguages(); // returns a set of available locales 

I también han notado que el conjunto de locales devuelto por TextToSpeech.getAvailableLanguages podría no ser un subconjunto estricto de Locale.getAvailableLocales, es decir, puede que una configuración regional apoyado por el motor TTS que no está soportado por el sistema.

Cuestiones relacionadas