Sairavi Kumar
Sairavi Kumar

Reputation: 43

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

Upvotes: 3

Views: 7172

Answers (5)

Clean Coder
Clean Coder

Reputation: 562

Add this import:

import android.speech.tts.TextToSpeech

Implement this listener

class DetailDay : AppCompatActivity(), TextToSpeech.OnInitListener  {

Then override (paste) this method:

override fun onInit(intVar: Int) {
        if(intVar==TextToSpeech.SUCCESS){
            var local= Locale("hi","IN")
            val resultado=tts!!.setLanguage(local)
            if(resultado==TextToSpeech.LANG_MISSING_DATA){
                Log.i(TAG,"lang not found")
            }
        }
    }

Then create this variable:

 private var tts:TextToSpeech?=null

Initialize in onCreate (recommended)

tts= TextToSpeech(this,this)

To start playing, call this method:

 tts!!.speak(stringData, TextToSpeech.QUEUE_FLUSH, null);

To Stop playing,

  tts!!.stop()

Upvotes: 0

Ayushi Khandelwal
Ayushi Khandelwal

Reputation: 336

Changing the default engine to com.google.android.tts, worked for me.

Example:

new TextToSpeech(
                            context.getApplicationContext(),
                            new TextToSpeech.OnInitListener() {
                                @Override
                                public void onInit(int status) {
                                    if (status != TextToSpeech.ERROR) {
                                        if (textToSpeech != null) {
                                            textToSpeech.setLanguage(new Locale("en", "IN"));
                                            textToSpeech.setSpeechRate(1);
                                        }
                                    }
                                }
                            },
                            "com.google.android.tts");

Upvotes: 1

Rahul Samaddar
Rahul Samaddar

Reputation: 244

Try this:-

Locale locale = new Locale("hi", "IN");
            int avail = textToSpeech.isLanguageAvailable(locale);
            switch (avail) {
                case TextToSpeech.LANG_AVAILABLE:
                    textToSpeech.setLanguage(Locale.forLanguageTag("hi"));
                    isLanguageAvailable = true;
                    break;
                case TextToSpeech.LANG_COUNTRY_AVAILABLE:
                case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
                    textToSpeech.setLanguage(locale);
                    isLanguageAvailable = true;
                    break;
            }

Upvotes: 1

yashpal singh
yashpal singh

Reputation: 86

setLanguage(new Locale("hi","IN"))

Upvotes: 1

Karthik
Karthik

Reputation: 1219

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 .

Upvotes: 10

Related Questions