1

I am using Google TTS Engine for Text-to-speech for Hindi Language.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case ACTIVITY_TTS_PASS:
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            tts = new TextToSpeech(getApplicationContext(), this);
            int availability = tts.isLanguageAvailable(new Locale("hin-IND"));
            switch(availability) {
            case TextToSpeech.LANG_AVAILABLE:
                Log.d("TTS", "Language available");
                break;
            case TextToSpeech.LANG_NOT_SUPPORTED:
                Log.d("TTS", "Language not supported");

                Intent installTTSIntent = new Intent();
                installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                ArrayList<String> languages = new ArrayList<String>();
                languages.add("hin-IND"); // hin - hindi, IND - INDIA
                installTTSIntent.putStringArrayListExtra(
                        TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
                startActivity(installTTSIntent);
                break;
            case TextToSpeech.LANG_MISSING_DATA:
                Log.d("TTS", "Language missing data");
                break;
            case TextToSpeech.LANG_COUNTRY_AVAILABLE:
                Log.d("TTS", "Contry available");
                break;
            default:
                Log.d("TTS", "default");
            }
        }
        else {
            Log.d("TTS", "fail");
            Intent installTTSIntent = new Intent();
            installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            ArrayList<String> languages = new ArrayList<String>();
            languages.add("hin-IND"); // hin - hindi, IND - INDIA
            installTTSIntent.putStringArrayListExtra(
                    TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
            startActivity(installTTSIntent);
        }

        break;
    default:
        Log.d("TTS", "case default");
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);

}

This is how i can check whether TTS data is installed and Hindi language is supported or not. This Intent gives option to install voice data for some languages. Then i selected Hindi (India) and installed.

Even after that tts.isLanguageAvailable(new Locale("hin-IND")); returns TextToSpeech.LANG_NOT_SUPPORTED.

Also tried with "hi-IN" instead "hin-IND", it gives the same result. Now voice data is installed but how can i check it by code ?

Gaurav
  • 1,965
  • 2
  • 16
  • 32

1 Answers1

0

"hi_IN" is the locale for Hindi(India). Checking for the availability tts.isLanguageAvailable(new Locale("hi-IN")) works fine after onInit(int result) methode called. So initiate the tts instance in onActivityResult methode and check for availability in onInit methode.

UPDATE 2017 Posing code to use TTS on request.

To check if tts data exists:

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

OnActivityResult method will be called

protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            initTTS();
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            ArrayList<String> languages = new ArrayList<String>();
            languages.add("hin-IND"); // hin - hindi, IND - INDIA
            installIntent.putStringArrayListExtra(
                    TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
            startActivity(installIntent);
        }
    }
}

initTTS method is as follows:

private TextToSpeech mTts;
public void initTTS() {
    //mTts = new TextToSpeech(this, this);
    mTts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if(status != TextToSpeech.ERROR) {

                int isLanguageAvailable = t1.isLanguageAvailable(new Locale("hi_IN"));
                switch (isLanguageAvailable) {
                    case TextToSpeech.LANG_AVAILABLE:
                        //t1.setLanguage(Locale.UK);
                        t1.setLanguage(new Locale("hin"));
                        t1.setPitch(1.2f);
                        t1.setSpeechRate(0.8f);
                        Toast.makeText(context, "हाँ, मैं हिंदी बोल सकता हूँ", Toast.LENGTH_LONG).show();
                        t1.speak("हाँ, मैं हिंदी बोल सकता हूँ", TextToSpeech.QUEUE_FLUSH, null,null);

                        break;
                }
            } else {
                Toast.makeText(context, "TTS initialization Failed", Toast.LENGTH_LONG).show();
            }
        }
    });
}
Gaurav
  • 1,965
  • 2
  • 16
  • 32
  • can you post your code because i need check where user device support hindi or not – Hamza Aug 18 '17 at 01:23
  • 1
    for what `ACTION_CHECK_TTS_DATA` is used here? you didn't set any extras to the intent, how does it know which language to check? – user924 Jan 11 '18 at 12:39
  • @user924 This Action is to check for the presence of the TTS resources. (Ref: https://developer.android.com/reference/android/speech/tts/TextToSpeech.Engine.html#ACTION_CHECK_TTS_DATA ). Once you get the success result, you can check for specific languages by creating TTS instance. You can explore details about it here https://android-developers.googleblog.com/2009/09/introduction-to-text-to-speech-in.html – Gaurav Jan 16 '18 at 10:52
  • `Language_AVAILABLE` doesn't mean that the voice data is installed for that language. – Shivam Pokhriyal Nov 24 '20 at 10:52
  • For future references. Downvoting since it doesn't answer the question. Also, `isLanguageAvailable` API though mentions that it can return `LANG_MISSING_DATA` but it never does. So afaik, there isn't any text to speech API available to see if the voice data is installed for a particular language. There's one way though https://stackoverflow.com/a/54317988/6671572 as suggested by this answer but it only works in API 21 + – Shivam Pokhriyal Nov 24 '20 at 10:56