1

Unable to set hindi as speech language of texttospeech even though My mobile tts engine fully supports hindi textospeech

        if(t1.isLanguageAvailable(new Locale("hi_IN"))==TextToSpeech.LANG_AVAILABLE)
            t1.setLanguage(new Locale ("hi_IN"));
        else
            Toast.makeText(getApplicationContext(), "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
Cœur
  • 37,241
  • 25
  • 195
  • 267
Narender Reddy
  • 463
  • 6
  • 18

4 Answers4

0

Firstly, as a test, set your text to speech engine to Hindi in the Android Text to Speech Settings. Without having to apply any changes to your code, it should successfully speak in Hindi. If it doesn't, check the log output to see if there is a problem.

Next, your code is reliant on isLanguageAvailable() returning TextToSpeech.LANG_AVAILABLE, if it doesn't you will not attempt to set the Locale. There are many other possible responses. Check the log output of the two case switch statements below.

    final Locale loc = new Locale("hin", "IND");

    // switch(tts.isLanguageAvailable(loc)){
    switch(tts.setLanguage(loc)){

        case TextToSpeech.LANG_AVAILABLE:
            Log.i("TAG", "LANG_AVAILABLE");
            break;
        case TextToSpeech.LANG_COUNTRY_AVAILABLE:
            Log.i("TAG", "LANG_COUNTRY_AVAILABLE");
            break;
        case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
            Log.i("TAG", "LANG_COUNTRY_VAR_AVAILABLE");
            break;
        case TextToSpeech.LANG_MISSING_DATA:
            Log.i("TAG", "LANG_MISSING_DATA");
            break;
        case TextToSpeech.LANG_NOT_SUPPORTED:
            Log.i("TAG", "LANG_NOT_SUPPORTED");
            break;
    }

Please be aware, the responses to isLanguageAvailable() are notoriously unreliable. See my edit on the answer here as to why.

Finally, make sure you are setting the language of the TTS object after onInit() has returned SUCCESS

Community
  • 1
  • 1
brandall
  • 6,094
  • 4
  • 49
  • 103
0

Try:

t1.setLanguage( new Locale( "hin", "IND", "variant" ) );

I hope it will work if it was not till now.

wscourge
  • 10,657
  • 14
  • 59
  • 80
0

try this..

t1.setLanguage(new Locale ("hi","IN"));

instead of

t1.setLanguage(new Locale ("hi_IN"));

I hope it will work.

P.K.
  • 1,746
  • 6
  • 25
  • 62
Amit Patel
  • 221
  • 2
  • 5
0

After creating an object of TextToSpeech class, you need to configure it (or check it's available state/values) into TextToSpeech.OnInitListener's onInit() callback. You will get reliable information there about your TextToSpeech object.

private fun initTextToSpeech(){
    tts = TextToSpeech(this,this) // TextToSpeech(context,listener)
}

override fun onInit(status: Int) {
    Log.e(TAG, "onInit: status: $status")
    if(status!=TextToSpeech.SUCCESS)return

    val locale = Locale("hi","IN")

    val isLangCountryAvailable = tts.isLanguageAvailable(locale)
    Log.e(TAG, "onInit: isLangCountryAvailable: $isLangCountryAvailable")

    if(isLangCountryAvailable==TextToSpeech.LANG_COUNTRY_AVAILABLE) {
        val setLanguageResult = tts.setLanguage(locale)
        Log.e(TAG, "onInit: setLanguageResult: $setLanguageResult")
    }

    Log.e(TAG, "onInit: availableLanguages: ${tts.availableLanguages}")
    Log.e(TAG, "onInit: voice: ${tts.voice}")

    binding.btnSpeak.isEnabled = status==TextToSpeech.SUCCESS
}

Logs I got for above onInit callback:

MainActivity: onInit: status: 0
MainActivity: onInit: isLangCountryAvailable: 1
MainActivity: onInit: setLanguageResult: 1
MainActivity: onInit: availableLanguages: [ko_KR, mr_IN, ru_RU, zh_TW, hu_HU, 
th_TH, ur_PK, nb_NO, da_DK, tr_TR, et_EE, bs, sw, pt_PT, vi_VN, en_US, sv_SE, 
ar, su_ID, bn_BD, gu_IN, kn_IN, el_GR, hi_IN, fi_FI, km_KH, bn_IN, fr_FR, 
uk_UA, en_AU, nl_NL, fr_CA, sr, pt_BR, ml_IN, si_LK, de_DE, ku, cs_CZ, pl_PL, 
sk_SK, fil_PH, it_IT, ne_NP, hr, en_NG, zh_CN, es_ES, cy, ta_IN, ja_JP, sq, 
yue_HK, en_IN, es_US, jv_ID, la, in_ID, te_IN, ro_RO, ca, en_GB]
MainActivity: onInit: voice: Voice[Name: hi-IN-language, locale: hi_IN, 
quality: 400, latency: 200, requiresNetwork: false, features: 
[networkTimeoutMs, legacySetLanguageVoice, networkRetriesCount]]
Manishoaham
  • 601
  • 1
  • 5
  • 14