2011-02-02 11 views
14

Bir flashcard programının metin okuma uygulaması üzerinde çalışıyorum. Farklı dillerde metinler okunmalıdır. Bunu düzgün bir şekilde yapabilmek için, kullanıcı okunacak metnin dilini seçmelidir (daha sonra sorgulanmadan saklanacak ve kullanılacaktır).Dili konuşma için mevcut yerel ayarları alın (TTS)

Android sisteminde mevcut TTS dillerini edinme olanağı var mı? Değilse, sistem üzerinde tüm kullanılabilir lokalleri alma olasılığı var mı?


sanırım, ben hallederim: getAvailableLocales() ve tts.isLocaleAvailable(locale)

cevap

12

Aşağıdaki işlevi kullanarak cihazın tüm mevcut Locale bulabilirsiniz.

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

Çıktı

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

http://developer.android.com/reference/java/util/Locale.html#getAvailableLocales%28%29 belgesine göre getAvailableLocales() statiktir, bu nedenle Locale nesnesi oluşturmanıza gerek yoktur. Bu yöntemi kullanmak için "Locale.getAvailableLocales()" kullanılması uygun yoldur. – JonnyBoy

+0

başka yollarla bana yardımcı oluyor. Teşekkürler. –

+4

Mevcut tüm yerel ayarlar tts tarafından destekleniyor mu? –

13

başkası, size zaman kazandırmak için http://kaviddiss.com/2012/08/12/android-text-to-speech-languages/

de, sıkı çalışma yaptık burada

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 

sonuç bağımlı onların kod özü var olan Hangi TTS motoru seçildi. Örneğin, telefonumdan biri hem Pico-TTS hem de Google-text-to-speech motorlarını içeriyor. Portekiz TTS Ayarları arayüzünde listede yok: Q-Smart (seçilen motor olarak Google TTS ile Vietnam Telefon)

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 

Ve Pico ile

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 

Not seçildi. Uygulamamda Portekizce'yi programlı olarak seçtiğimde, Portekizce aksanıyla konuşuyor! FWIW işte Portekizim'i seçmek için kodum (hem Brezilya hem de Portekiz yerellerini kabul ediyor). Farklı TTS motorları isLanguageAvailable için farklı sonuçlar döndürür yana

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

Not: Bu, tüm aygıtlar ve tüm TTS motorları için eşleşmediğinden çalışmayacaktır ['LANG_COUNTRY_VAR_AVAILABLE'] (http://developer.android.com/reference/android/speech/tts/ TextToSpeech.html # LANG_COUNTRY_AVAILABLE). 'Res> = TextToSpeech.LANG_COUNTRY_AVAILABLE' kullanmalısınız –

8

, aşağıdaki çözüm birkaç yaygın TTS motorlarında iyi çalıştığını gördük.

Ayrıca, Android Lollipop ile başlayarak, getAvailableLanguages olarak adlandırılan ve TextToSpeech olarak adlandırılan basit bir yöntem vardır, bu sizin için bunu kolayca yapar (aygıt API 21 veya sonraki sürümünü çalıştırıyorsa).

Sen TextToSpeech nesneye atanan senin OnInitListener arasında onInit yönteminde aşağıdaki yöntemleri çağırmak gerekir. Android 5.0 (API seviyesi 21) başlanarak

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

, TextToSpeech.getAvailableLanguages TTS motoru tarafından desteklenen tüm yerel bir dizi almak için eklenmiştir.

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

Ben de TextToSpeech.getAvailableLanguages tarafından döndürülen yerel ayarlar seti, Locale.getAvailableLocales sıkı bir alt kümesi olmayabilir fark etmiş yani orada olabilir sistem tarafından desteklenmemektedir TTS motoru tarafından desteklenen bir yerel ayar.

İlgili konular