Skip to main content

Android Speech Recognition Without Dialog In A Custom Activity.

A very interesting feature introduced in android is speech recognition. Many apps like Google Now, Chrome browser app, Google Maps app use speech recognition for their text input. Most of the apps use the standard easy way to get the voice inputs i.e.startActivityForResult by a RecognizerIntent. This would launch a dialog on top of the app listen to voice input and would return the text back to the app. Now in this tutorial Android Speech Recognition Without Dialog in a Custom Activity, I would show how to do the speech recognition in android without this dialog box.
Recently I was working on an app where I wanted voice to text input, but I did not wanted to show the Google’s pre made voice input dialog. Another way of doing this is by using the IME voice input, i.e the speech recognition from the keyboard. All you need to do is enable this option from the “Language & Input” device settings. But in Android Speech Recognition Without Dialog is possible by one more method, that is to implement theRecognitionListener and override all of its callback methods. This way, one would be able to recognize speech without going to the Google’s original speech recognition dialog.
A drawback of Android Speech Recognition Without Dialog in a Custom Activity is that, we would also have to override the onRmsChanged callback method if we need to show the voice visualization while recording. In this tutorial I have used the standard androidProgressBar to show the voice levels.
To start of with Android Speech Recognition Without Dialog tutorial lets first define the permissions in the android manifest:
----------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.voicerecognition"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.voicerecognition.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
----------------------------------------------------------------------------------------------
To use the SpeechRecognizer class which provides the access to speech recognition service we need to declare the android.permission.RECORD_AUDIO permission. Next lets have a look at the layout xml file activity_main.xml.
----------------------------------------------------------------------------------

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_launcher" />
 
    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/toggleButton1"
        android:layout_marginTop="28dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="47dp" />
 
    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="26dp"
        android:text="ToggleButton" />
 
</RelativeLayout>
----------------------------------------------------------------------------------
Here is the java file 
----------------------------------------------------------------------------------
public class MainActivity extends Activity implements RecognitionListener 
 private TextView returnedText;
 private ToggleButton toggleButton;
 private ProgressBar progressBar; 
 private SpeechRecognizer speech = null;
 private Intent recognizerIntent; 
 private String LOG_TAG = "VoiceRecognitionActivity"; 
 @Override 
protected void onCreate(Bundle savedInstanceState) 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main);
 returnedText = (TextView) findViewById(R.id.textView1); 
 progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
 toggleButton = (ToggleButton) findViewById(R.id.toggleButton1); progressBar.setVisibility(View.INVISIBLE); speech=SpeechRecognizer.createSpeechRecognizer(this); 
 speech.setRecognitionListener(this); 
 recognizerIntent= new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() 
 @Override 
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
{ // TODO Auto-generated method stub 
 if (isChecked) 
{
 progressBar.setVisibility(View.VISIBLE);
 progressBar.setIndeterminate(true);
 speech.startListening(recognizerIntent);
 } 
else 
{
 progressBar.setIndeterminate(false);
 progressBar.setVisibility(View.INVISIBLE);
 speech.stopListening();
 } 
 }
 });
 } 
 @Override
 public void onResume() 
 super.onResume(); 
 }
 @Override
 protected void onPause() 
 super.onPause();
 if (speech != null) 
{
 speech.destroy();
 Log.i(LOG_TAG, "destroy");
 }
 } 
 @Override 
 public void onBeginningOfSpeech()
 { // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onBeginningOfSpeech");
 progressBar.setIndeterminate(fkalse);
 progressBar.setMax(10);
 }
 @Override 
 public void onBufferReceived(byte[] arg0)
 {
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onBufferReceived: " + arg0);
 }
 @Override 
 public void ok6nEndOfSpeech()
 { // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onEndOfSpeech");
 progressBar.setIndeterminate(true);
 toggleButton.setChecked(false);
 }
@Override
 public void onError(int errorCode) 
{
 // TODO Auto-generated method stub 
String errorMessage = getErrorText(errorCode); 
 Log.d(LOG_TAG, "FAILED " + errorMessage);
 returnedText.setText(errorMessage);
 toggleButton.setChecked(false);
 } 
 @Override
 public void onEvent(int arg0, Bundle arg1)
 {
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onEvent");
 } 
 @Override 
 public void onPartialResults(Bundle arg0) 
{
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onPartialResults");
 } 
 @Override 
 public void onReadyForSpeech(Bundle arg0) 
{
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onReadyForSpeech")
; } 
 @Override 
 public void onResults(Bundle arg0) 
{
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onResults");
 ArrayList<String> matches = arg0.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
 String text = ""; 
 for (String result : matches) text += result + "\n"; 
 returnedText.setText(text); 
 }
 @Override 
 public void onRmsChanged(float rmsdB) 
 // TODO Auto-generated method stub 
 Log.i(LOG_TAG, "onRmsChanged: " + rmsdB); 
 progressBar.setProgress((int) rmsdB); 
 } 
 public static String getErrorText(int errorCode) 
 String message; switch (errorCode) 
{
 case SpeechRecognizer.ERROR_AUDIO: 
 message = "Audio recording error"; 
 break; 
 case SpeechRecognizer.ERROR_CLIENT: 
 message = "Client side error"; 
 break; 
 case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: 
 message = "Insufficient permissions";
 break; 
 case SpeechRecognizer.ERROR_NETWORK: 
 message = "Network error"; 
 break; 
 case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
 message = "Network timeout";
 break; 
 case SpeechRecognizer.ERROR_NO_MATCH:
 message = "No match"; 
 break; 
 case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
 message = "RecognitionService busy"; 
 break; 
 case SpeechRecognizer.ERROR_SERVER: 
 message = "error from server"; 
 break;
 case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: 
 message = "No speech input"; 
 break; 
 default: 
 message = "Didn't understand, please try again."; 
 break; 
 }
 return message; 
 } 
 } 
----------------------------------------------------------------------------------
Here is the apk download it.

Comments

Post a Comment

Popular posts from this blog

Galaxy Note 2 vs IPhone 5

PHYSICAL Lower SAR for head (EU) 0.17 W/kg vs 0.95 W/kg 0.78 W/kg Lower SAR for head (EU). SAR (Specific Absorption Rate) describes how much radio frequency energy emitted by the device will be absorbed by your body. The rate is measured at head level. The legal limit is 2.0 W/kg in the EU. Noticeably lower SAR for body (USA) 0.95 W/kg vs 1.18 W/kg 0.23 W/kg lower SAR for body (USA). SAR (Specific Absorption Rate) describes how much radio frequency energy emitted by the device will be absorbed by your body. The rate is measured at hip level. The legal limit is 1.6 W/kg in the USA. Lower SAR for head (USA) 0.23 W/kg vs 1.18 W/kg 0.95 W/kg Lower SAR for head (USA). SAR (Specific Absorption Rate) describes how much radio frequency energy emitted by the device will be absorbed by your body. The rate is measured at head level. Th...