Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Text to Speech is not working in API level 30 other than English language

I implemented the text to speech in language "Hindi" Its an Indian language my application which is working fine till the API level 29. Its working fine for English but not for the Hindi. But in new devices which are of API level 30, it's not working. in debugging its giving result value -2 "language no supported error" in API level 30 devices.

private void setTextTospeech() {
    textToSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
                if (language.toLowerCase().contains(langaugeCodeEnglish)) {
                    int result = textToSpeech.setLanguage(new Locale("en", "IN"));
                    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        //Toast.makeText(mContext, result + " is not supported", Toast.LENGTH_SHORT).show();
                        Log.e("Text2SpeechWidget", result + " is not supported");
                    }
                } else {
                    int result = textToSpeech.setLanguage(new Locale("hi", "IN"));
                    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            textToSpeech.setLanguage(Locale.forLanguageTag("hin"));
                        } else {
                            //  Toast.makeText(mContext, result + "Language is not supported", Toast.LENGTH_SHORT).show();
                            Log.e("Text2SpeechWidget", result + "Language is not supported");
                        }
                        Log.e("Text2SpeechWidget", result + " is not supported");
                    }
                }
            }
        }
    });
}


private void speak(String s, String text) {
        try{
            float pitch = (float) 0.62;
            float speed = (float) 0.86;
            textToSpeech.setSpeechRate(speed);
            textToSpeech.setPitch(pitch);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Bundle bundle = new Bundle();
                bundle.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC);
                textToSpeech.speak(s, TextToSpeech.QUEUE_FLUSH, bundle, null);
                textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, bundle, null);
            } else {
                HashMap<String, String> param = new HashMap<>();
                param.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
                textToSpeech.speak(s, TextToSpeech.QUEUE_FLUSH, param);
                textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, param);
            }
        }catch (Exception ae){
            ae.printStackTrace();
        }
    }

As per new docs. I also add a queries tag inside manifest tag.

<queries>
   ...
  <intent>
      <action android:name="android.intent.action.TTS_SERVICE" />
  </intent>
 </queries>
like image 880
Ankur Shinde Avatar asked Sep 19 '20 09:09

Ankur Shinde


2 Answers

Add the following permission in the manifest file;

uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"

like image 80
Mustafa Balin Avatar answered Oct 06 '22 17:10

Mustafa Balin


Thank you Mustafa Balin

android studio made me change it a bit though.

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />
like image 1
John Shiveley Avatar answered Oct 06 '22 18:10

John Shiveley