Aplikasi agar HP bisa mendengar dan bisa menulis

Saya telah mengirimi kode ini ke beberapa teman2 yang membutuhkan-nya. Tapi karena penyakit bawaan saya yang bernama m a l a s kambuh lagi maka untuk selanjutnya saya tidak akan kirim lagi lewat email dan atau PM. Bagi yang berminat menelusuri kode ini silahkan datang kesini dan ambil sendiri... sorry yah

Ini adalah struktur kode paling sederhana untuk aplikasi Speech Recognition yaitu aplikasi yang bisa membuat HP menulis apa yang kita ucap(ucapnya yang jelas yah biar HPnya bisa paham). Bagi teman2 yang pintar java tentunya sangat mudah untuk mengembangkan aplikasi ini lebih lanjut sesuai kebutuhan masing2.
Aplikasi ini telah saya jalankan testing di beberapa device yang menggunakan sistim android baik yang layar kecil seperti HP maupun di layar lebar seperti tablet khususnya tablet samsung dan motorola ukuran 7 inch maupun yang 10 inch, dan alhamdulillah tampang user interfacenya(UI) semuanya terlihat sama, begitu pula cara kerja dan logika aplikasinya semuanya sama, hal itu menunjukan bahwa aplikasinya telah bekerja sesuai rencana.

Walau aplikasi ini sudah bekerja dengan baik namun saya enggan untuk di pasang ke android market karena masih membutuhkan koneksi internet untuk bisa bekerja.
Alasan-nya bahwa terlalu banyak kata yang di pakai oleh aplikasi untuk mencoba menebak kira2 kata apa saja yang di ucapkan manusia saat berbicara dengan HP. Oleh karena terlalu banyak, maka tempat simpan(storage) HP terlalu kecil sehingga lebih baik di biarkan saja di simpan milliaran kata2 tsb di server-nya google. Dengan demikian maka pada halaman AndroidManifest.xml hanya membutuhkan permission khusus yang berbunyi ' <uses-permission android:name="android.permission.RECORD_AUDIO" /> ' sehingga setiap kali kitan ngomong dengan HP maka dengan cepat HP-nya mencari ke server kira2 kata2 apa yang telah kita ucap, dan suguhkan-nya ke layar dari yang kira2 benar sampai yang ke paling benar.
Hal itu berbeda dengan aplikasi 'TTS(text to speech) yang bekerja tanpa koneksi internet yang saya tulis sebelumnya silahkan baca TTS disini

Tapi... oleh karena banyak teman yang PM saya untuk minta kodenya, maka berikut adalah class utama untuk menjalankan aplikasi 'Speech Recognition' yang saya beri nama SuaraJadiTeks.java



package com.vik_sintus.projects.suaraJadiTeks;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
 
/**
 *aplikasi agar HP bisa mendengar dan menulis
 *silahkan di pakai untuk kepentingan belajar
 *Tak boleh di pakai utk kepentingan komersial
 *hubungi vik.sintus@gmail.com
 *segala kelebihan dan kekurangan di luar tanggungjawab pembuat
 */
public class SuaraJadiTeks extends Activity {
 
    private static final int PRIKSA_KEBENARAN_NYA = 1234;
    private ListView daftarKataYangKeluar;
 
    //suruh android utk buka aplikasi yang
    //tampang depannya berada di R.layout.suara_jadi_teks

@Override
public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.suara_jadi_teks);
   Button tombol = (Button) findViewById(R.id.tombolUntukBicara);
   daftarKataYangKeluar = (ListView) findViewById(R.id.daftarKataKata);
 
        // Kalau tak ada service maka matikan tombolnya
        // dan tinggalkan pesan agar pengguna tak bingung
 PackageManager paketAplikasi = getPackageManager();
 List<resolveinfo> aktivitas = paketAplikasi.queryIntentActivities(
   new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
      if (aktivitas.size() == 0){
   tombol.setEnabled(false);
   tombol.setText("salah..tak bisa di buka...coba konek ke internet");
        }
    }
 
   //ketika tombol di tekan apa yang harus di lakukan
    
    public void ketikaTombolDiTekan(View v)
    {
        mulaiAktivitasSuaraJadiTeks();
    }
 
    // mulai aktivitas voice recognition dengan 
    // menghidupkan Intent-nya.
     
 private void mulaiAktivitasSuaraJadiTeks(){
   Intent ubahSuaraJadiTeks = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   ubahSuaraJadiTeks.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
   ubahSuaraJadiTeks.putExtra(RecognizerIntent.EXTRA_PROMPT, "Demo suara jadi teks...");
        startActivityForResult(ubahSuaraJadiTeks, PRIKSA_KEBENARAN_NYA);
    }
 
    //Olah hasil dari Intent.
    
  @Override
  protected void onActivityResult(int kodePriksa, int ambilHasil, Intent hasil){
     if (kodePriksa == PRIKSA_KEBENARAN_NYA && ambilHasil == RESULT_OK){
// isi dengan kata2 yang cocok menurut apa yang di 
// dengar oleh device
// dan kalau device mendengar/merekam lebih 
// banyak kata-kata(EXTRA_RESULT)maka daftarKataKataYangKeluar di 
// adaptasikan dengan ArrayAdapter menggunakan
// tampilan/interface yang bernama simple_list_item_1
      ArrayList<string> kataYangCocok = hasil.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);daftarKataYangKeluar.setAdapter(new ArrayAdapter<string>(this, android.R.layout.simple_list_item_1,kataYangCocok));
        }
        super.onActivityResult(kodePriksa, ambilHasil, hasil);
    }
}


Berikut adalah sedikit penjelasan dari kode di atas
public class SuaraJadiTeks extends Activity {
private static final int PRIKSA_KEBENARAN_NYA = 1234;
    private ListView daftarKataYangKeluar;
 
}
Untuk melakukan kegiatan-nya class 'SuaraJadiTeks' harus bergandengan dengan class 'Activity'.
class 'Activity itu sendiri sudah ada dalam android sistim, kita hanya merangkulnya saja dengan kata kunci extends.
 Kita juga butuh tempat untuk menampung kata-kata yang di dengarkan oleh hp, dan kita ingin kata-kata yang keluar di layar HP harus berjajar baris demi baris mulai dari bagian atas layar. Untuk menghasilkan itu kita  membutuhkan bantuan class ListView . Selain itu kita juga membutuhkan sebuah data bertipe integer(int) yang di pergunakan untuk mengecek kebenaran bahwa suara yang keluar dari HP adalah benar2 menuliskan kata-kata yang kita ucap alias bukan membaca dari tempat lain.
@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.suara_jadi_teks);
 
        Button tombol = (Button) findViewById(R.id.tombolUntukBicara);
 
        daftarKataYangKeluar = (ListView) findViewById(R.id.daftarKataKata);
Kode di atas menjelaskan apa yang akan di lakukan ketika aplikasinya di buka? lihat isi aplikasinya di setContentView(R.layout.suara_jadi_teks);
Di dalam aplikasi akan ada tombol Button tombol = (Button) findViewById(R.id.tombolUntukBicara); dan juga akan ada daftar deretan kata yang di tuliskan oleh HP daftarKataYangKeluar = (ListView) findViewById(R.id.daftarKataKata);

Kemudian, kita membutuhkan jasa class PackageManager untuk membungkus semua objects dan classses yang menjalankan aktivitas aplikasi agar tidak tercecer. Sedangkan class List dan class ResolveInfo adalah untuk mengatur aktivitas aplikasi agar dapat di proses oleh class RecognizerIntent yang notabene adalah engine utama aplikasi ini yang beraksi sebagai ACTION_RECOGNIZE_SPEECH atau aksi yang memahami kata-kata yang kita ucap.
Kalau aktivitasnya tak ada if (aktivitas.size() == 0) maka matikan tombolnya tombol.setEnabled(false); dan berikan penjelasan kepada pengguna mengapa aplikasinya tak bekerja dengan tombol.setText("tak bisa di buka...mungkin kodenya salah... coba konek ke internet")
PackageManager paketAplikasi = getPackageManager();
  List<resolveinfo> aktivitas = paketAplikasi.queryIntentActivities(
   new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
   if (aktivitas.size() == 0)
     {
       tombol.setEnabled(false);
       tombol.setText("tak bisa di buka, mungkin kodenya salah... coba konek ke internet");
        }

Beberapa dokumen lain yang di butuhkan

Ada ciri khas khusus dalam android struktur, seperti adanya AndroidManifest.xml ia bekerja sebagai pintu gerbang bagi semua aplikasi android, silahkan baca tentang AndroidManifest selengkapnya di http://developer.android.com/guide/topics/manifest/manifest-intro.html

Berikut adalah isi dari AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.vik_sintus.projects.suaraJadiTeks"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
  
    <application android:label="VoiceRecognition" android:icon="@drawable/icon"
            >
        <activity android:name=".SuaraJadiTeks"
                  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>
Selain AndroidManfest.xml, aplikasi ini juga membutuhkan tampang/interface agar dapat di lihat, di colek dan di sentuh oleh manusia. Berikut adalah interface dari aplikasi ini yang saya beri nama suara_jadi_teks.xml
<?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">
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="4dip"
        android:text="@string/suruhBicara" />
 
    <Button android:id="@+id/tombolUntukBicara"
        android:layout_width="fill_parent"
        android:onClick="tombolSudahDiTekan"
        android:layout_height="wrap_content"
        android:text="@string/tombol" />
 
    <ListView android:id="@+id/daftarKataKata"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />
 
 </LinearLayout>
Berikut adalah strings.xml seperti yang di isyaratkan oleh @string pada kode di atas
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SuaraJadiTeks</string>
    <string name="voice_recognition_prompt">Demo Suara Jadi Teks</string>
    <string name="tombol">Tekan disini</string>
    <string name="suruhBicara">Tekan tombol dan mulai bicara</string>
</resources>

mmmhhh.... apa lagi yah
Saya rasa itu saja yang di butuhkan agar aplikasi 'speech recognition' ini bisa bekerja.

Untuk refresh ingatan... yang kita butuhkan adalah
1 SuaraJadiTeks.java
2 AndroidManifest.xml
3 suara_jadi_teks.xml
4 strings.xml

Note: nama file adalah case sensitive, maksudnya harus mengindahkan huruf kecil atau huruf besar serta tanda baca yang ada di nama file tsb

Baca disini langkah untuk bangun aplikasi android pakai eclipse

35 comments:

  1. minta code yang buat desktop nya gan,..:D

    tolong kirim ke "coreinside06@gmail.com"

    makasih sebelumnya,.. sukses trus gan,.. :)

    ReplyDelete
  2. sorry, belum coba utk desktop alasan-nya karena sudah banyak applikasi yang lebih mudah untuk TTS khususnya kalau pakai chrome silahkan download ekstensi 'text to speech" nya dari https://chrome.google.com/webstore/search/tts

    ReplyDelete
  3. gan saya salah terus di bagian suaraJadiTeks.java nya ,

    mohon pencerahanya dong gan ,

    kalau bisa file nya kirimin aja deh ke email saya
    randiekas@gmail.com

    thanks before :D
    tutorial nya sangat menarik :D

    ReplyDelete
  4. Hello Randi, tolong jelaskan salahnya dimana mas?
    Perlu di ketahui bahwa applikasi macam ini (speech to text(STT)) perlu koneksi network dan koneksi internet sebelum ia dapat bekerja, itu sebabnya saya tidak pasangnya di market karena untuk sementara saya hanya tertarik dengan aplikasi yang tak butuh internet(mengingat kondisi kebanyakan wilayah di indonesia)

    berbeda dengan aplikasi TTS(text to speech) yang bisa di pakai tanpa koneksi internet.
    Silahkan lihat TTS di http://belajar-android-indonesia.blogspot.com.au/2011/11/aplikasi-yang-membuat-hp-bisa-ngomong.html
    dan saya pasang hasil aplikasinya di market https://play.google.com/store/apps/details?id=com.vik_sintus.projects.hpNgomong

    ReplyDelete
  5. Gan, bisa ga ya kita cuma ambil beberapa kata, misalnya "satu", "dua", "tiga".. dari server google buat ditaro di hape, jadi kira bisa pake speech recognition offline khusus cuma buat kata2 tersebut. Kalo bisa, mohon penjelasannya.. ni buat skripsi ane pembimbingnya minta aneh2. Makasih :)

    ReplyDelete
  6. mas Anggit,
    aplikasi ini hanya konversi suara ke teks.
    apakah maksudnya agar HP-nya bisa membaca satu, dua, tiga

    ReplyDelete
  7. Maksudnya biar bisa pake speech recognition offline di hape (android)walopun kata2nya terbatas

    ReplyDelete
    Replies
    1. belum bisa, mungkin karena tempat untuk menyimpan data suara dan data kata-kata akan membebani HP

      Delete
  8. Kalo pengucapanya menggunakan bahasa Indonesia bisa tidak ?

    ReplyDelete
    Replies
    1. bisa..... dengan cara mencuri engine suara dari negara spanyol dengan mengubah kode di bagian:

      public void onInit(int kondisi) {
      membaca.setLanguage(Locale.UK);
      }
      dan di ubah menjadi:

      public void onInit(int kondisi) {
      membaca.setLanguage(new Locale("es_ES"));

      }

      Note: namun bahasa sepanyol tak ada huruf j dan huruf c harus di tambah huruf h agar terdengar seperti huruf c

      Ada huruf j di bahasa sepanyol tapi akan terbaca h misalnya kata jangan akan di baca hangan... saya sendiri masih mencari solusi untuk itu
      selebihnya akan terdengar persis seperti suara bahasa Indonesia... silahkan di coba

      Delete
    2. This comment has been removed by the author.

      Delete
  9. mas vic, cara untuk mendapatkan engine suara dari negara spanyol gimana ya?

    ReplyDelete
    Replies
    1. sudah ada dalam android sejak android 1.6 mas
      TETAPI... hanya bisa untuk TextToSpeech(TTS) dan bukan untuk SpeechToText(STT)

      dan juga di bahasa spanyol tak bisa membaca huruf 'J' walau tertulis 'J' tapi akan terbaca 'H'. saya sendiri belum tahu bagaimana jalan keluarnya.

      Begitu juga dengan huruf 'C' dalam bahasa(suara) spanyol akan terbaca 'K' tapi hal itu dapat di perbaiki dengan menyisipkan huruf "H" setelah "C" agar terdengar seperti "C" dalam kata "cari"

      Delete
    2. mas, saya sudah kirim beberapa pertanyaan ke vik.sintus@gmail.com mohon dijawab, terima kasih :)

      Delete
  10. @alimudin : kalau untuk suara2 di android itu sudah ada yang di mobile,,,coba di mbrola :D

    ReplyDelete
    Replies
    1. Hallo mbak..mau email mbak dong, mau sharing2 nih, bolehkan?? :D

      Delete
  11. permisi mau nanya...
    ketika saya bikin project dan coba debug di device android...
    muncul hal seperti ini...

    source not found
    Edit Source Lookup Path

    itu kenapa ya? terima kasih

    ReplyDelete
    Replies
    1. developnya pakai apa Noor
      kalau bisa, tak usah test langsung ke device, coba saja dahulu di emulator, hal itu adalah untuk menghemat waktu dan resource.

      pesan error seperti itu biasanya karena IDE-nya belum di atur untuk menyenangkan android.

      butuh info lebih banyak, agar bisa di ketahui dimana kekurangan-nya, misalnya apakah dari IDE-nya sudah ada aplikasi android lain yang sudah bisa berjalan

      Delete
  12. om, gak ada g+ atao fb atau yang lain om? pengen kenal nih, hehe

    ReplyDelete
    Replies
    1. hello Lutfi
      FB dan G+ dengan nama yang sama

      Delete
  13. wow that post is nice and if u have some code then please share with me i m waiting for yours the next post
    thanks

    -----------------------------------------------------------------------------
    Android Application Developer India & Android Application Development Company

    ReplyDelete
  14. ini speech to textnya pakai database apa ngga om?

    ReplyDelete
    Replies
    1. Hello Anyar Leonhart
      tak usah pakai database karena engine suara telah datang bersama android sejak android 1.6
      Kita hanya implementasikan saja, misalnya pada kode di atas tinggal di sebut atau di panggil class-nya sbb: "Intent ubahSuaraJadiTeks = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);"

      Delete
    2. trus untuk hasil textnya itu bsa dsmpan ato tidak om, jdinya sprti list view ada bbrpa kata yg pernah kita ucapkan nntinya akan tersimpan?

      Delete
    3. saya belum coba, develop untuk bisa menyimpan text-nya
      Tapi kalau keperluan-nya mendesak silahkan pakai aplikasi di https://www.google.com/intl/en/chrome/demos/speech.html
      dengan tekan microphone-nya terlebih dahulu.
      Hasilnya bisa di copy lalu di simpan ...tapi sayangnya bahasa Indonesia masih belum di pahami oleh speech recognition

      Delete
  15. mas mau nanya buat terkoneksi ama database ama google pake teknik apa ya?
    kebetulan saya buat skripsi denngan menggunakan fitur speech recognition ini juga

    ReplyDelete
    Replies
    1. hanya dengan kode di atas HP akan otomatis minta untuk di konek ke internet tapi kalau tak ingin HPnya jadi tukang minta maka pasanglah kode berikut di bagian uses-permision, sebelum atau sesudah tag

      " "

      Delete
    2. kodenya hilang... begini maksudnya

      " <uses-permission android:name="android.permission.INTERNET" /> "

      Delete
  16. Gan ane mau tanya nih..jika pengucapan dalam bahasa inggris salah apa berpengaruh pada text yang akan muncul?? ada email ga gan buat konsul aja

    ReplyDelete
    Replies
    1. teknologi utk aplikasi ini (STT(speech to text)) sebenarnya masih belum sempurna karena HP atau komputer hanya mencoba menebak kata yang kita ucap dengan menunjukan ke layar lebih dari tiga kata.
      Berbeda dengan TTS(text to speech) yang yang hampir 100% sempurna (utk bahasa inggris) dan beberapa bahasa lain yang telah membangun engine-nya dengan baik. silahkan baca TTS di http://belajar-android-indonesia.blogspot.com.au/2011/11/aplikasi-yang-membuat-hp-bisa-ngomong.html

      Delete
  17. mau nanya dong coding buat save hasil teks dari speech to text bagaimana ya? Terus itu bagaimana membuat hasil teks dari speech to text yang sudah disimpan menjadi speech. Saya butuh coding tersebut untuk project aplikasi notes yang saya buat.

    ReplyDelete
  18. Wah .... saya sebagai orang tuna rungu (tidak bisa mendengar) amat membutuhkan aplikasi seperti itu.
    Di mana saya mendapatkan aplikasi seperti itu?

    ReplyDelete
  19. kontek ane aja kang ada ni aplikasi beserta sorce code tajul.obama@gmail.com

    ReplyDelete
  20. STT tanpa koneksi internet. Akhir" ini saya nyari aplikasi yg bsa ubah suara mnjadi text tanpa koneksi internet, ga pernah ketemu, trnyta susah yah bikin aplikasi ny.
    Lanjutkan usaha nya kaka vik. Utamakan bahasa indonesia, mungkin jd negara prtama yg bsa bkin aplikasi STT tanpa koneksi internet. Pengen bgt ngetik slalu tinggal pake suara, otomatis di convert jd text oleh android. Tp klo sinyal lg burik banget kn susah.

    Semangatt kaka. :-D

    ReplyDelete
  21. bang aplks tts saya kalau diklik gmbar mic selalu mncul tulsn perangkat tdk didukung
    kira2 kurangnya apa ya ?
    trmksh

    ReplyDelete