Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add Text to speech for Hindi language?

My app consists of two strings and two buttons, one English string and Hindi string, when i click on English speak button, the English string is pronouncing, when i come to Hindi string it is not responding to given word as it was mentioned.

Here is my MainActivity look likes,

public class MainActivity extends AppCompatActivity {

private TextView englishString, hindiString;
private Button englishButton, hindiButton;
private TextToSpeech textToSpeech;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    englishString = (TextView) findViewById(R.id.englishString);
    hindiString = (TextView) findViewById(R.id.hindiString);

    englishButton = (Button) findViewById(R.id.englishButton);
    hindiButton = (Button) findViewById(R.id.hindiButton);

    englishButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            loadSpeakingLanguages(englishString.getText().toString());
        }
    });

    hindiButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            loadSpeakingLanguages(hindiString.getText().toString());
        }
    });
}


private void loadSpeakingLanguages(String textToTranslate) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ttsGreater21(textToTranslate);
    } else {
        ttsUnder20(textToTranslate);
    }
}

@SuppressWarnings("deprecation")
private void ttsUnder20(String text) {
    HashMap<String, String> map = new HashMap<>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String text) {
    String utteranceId = this.hashCode() + "";
    textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}


@Override
protected void onResume() {
    textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR) {
                textToSpeech.setLanguage(Locale.ENGLISH);
            }
        }
    });
    super.onResume();
}

public void onPause() {
    if (textToSpeech != null) {
        textToSpeech.stop();
        textToSpeech.shutdown();
        textToSpeech = null;
    }
    super.onPause();
}}

Here is my activity_main looks like,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ravi.texttospeech.MainActivity">

<TextView
    android:id="@+id/englishString"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    android:textSize="25dp" />

<TextView
    android:id="@+id/hindiString"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/englishString"
    android:text="नमस्ते दुनिया"
    android:textSize="25dp" />

<Button
    android:id="@+id/englishButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/hindiString"
    android:text="Speak English Text" />

<Button
    android:id="@+id/hindiButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/englishButton"
    android:text="Speak Hindi Text" />

And here is how my app look like

like image 400
Sairavi Kumar Avatar asked Dec 31 '25 21:12

Sairavi Kumar


2 Answers

I have done some modifications in your code.

 hindiButton.setOnClickListener(new View.OnClickListener() {
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onClick(View view) {
            loadSpeakingLanguages(hindiString.getText().toString());
            textToSpeech.setLanguage(Locale.forLanguageTag("hin"));
        }
    });

its working fine for me.

You need to use ISO 639 3-letter word or ISO 639 2-letter word

check out the ISO country names and there corresponding codes in this link

Note: This method works only above lollipop and next versions .

like image 63
Karthik Avatar answered Jan 02 '26 09:01

Karthik


setLanguage(new Locale("hi","IN"))
like image 24
yashpal singh Avatar answered Jan 02 '26 10:01

yashpal singh