Search code examples
androidtext-to-speech

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


Solution

  • 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 .