2011-02-02 5 views
14

私はフラッシュカードプログラムのテキスト読み上げの実装に取り​​組んでいます。さまざまな言語のテキストを読み上げる必要があります。これを適切に行うために、ユーザは、読み上げるテキストの言語を選択しなければならない(質問なく保存して使用する)。スピーチテキスト(TTS)の使用可能なロケールを入手する

Androidシステムで利用可能なTTS言語を取得する可能性はありますか?そうでない場合は、システム上のすべてのロケールを取得する可能性はありますか?


は私が推測する、私はそれを得た:getAvailableLocales()tts.isLocaleAvailable(locale)

答えて

12

次の機能を使用して、デバイスのすべての利用可能なロケールを見つけることができます。

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

結果が依存出力

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 getAvailableLocales()は静的なので、Localeオブジェクトを作成する必要はありません。このメソッドを使用するには、 "Locale.getAvailableLocales()"を使用するのが適切な方法です。 – JonnyBoy

+0

それは他の方法で私を助けます。ありがとう。 –

+4

利用可能なロケールはすべてttsでサポートされていますか? –

13

他の誰かがあなたの時間を節約するためにhttp://kaviddiss.com/2012/08/12/android-text-to-speech-languages/

で、ハードワークを行っている、ここではそのコードのエキスだ

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 

TTSエンジンが選択されています。たとえば、私の電話機の1つに、Pico-TTSエンジンとGoogle-text-to-speechエンジンの両方が含まれています。 ポルトガルはTTS設定UIに表示されていない:Q-スマート(選択したエンジンとしてGoogleのTTSとベトナムの電話)

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 

とPicoと

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 

注意を選択しました。私がプログラムでポルトガル語を選択すると、ポルトガル語のアクセントがついています! FWIWは、ポルトガル語を選択するためのコードです(ブラジルとポルトガル語の両方のロケールを使用できます)。

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

注:これは[LANG_COUNTRY_VAR_AVAILABLE'](http://developer.android.com/reference/android/speech/tts/)と一致しないため、すべてのデバイスとすべてのTTSエンジンで動作するわけではありません。 TextToSpeech.html#LANG_COUNTRY_AVAILABLE)。 'res> = TextToSpeech.LANG_COUNTRY_AVAILABLE'を使うべきです –

8

異なるTTSエンジンはisLanguageAvailableに異なる結果を返すので、私は次の解決策は、いくつかの一般的なTTSエンジンで最適に動作していることが分かりました。

TextToSpeechにはAndroid Lollipopから簡単な方法があります(デバイスがAPI 21以降を実行している場合)getAvailableLanguagesという簡単な方法があります。

TextToSpeechオブジェクトに割り当てられたOnInitListeneronInitメソッドで、次のメソッドを呼び出す必要があります。アンドロイド5.0(APIレベル21)から出発

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エンジンによってサポートされるすべてのロケールのセットを取得するために追加されています。

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

IはまたすなわちロケールがシステムによってサポートされていないTTSエンジンであっサポートかもしれない、TextToSpeech.getAvailableLanguagesによって返されるロケールのセットはLocale.getAvailableLocalesの厳密なサブセットではないかもしれないことに気づきました。

関連する問題