Android Text to Speech

Hello All,

Android provides support to Text to Speech. With the help of TTS we can make device read users input. Recently I worked on it. So here is how I implemented this feature…

1) Create a new Android project in Eclipse
2) Create a layout with one EditText, two Seekbars and Three buttons.
Note:– Here we want seekbars to set TTS voice pitch & speed by varying these two values we can change TTS voice from male to female on various speeds.

you need to arrange them in  one linear layout as below

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
>
            <EditText
                       android:id="@+id/inputtext"
                       android:layout_height="wrap_content"
                       android:layout_width="fill_parent"
                       android:layout_margin="10dp"
                       android:inputType="textShortMessage"
                       android:textSize="16dp"
                       android:text="@string/input"
                       android:singleLine="true"
            />
            <Button
                       android:enabled="false"
                       android:id="@+id/again_button"
                       android:layout_height="wrap_content"
                       android:layout_width="wrap_content"
                       android:text="@string/again"
                       android:layout_gravity="center_horizontal"
            />
            <SeekBar
                       android:layout_height="wrap_content"
                       android:layout_width="fill_parent"
                       android:max="19"
                       android:layout_marginLeft="5dp"
                       android:layout_marginRight="5dp"
                       android:layout_marginTop="10dp"
                       android:id="@+id/pitchslider"
                       android:progress="9"
/>
            <Button
                       android:id="@+id/set_pitch"
                       android:layout_height="wrap_content"
                       android:layout_width="wrap_content"
                       android:text="@string/setpitch"
                       android:layout_gravity="center_horizontal"
                       android:layout_marginTop="15dp"
            />
            <SeekBar
                       android:layout_height="wrap_content"
                       android:layout_width="fill_parent"
                       android:max="19"
                       android:layout_marginLeft="5dp"
                       android:layout_marginRight="5dp"
                       android:layout_marginTop="10dp"
                       android:id="@+id/speedslider"
                       android:progress="9"
            />
            <Button
                       android:id="@+id/set_speed"
                       android:layout_height="wrap_content"
                       android:layout_width="wrap_content"
                       android:text="@string/setspeed"
                       android:layout_gravity="center_horizontal"
                       android:layout_marginTop="15dp"
            />
            <Button
                       android:layout_height="wrap_content"
                       android:layout_width="fill_parent"
                       android:text="@string/back"
                       android:layout_gravity="bottom"
                       android:layout_marginTop="15dp"
                       android:onClick="onBackClick"
            />
</LinearLayout>

Now your main activity will look like

</pre>
package com.androidmyway.demo.ttsdemo;

import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;

public class TTSDemo extends Activity implements TextToSpeech.OnInitListener {
            private static final String TAG = "TextToSpeechDemo";
            private TextToSpeech mTts;
            private Button mAgainButton,mSetPitchButton,mSetSpeedButton;
            private EditText inputText;
            private SeekBar pitchslider,speedslider;
@Override
            public void onCreate(Bundle savedInstanceState) {
                       super.onCreate(savedInstanceState);
                       setContentView(R.layout.main);
                       // Initialize text-to-speech. This is an asynchronous operation.
                       // The OnInitListener (second argument) is called after initialization completes.
                       mTts = new TextToSpeech(this,this); //TextToSpeech.OnInitListener

                       inputText = (EditText) findViewById(R.id.inputtext);
                       mAgainButton = (Button) findViewById(R.id.again_button);
                       pitchslider = (SeekBar) findViewById(R.id.pitchslider);
                       mSetPitchButton = (Button) findViewById(R.id.set_pitch);
                       speedslider = (SeekBar) findViewById(R.id.speedslider);
                       mSetSpeedButton = (Button) findViewById(R.id.set_speed);
                       mAgainButton.setOnClickListener(new View.OnClickListener() {
                                  public void onClick(View v){
                                             sayHello();
                                  }
                       });

mSetPitchButton.setOnClickListener(new OnClickListener() {
                                  @Override
                                  public void onClick(View v) {
                                             // TODO Auto-generated method stub
                                             double pitch = (pitchslider.getProgress() + 1);
                                             pitch = pitch / 10;
                                             mTts.setPitch((float)pitch);
                                             //Toast.makeText(getApplicationContext(), (pitchslider.getProgress() + 1) + "//" + pitch,
Toast.LENGTH_SHORT).show();
                                  }
                       });

                       mSetSpeedButton.setOnClickListener(new OnClickListener() {
                                  @Override
                                  public void onClick(View v) {
                                             // TODO Auto-generated method stub
                                             double speed = (speedslider.getProgress() + 1);
                                             speed = speed / 10;
                                             mTts.setSpeechRate((float) speed);
                                             //Toast.makeText(getApplicationContext(), (pitchslider.getProgress() + 1) + "//" + pitch,
Toast.LENGTH_SHORT).show();
                                  }
                       });
  }

            @Override
            public void onDestroy() {
                       // Don't forget to shutdown!
                       if (mTts != null) {
                                  mTts.stop();
                                  mTts.shutdown();
                       }
                       super.onDestroy();
            }

            // Implements TextToSpeech.OnInitListener.
            public void onInit(int status) {
                       // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
                       if (status == TextToSpeech.SUCCESS) {
                                  int result = mTts.setLanguage(Locale.US);
                                   if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
                                             // Lanuage data is missing or the language is not supported.
                                             Log.e(TAG, "Language is not available.");
                                  } else {
                                             // Check the documentation for other possible result codes.
                                             // For example, the language may be available for the locale,
                                             // but not for the specified country and variant.
                                             // The TTS engine has been successfully initialized.
                                             // Allow the user to press the button for the app to speak again.
                                             mAgainButton.setEnabled(true);
                                             // Greet the user.
                                             sayHello();
                                  }
                       } else {
                                  // Initialization failed.
                                  Log.e(TAG, "Could not initialize TextToSpeech.");
                       }
            }

            private void sayHello() {
                       // Select a random hello.
                       // Drop allpending entries in the playback queue.
                       mTts.speak(inputText.getText().toString(),TextToSpeech.QUEUE_FLUSH,null);
            }

}

Now that one important thing I am not sure on range of pitch & speed but as per documentation
it takes float value & 1.0 means normal so I figured out may be range is between 0.1 – 2.0. My all calculations are as per it.

Uploaded code on GitHub.com
https://github.com/sandipmjadhav/Android-Text-to-Speech

About these ads

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s