Sabtu, 11 Mei 2013

Membuat Aplikasi Android Speech To Text Bahasa Inggris, Voice Recognition Android

Penulis selalu memimpikan bisa memiliki komputer yang bisa mengenali perintah suara kita. Seperti dalam film-film, misal seperti JARVIS dalam Iron Man ^_^ Nah mimpi itu kita awali dari membuat aplikasi yang dapat mengubah suara (speech) menjadi teks dulu (SpeechToText) di aplikasi smartphone Android. Suara ini sebenarnya bisa dalam Bahasa Indonesia, tetapi itu untuk artikel yang lain. Kali ini kita awali dahulu TextToSpeech dalam Bahasa Inggris.

Pertama buat Project Android. Kemudian pada MainActivity kita tuliskan kode program ini :




package com.amijaya.speechtotextinggris;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.speech.RecognizerIntent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
 // http://cariprogram.blogspot.com
 // nuramijaya@gmail.com
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(
      RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");

    try {
     startActivityForResult(intent, 1);
     
     EditText editText1 = (EditText)findViewById(R.id.editText1);
     editText1.setText("");
    } catch (ActivityNotFoundException a) {
     Toast t = Toast.makeText(getApplicationContext(),
       "Device Not Supported",
       Toast.LENGTH_SHORT);
     t.show();
    }

   }
  });
    }
    
    @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  switch (requestCode) {
  case 1: {
   if (resultCode == RESULT_OK && null != data) {

    ArrayList<String> text = data
      .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

    EditText editText1 = (EditText)findViewById(R.id.editText1);
    editText1.setText(text.get(0));
   }
   break;
  }

  }
 }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    /*
 // CARA MENGECEK APAKAH TTS DISUPPORT DAN MEMANGGIL INSTALLER TTS GOOGLE PLAY
  
     //find out whether speech recognition is supported
        PackageManager packManager = getPackageManager();
        List<ResolveInfo> intActivities = packManager.queryIntentActivities
          (new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
        if (intActivities.size() != 0) {
         //speech recognition is supported - detect user button clicks
            speechBtn.setOnClickListener(this);
            //prepare the TTS to repeat chosen words
            Intent checkTTSIntent = new Intent();  
            //check TTS data  
            checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);  
            //start the checking Intent - will retrieve result in onActivityResult
            startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); 
        }
        else 
        {
         //speech recognition not supported, disable button and output message
            speechBtn.setEnabled(false);
            Toast.makeText(this, "Oops - Speech recognition not supported!", Toast.LENGTH_LONG).show();
        }
        
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     //check speech recognition result 
        if (requestCode == VR_REQUEST && resultCode == RESULT_OK) 
        {
         //store the returned word list as an ArrayList
            ArrayList<String> suggestedWords = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            //set the retrieved list to display in the ListView using an ArrayAdapter
            wordList.setAdapter(new ArrayAdapter<String> (this, R.layout.word, suggestedWords));
        }
        
        //returned from TTS data check
        if (requestCode == MY_DATA_CHECK_CODE) 
        {  
         //we have the data - create a TTS instance
         if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)  
          repeatTTS = new TextToSpeech(this, this);  
         //data not installed, prompt the user to install it  
         else 
         {  
          //intent will take user to TTS download page in Google Play
          Intent installTTSIntent = new Intent();  
          installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);  
          startActivity(installTTSIntent);  
         }  
        }

        //call superclass method
        super.onActivityResult(requestCode, resultCode, data);
    }

  */
    
}


Kemudian buat layout di file activity_main.xml seperti ini :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speech To Text English" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speak" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

</LinearLayout>

Dan terakhir file AndroidManifest.xml tidak perlu kita rubah :

<manifest android:versioncode="1" android:versionname="1.0" package="com.amijaya.speechtotextinggris" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minsdkversion="8" android:targetsdkversion="16">

    <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
        <activity android:label="@string/app_name" android:name="com.amijaya.speechtotextinggris.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN">

                <category android:name="android.intent.category.LAUNCHER">
            </category></action></intent-filter>
        </activity>
    </application>

</uses-sdk></manifest>


Hasilnya, Setelah kita klik Tombol akan muncul dialog Speak Now :


Kemudian akan diproses :


Kemudian setelah suara dikenali akan muncul tulisannya di EditText :


Agar pengenalan Speech To Text bekerja maksimal dalam mengenali kata dalam Bahasa Inggris (English) silakan ubah di Setting dengan Language English (United States) :


Project selengkapnya silakan didownload. Jika sulit coba baca cara downloadnya ini.

Semoga berhasil :)

5 komentar:

  1. getMenuInflater().inflate(R.menu.activity_main, menu);


    mf, kata menu di R.menu t mengacu k mana?? kok saya coba copykan listingnya tapi ada tanda merah di kata "menu" t???? mhon bantuannya, terimakasih....



    satu lagi,,, di bagian:
    public void onClick(View arg0) {
    kata "onClick" ny jga merah,,, gmana tuch???

    BalasHapus
    Balasan
    1. Pada bagian MenuInflater sebaiknya jangan dicopy Mbak jika versi Eclipse-nya tidak sama. Sepertinya versi eclipse-nya masih yang lebih lama jadi Menu tidak terletak di lokasi yang sama. Coba download di http://developer.android.com/tools/sdk/eclipse-adt.html. Atau langkah yang paling mudah, khusus MenuInflater tidak perlu dicopy.
      @Override
      public void onClick
      ada tanda merah juga karena versinya Eclipse yang lama, coba dihapus saja @Override nya

      Hapus
  2. mau tanya apakah aplikasi ini harus online atau bisa offline juga?

    BalasHapus
  3. mas mau nanya itu teknik agar bisa terkoneksi dengan database google tekniknya apa ya?

    BalasHapus
  4. Dalam aplikasi ini, menggunakan metode apa mmba ?
    Trimakasih untuk ilmunya :)

    BalasHapus