web-dev-qa-db-ja.com

テキスト読み上げ(TTS)に使用できるロケールを取得する

私はフラッシュカードプログラムのテキスト読み上げの実装に取り​​組んでいます。異なる言語のテキストを読む必要があります。これを適切に行うために、ユーザーは読むテキストの言語を選択する必要があります(保存され、後で問題なく使用されます)。

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


私はそれを得たと思います:getAvailableLocales()tts.isLocaleAvailable(locale)

17
nob

次の機能を使用して、デバイスで使用可能なすべてのTTSロケールを検索します。

Locale.getAvailableLocales()

出力: Arrays.toString(Locale.getAvailableLocales())

[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]
12
Chirag

他の誰かが大変な仕事をしました 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エンジンの両方が含まれています。

Q-Smart(選択されたエンジンとして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

そしてピコを選んだ

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

注:ポルトガル語はTTS設定UIに表示されません。アプリでプログラムでポルトガル語を選択すると、ポルトガル語のアクセントで話します。 FWIWは、ポルトガル語を選択するための私のコードです(ブラジルとポルトガルの両方のロケールを受け入れます)。

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

異なるTTSエンジンはisLanguageAvailableに対して異なる結果を返すため、次のソリューションがいくつかの一般的なTTSエンジンで最適に機能することがわかりました。

Android Lollipopから始めて、TextToSpeechには getAvailableLanguages という簡単なメソッドがあります。これは簡単に実行できます。 (デバイスがAPI 21以降を実行している場合)。

onInitオブジェクトに割り当てられたOnInitListenerTextToSpeechメソッドで次のメソッドを呼び出す必要があります。

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());
        }
    }
}
14
Muzikant

Android 5.0(APIレベル21)から、TTSエンジンでサポートされているすべてのロケールのセットをフェッチするためにTextToSpeech.getAvailableLanguagesが追加されました。

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

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

2