Android Core

Android Text-To-Speech Application

One of the many features that Android provides out of the box is the one of “speech synthesis”. This is also known as “Text-To-Speech” (TTS) and is mainly the capability of the device to “speak” text of different languages. This feature was introduced in version 1.6 of the Android platform and you can find an introductory article at the official Android-Developers blog. In this tutorial I am going to show you how to quickly introduce TTS capabilities into your application. Let’s get started by creating a new Eclipse project under the name “AndroidTextToSpeechProject” as shown in the following image: Note that Android 1.6 was used as the build target and that for the minimum SDK version I used the value 4, since this functionality is not provided by the previous versions. The first step to use the TTS API is to check if it is actually supported by the device. For that purpose there is a special action named ACTION_CHECK_TTS_DATA which is included in the TextToSpeech.Engine. As the Javadoc states, this is used by an Intent to “verify the proper installation and availability of the resource files on the system”. In case the resourses are not available, another action named ACTION_INSTALL_TTS_DATA is used in order to trigger their installation. Note that the SDK’s emulator supports TTS with no configuration needed. Before using the TTS engine, we have to be sure that it has properly been initialized. In order to get informed on whether this has happened, we can implement an interface called OnInitListener. The method onInit will be invoked when the engine initialization has completed with the accompanying status. After initialization, we can use the TextToSpeech class to make the device speak. The relevant method is named speak, where the text, the queue mode and some additional parameters can be passed. It is important to describe queue mode. It is the queuing strategy to be used by the TTS engine, i.e. what to do when a new text has been queued to the engine. There are two options:

  • QUEUE_ADD: the new entry is added at the end of the playback queue
  • QUEUE_FLUSH: all entries in the playback queue (media to be played and text to be synthesized) are dropped and replaced by the new entry

All the above are translated to the code provided below:

package com.javacodegeeks.android.tts;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class TtsActivity extends Activity implements OnInitListener {
    
    private int MY_DATA_CHECK_CODE = 0;
    
    private TextToSpeech tts;
    
    private EditText inputText;
    private Button speakButton;
    
 @Override
 public void onCreate(Bundle savedInstanceState) {
    
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  inputText = (EditText) findViewById(R.id.input_text);
  speakButton = (Button) findViewById(R.id.speak_button);
  
  speakButton.setOnClickListener(new OnClickListener() {            
   @Override
   public void onClick(View v) {
       String text = inputText.getText().toString();
       if (text!=null && text.length()>0) {
    Toast.makeText(TtsActivity.this, "Saying: " + text, Toast.LENGTH_LONG).show();
    tts.speak(text, TextToSpeech.QUEUE_ADD, null);
       }
   }
      });
  
  Intent checkIntent = new Intent();
      checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
      startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
        
    }
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                // success, create the TTS instance
                tts = new TextToSpeech(this, this);
            } 
            else {
                // missing data, install it
                Intent installIntent = new Intent();
                installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installIntent);
            }
        }

    }

    @Override
    public void onInit(int status) {        
        if (status == TextToSpeech.SUCCESS) {
            Toast.makeText(TtsActivity.this, 
                    "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show();
        }
        else if (status == TextToSpeech.ERROR) {
            Toast.makeText(TtsActivity.this, 
                    "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
        }
    }
    
}

The engine support is checked in the onActivityResult method. If there is support for TTS, we initialize the engine, else a new Intent is launched in order to trigger the relevant installation. After initialization, we used a Toast in order to notify the user about the operation status. Finally, we use a text field where the text is provided by the user and a button which feeds the engine with the provided text. In order to run the project, an appropriate emulator device is needed. If you have none available, use the following configuration in the AVD manager (note that “Android 1.6 – API Level 4” or higher is needed): Provide the text you wish to hear into the text field, hit the button and listen to emulator speak to you! That’s all folks, nice and simple. Now, make your devices speak! You can download the created Eclipse project here.

Related Articles :
Related Examples :

Ilias Tsagklis

Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

17 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
manuw
12 years ago

I wrote a Text-To-Speech app just for fun.
Source: https://github.com/manuw/MyVoice

Yash Raithatha
Yash Raithatha
11 years ago

alert(‘Filter user input. They can insert anything’);

kuldeep singh
kuldeep singh
11 years ago

i want to create an app which reads email. is it possible if yes then how? pls send me appropriate codes.
my email id is: kskuldeep230@gmail.com

Selvameena N
Selvameena N
11 years ago

Hi Deepthy,

i used ur code and working fine but i included a back button and calling finish(); .This forcing my app to stop unexpectedly. why is this so? help me

santosh
santosh
11 years ago

sir how to set male voice to text to speech

Sandhya R
Sandhya R
8 years ago
Reply to  santosh

hey!
did u find a solution for that? i looking for the same answer.

santosh
santosh
11 years ago

plz snd reply to my mail id

niyas
niyas
11 years ago

its is possible to leave a time gap between two words pronounciation in text to speech………..after a words pronounced only next word should come

saranya
saranya
11 years ago

i need an abstract documentation for this text to speech conversion will u plz provide it for me, and when i m running the emulator its not responding and sometimes it failed to install …. how can i run it ?give me solution

Priyanka
Priyanka
11 years ago

sir its nt workng…do we have to take any permission in the mainfest file…????

satyendra
satyendra
11 years ago
Reply to  Priyanka

no priyanka its working well…. nothing is required in manifest file……….. just simply copy paste n do required changes

Ravi Agarwal
Ravi Agarwal
11 years ago

Its awesome

Dineesh
Dineesh
11 years ago

i required the android code for voice visualizer from microphone.if got please send to my email id:dineesh2503@gmail.com

Aouie
Aouie
10 years ago

hello peeps … Im a newbie in programming …but since the source code here is ready to copy and paste …i thought it will work just fine … but i was just frustrated … can anyone please help me how to do this step by step … here is what I did : 1. i opened my eclipse … 2.then i followed how to make the emulator … 3.then i created a new eclipse project with the suggested filename .. 4. then i pasted the source code in between the relative layout .. 5. i clicked run … and nothing… Read more »

Dotmons
Dotmons
10 years ago

Nice work in here… Works perfectly fine and great.. Thanks…. Great work

Dhiraj Shende, NAGPUR
Dhiraj Shende, NAGPUR
10 years ago

Can we speak the provided text without of onclick of button…
i want to play the my name every time when activity is started…

Ryan S
Ryan S
10 years ago

Hi, this is some great code. But i have one slight problem. There is an error showing up for both the input_text and speak_button. It’s telling me it cannot be resolved or it is not a field. Any clue on what I can do to solve this problem? Thanks.

Back to top button