Membuat Aplikasi Android dengan Pengenal Suara


* Artikel ini dipersembahkan oleh Intel Developer Zone. Untuk Mengetahui lebih lanjut tentang membuat aplikasi Android di Arstitektur Intel, kunjungi Intel Developer Zone for Android. Artikel asli dari artikel ini dapat dilihat di link ini.

Android sebetulnya tidak dapat mengenal suara sehingga perangkat berbasis Android umumnya tidak dapat mengenal suara. Namun, adakah cara untuk mengenal suara di Android?

Cara paling mudah untuk melakukan pengenalan suara adalah dengan meminta bantuan dari sebuah aplikasi. Meminta bantuan sebuah aplikasi untuk melakukan sesuatu di Android disebut dengan menggunakan intent.

Target perangkat untuk pengenalan suara harus memiliki minimal satu aplikasi yang dapat memproses intent untuk pengenalan suara yang mana dipanggil melalui RecognizerIntent.ACTION_RECOGNIZE_SPEECH.

Salah satu aplikasi yang dapat melakukan hal tersebut adalah Google Voice Search. Aplikasi tersebut adalah salah satu aplikasi pengenal suara yang paling bagus di Android dan sudah mendukung banyak bahasa. Aplikasi ini memerlukan koneksi Internet karena proses pengenalan suara berlangsung di server Google. Aplikasi ini memiliki activity yang sederhana yang memberitahukan pengguna untuk berbicara ke aplikasinya. Ketika pengguna berhenti berbicara, dialog aplikasi akan ditutup dan aplikasi kita (pemanggil intent) menerima rangkaian teks yang merupakan hasil pengenalan suara.

Gambar Aplikasi Android dengan Pengenal Suara

Contoh Pengenalan Suara

Mari kita membuat satu aplikasi sederhana yang mendemonstrasikan pencarian melalui suara di aplikasi.

Aplikasi kita harus melakukan hal-hal berikut ini:

  • Menerima permintaan untuk pengenalan suara
  • Cek ketersediaan aplikasi untuk pengenalan suara
  • Jika aplikasi pengenal suara tersedia, panggil intent dari aplikasi tersebut dan dapatkan hasilnya
  • Jika aplikasi pengenal suara tidak tersedia, tampilkan dialog untuk menginstal Google Voice Search dan arahkan pengguna ke Google Play jika dia mau.

Pertama, kita membuat class yang mengimplementasikan logika untuk pengenalan suara. Namakan class ini SpeechRecognitionHelper yang mana akan kita deklarasikan fungsi run() yang statik dan publik yang akan menerima permintaan untuk meluncurkan pengenalan suara.

/**
 * A helper class for speech recognition
 */
public class SpeechRecognitionHelper {

/**
     * Running the recognition process. Checks availability of recognition Activity,
     * If Activity is absent, send user to Google Play to install Google Voice Search.
    * If Activity is available, send Intent for running.
     *
     * @param callingActivity = Activity, that initializing recognition process
     */
    public static void run(Activity callingActivity) {
        // check if there is recognition Activity
        if (isSpeechRecognitionActivityPresented(callingActivity) == true) {
            // if yes – running recognition
            startRecognition(callingActivity);
        } else {
            // if no, then showing notification to install Voice Search
            Toast.makeText(callingActivity, "In order to activate speech recognition you must install \"Google Voice Search\"", Toast.LENGTH_LONG).show();
            // start installing process
            installGoogleVoiceSearch(callingActivity);
        }
    }
}

Seperti yang dapat dilihat, selain fungsi run() kita juga mengimplementasikan tiga fungsi lainnya:

  • isSpeechRecognitionActivityPresented – mengecek apakah aplikasi pengenal suara tersedia dalam sistem
  • installGoogleVoiceSearch – inisiasi proses instalasi Google Voice Search
  • startRecognition – mempersiapkan intent yang sesuai dan jalankan aplikasinya

Untuk mengecek apakah sebuah perangkat memiliki aplikasi pengenal suara, kita dapat menggunakan metode queryIntentActivities di class PackageManager. Metode ini akan memberikan daftar aktivitas yang dapat memproses intent yang ditentukan. Untuk menggunakan instance dari PackageManager, kita dapat menggunakan getPackageManager.

Kodingan untuk ini ditampilkan di bawah ini:

isSpeechRecognitionActivityPresented

/**
     * Checks availability of speech recognizing Activity
     *
     * @param callerActivity – Activity that called the checking
     * @return true – if Activity there available, false – if Activity is absent
     */
    private static boolean isSpeechRecognitionActivityPresented(Activity callerActivity) {
        try {
            // getting an instance of package manager
            PackageManager pm = callerActivity.getPackageManager();
            // a list of activities, which can process speech recognition Intent
            List activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);

            if (activities.size() != 0) {    // if list not empty
                return true;                // then we can recognize the speech
            }
        } catch (Exception e) {

        }

        return false; // we have no activities to recognize the speech
    }

Sekarang kita mengimplementasikan fungsi startRecognition. Fungsi ini akan membentuk intent yang ditentukan untuk meluncurkan aktivitas pengenal suara. Kamu dapat menemukan informasi detail tentang bagaimana cara melakukannya di halaman dokumentasi.

Kode sumber:

   /**
     * Send an Intent with request on speech 
     * @param callerActivity  - Activity, that initiated a request
     */
    private static void startRecognitionActivity(Activity callerActivity) {

        // creating an Intent with “RecognizerIntent.ACTION_RECOGNIZE_SPEECH” action
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

        // giving additional parameters:
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Select an application");    // user hint
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);    // setting recognition model, optimized for short phrases – search queries
        intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);    // quantity of results we want to receive
//choosing only 1st -  the most relevant 

        // start Activity ant waiting the result
        ownerActivity.startActivityForResult(intent, SystemData.VOICE_RECOGNITION_REQUEST_CODE);
    }

Terakhir, kita akan mengimplementasikan installGoogleVoiceSearch. Fungsi ini akan menampilkan dialog yang menanyakan pengguna apakah ia ingin menginstal Google Voice Search atau tidak dan mengarahkannya ke Google Play jika ia menyetujuinya.

/**
     * Asking the permission for installing Google Voice Search. 
     * If permission granted – sent user to Google Play
     * @param callerActivity – Activity, that initialized installing
     */
    private static void installGoogleVoiceSearch(final Activity ownerActivity) {

        // creating a dialog asking user if he want
        // to install the Voice Search
        Dialog dialog = new AlertDialog.Builder(ownerActivity)
            .setMessage("For recognition it’s necessary to install \"Google Voice Search\"")    // dialog message
            .setTitle("Install Voice Search from Google Play?")    // dialog header
            .setPositiveButton("Install", new DialogInterface.OnClickListener() {    // confirm button

                // Install Button click handler
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        // creating an Intent for opening applications page in Google Play
                        // Voice Search package name: com.google.android.voicesearch
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.voicesearch"));
                        // setting flags to avoid going in application history (Activity call stack)
                        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
                        // sending an Intent
                        ownerActivity.startActivity(intent);
                     } catch (Exception ex) {
                         // if something going wrong
                         // doing nothing
                     }
                }})

            .setNegativeButton("Cancel", null)    // cancel button
            .create();

        dialog.show();    // showing dialog
    }

Itu saja kodingannya. Kita menjalankan aktivitas pengenal suara dan lalu meminta izin pengguna untuk menginstal Google Voice Search dan lalu mengarahkannya ke Google Play jika ia setuju. Satu hal yang masih perlu kita lakukan adalah mengumpulkan hasil pengenalan suara.

Kita mengirimkan permintaan menggunakan fungsi startActivityForResult untuk mengumpulkan hasil dari aktivitas yang diluncurkan. Kita juga perlu untuk mendefinisikan ulang metode OnActivityResult di aktivitas pemanggil intent kita. Ini dapat dilakukan melalui cara di bawah ini:

// Activity Results handler
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        // if it’s speech recognition results
        // and process finished ok
        if (requestCode == SystemData.VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {

            // receiving a result in string array
            // there can be some strings because sometimes speech recognizing inaccurate
            // more relevant results in the beginning of the list
            ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

            // in “matches” array we holding a results... let’s show the most relevant
            if (matches.size() > 0) Toast.makeText(this, matches.get(0), Toast.LENGTH_LONG).show();
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

Sekarang Kita Sudah Siap

Class SpeechRecognitionHelper yang kita buat membuat kita dapat melakukan permintaan pengenalan suara dengan hanya memanggil satu fungsi run().

Semua yang diperlukan untuk menambahkan fitur pengenalan suara adalah dengan menambahkan class tersebut di proyek kita dan memanggil fungsi run di posisi yang diperlukan dan lalu mengimplementasikan pemroses teks hasil pengenalan suara dengan mendefinisikan ulang metode onActivityResult di aktifitas yang menginisiasikan pemanggilan pengenal suara.

Untuk informasi tambahan, kamu dapat membaca di situs web Android Developers. Di situ, kamu dapat menemukan beberapa contoh menarik yang menampilkan bagaimana cara melakukan pengenalan suara dan yang paling penting bagaimana cara mendapatkan daftar bahasa yang tersedia. Kamu akan memerlukan daftar ini jika ingin mengenal suara dari bahasa selain yang diset di konfigurasi lokal pengguna.

Untuk integrasi fitur pengenalan suara dengan cepat di aplikasi kamu, kamu dapat mengunduh dan menggunakan kode untuk class SpeechRecognitionHelper.

* Kunjungi Intel Developer Zone for Android untuk mengetahui lebih lanjut. Artikel asli dari artikel ini dapat dilihat di link ini.