Pengenalan suara dan kata untuk Android

Tutorial ini menunjukkan cara menggunakan TensorFlow Lite dengan model machine learning bawaan untuk mengenali suara dan kata-kata yang diucapkan di aplikasi Android. Model klasifikasi audio seperti yang ditunjukkan dalam tutorial ini dapat digunakan untuk mendeteksi aktivitas, mengidentifikasi tindakan, atau mengenali perintah suara.

Demo animasi pengenalan audio Tutorial ini menunjukkan cara mengunduh kode contoh, memuat proyek ke Android Studio , dan menjelaskan bagian penting dari contoh kode sehingga Anda dapat mulai menambahkan fungsi ini ke aplikasi Anda sendiri. Contoh kode aplikasi menggunakan TensorFlow Task Library for Audio , yang menangani sebagian besar perekaman dan prapemrosesan data audio. Untuk informasi selengkapnya tentang cara audio diproses sebelumnya untuk digunakan dengan model pembelajaran mesin, lihat Persiapan dan Augmentasi Data Audio .

Klasifikasi audio dengan pembelajaran mesin

Model pembelajaran mesin dalam tutorial ini mengenali suara atau kata dari sampel audio yang direkam dengan mikrofon pada perangkat Android. Contoh aplikasi dalam tutorial ini memungkinkan Anda beralih antara YAMNet/classifier , model yang mengenali suara, dan model yang mengenali kata-kata lisan tertentu, yang dilatih menggunakan alat TensorFlow Lite Model Maker . Model tersebut menjalankan prediksi pada klip audio yang berisi 15.600 sampel individual per klip dan berdurasi sekitar 1 detik.

Siapkan dan jalankan contoh

Untuk bagian pertama tutorial ini, Anda mendownload sampel dari GitHub dan menjalankannya menggunakan Android Studio. Bagian berikut dari tutorial ini mengeksplorasi bagian contoh yang relevan, sehingga Anda dapat menerapkannya ke aplikasi Android Anda sendiri.

Persyaratan sistem

  • Android Studio versi 2021.1.1 (Bumblebee) atau lebih tinggi.
  • Android SDK versi 31 atau lebih tinggi
  • Perangkat Android dengan versi OS minimum SDK 24 (Android 7.0 - Nougat) dengan mode pengembang diaktifkan.

Dapatkan kode contoh

Buat salinan lokal dari kode contoh. Anda akan menggunakan kode ini untuk membuat proyek di Android Studio dan menjalankan aplikasi contoh.

Untuk mengkloning dan mengatur kode contoh:

  1. Kloning repositori git
    git clone https://github.com/tensorflow/examples.git
    
  2. Secara opsional, konfigurasikan instance git Anda untuk menggunakan sparse checkout, sehingga Anda hanya memiliki file untuk aplikasi contoh:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

Impor dan jalankan proyek

Buat proyek dari kode contoh yang diunduh, buat proyek, lalu jalankan.

Untuk mengimpor dan membuat proyek kode contoh:

  1. Mulai Android Studio .
  2. Di Android Studio, pilih File > Baru > Impor Proyek .
  3. Navigasikan ke direktori kode contoh yang berisi file build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) dan pilih direktori tersebut.

Jika Anda memilih direktori yang benar, Android Studio akan membuat proyek baru dan membangunnya. Proses ini dapat memakan waktu beberapa menit, bergantung pada kecepatan komputer Anda dan apakah Anda pernah menggunakan Android Studio untuk proyek lain. Saat build selesai, Android Studio menampilkan pesan BUILD SUCCESSFUL di panel status Build Output .

Untuk menjalankan proyek:

  1. Dari Android Studio, jalankan proyek dengan memilih Run > Run 'app' .
  2. Pilih perangkat Android yang terpasang dengan mikrofon untuk menguji aplikasi.

Bagian selanjutnya menunjukkan modifikasi yang perlu Anda lakukan pada proyek yang ada untuk menambahkan fungsi ini ke aplikasi Anda sendiri, menggunakan contoh aplikasi ini sebagai titik referensi.

Tambahkan dependensi proyek

Dalam aplikasi Anda sendiri, Anda harus menambahkan dependensi proyek tertentu untuk menjalankan model pembelajaran mesin TensorFlow Lite, dan mengakses fungsi utilitas yang mengonversi format data standar, seperti audio, menjadi format data tensor yang dapat diproses oleh model yang Anda gunakan.

Contoh aplikasi menggunakan pustaka TensorFlow Lite berikut:

Petunjuk berikut menunjukkan cara menambahkan dependensi proyek yang diperlukan ke proyek aplikasi Android Anda sendiri.

Untuk menambahkan dependensi modul:

  1. Pada modul yang menggunakan TensorFlow Lite, perbarui file build.gradle modul untuk menyertakan dependensi berikut. Dalam kode contoh, file ini terletak di sini: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. Di Android Studio, sinkronkan dependensi proyek dengan memilih: File > Sync Project with Gradle Files .

Inisialisasi model ML

Di aplikasi Android, Anda harus menginisialisasi model machine learning TensorFlow Lite dengan parameter sebelum menjalankan prediksi dengan model tersebut. Parameter inisialisasi ini bergantung pada model dan dapat mencakup pengaturan seperti ambang akurasi minimum default untuk prediksi dan label untuk kata atau suara yang dapat dikenali oleh model.

Model TensorFlow Lite menyertakan file *.tflite yang berisi model tersebut. File model berisi logika prediksi dan biasanya menyertakan metadata tentang cara menafsirkan hasil prediksi, seperti nama kelas prediksi. File model harus disimpan di direktori src/main/assets proyek pengembangan Anda, seperti pada contoh kode:

  • <project>/src/main/assets/yamnet.tflite

Untuk kenyamanan dan keterbacaan kode, contoh mendeklarasikan objek pendamping yang menentukan pengaturan model.

Untuk menginisialisasi model di aplikasi Anda:

  1. Buat objek pendamping untuk menentukan pengaturan model:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. Buat pengaturan untuk model dengan membuat objek AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Gunakan objek pengaturan ini untuk membuat objek TensorFlow Lite AudioClassifier yang berisi model:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

Aktifkan akselerasi perangkat keras

Saat menginisialisasi model TensorFlow Lite di aplikasi Anda, Anda harus mempertimbangkan penggunaan fitur akselerasi hardware untuk mempercepat penghitungan prediksi model. Delegasi TensorFlow Lite adalah modul perangkat lunak yang mempercepat eksekusi model pembelajaran mesin menggunakan perangkat keras pemrosesan khusus pada perangkat seluler, seperti unit pemrosesan grafis (GPU) atau unit pemrosesan tensor (TPU). Contoh kode menggunakan Delegasi NNAPI untuk menangani akselerasi perangkat keras dari eksekusi model:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

Disarankan untuk menggunakan delegasi untuk menjalankan model TensorFlow Lite, tetapi tidak wajib. Untuk informasi selengkapnya tentang penggunaan delegasi dengan TensorFlow Lite, lihat Delegasi TensorFlow Lite .

Siapkan data untuk model

Di aplikasi Android, kode Anda menyediakan data ke model untuk diinterpretasikan dengan mengubah data yang ada seperti klip audio ke dalam format data Tensor yang dapat diproses oleh model Anda. Data di Tensor yang Anda teruskan ke model harus memiliki dimensi atau bentuk tertentu yang cocok dengan format data yang digunakan untuk melatih model.

Model YAMNet/pengklasifikasi dan model perintah ucapan khusus yang digunakan dalam contoh kode ini menerima objek data Tensor yang mewakili klip audio saluran tunggal, atau mono, yang direkam pada 16kHz dalam klip 0,975 detik (15600 sampel). Saat menjalankan prediksi pada data audio baru, aplikasi Anda harus mengubah data audio tersebut menjadi objek data Tensor dengan ukuran dan bentuk tersebut. API Audio Pustaka Tugas TensorFlow Lite menangani transformasi data untuk Anda.

Dalam contoh kode kelas AudioClassificationHelper , aplikasi merekam audio langsung dari mikrofon perangkat menggunakan objek Android AudioRecord . Kode ini menggunakan AudioClassifier untuk membangun dan mengonfigurasi objek tersebut guna merekam audio pada tingkat pengambilan sampel yang sesuai untuk model tersebut. Kode ini juga menggunakan AudioClassifier untuk membuat objek TensorAudio guna menyimpan data audio yang diubah. Kemudian objek TensorAudio diteruskan ke model untuk dianalisis.

Untuk menyediakan data audio ke model ML:

  • Gunakan objek AudioClassifier untuk membuat objek TensorAudio dan objek AudioRecord :

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

Jalankan prediksi

Di aplikasi Android, setelah menghubungkan objek AudioRecord dan objek TensorAudio ke objek AudioClassifier, Anda dapat menjalankan model terhadap data tersebut untuk menghasilkan prediksi, atau inferensi . Kode contoh untuk tutorial ini menjalankan prediksi pada klip dari aliran input audio yang direkam langsung pada kecepatan tertentu.

Eksekusi model menghabiskan banyak sumber daya, jadi penting untuk menjalankan prediksi model ML pada thread latar belakang yang terpisah. Contoh aplikasi menggunakan objek [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) untuk mengisolasi pemrosesan model dari fungsi aplikasi lainnya.

Model klasifikasi audio yang mengenali suara dengan awal dan akhir yang jelas, seperti kata, dapat menghasilkan prediksi yang lebih akurat pada aliran audio masuk dengan menganalisis klip audio yang tumpang tindih. Pendekatan ini membantu model menghindari prediksi yang hilang untuk kata-kata yang terpotong di akhir klip. Dalam aplikasi contoh, setiap kali Anda menjalankan prediksi, kode akan mengambil klip terbaru berdurasi 0,975 detik dari buffer rekaman audio dan menganalisisnya. Anda dapat membuat model menganalisis klip audio yang tumpang tindih dengan mengatur nilai interval kumpulan eksekusi thread analisis model ke panjang yang lebih pendek dari panjang klip yang sedang dianalisis. Misalnya, jika model Anda menganalisis klip berdurasi 1 detik dan Anda menyetel intervalnya ke 500 milidetik, model akan menganalisis paruh terakhir klip sebelumnya dan 500 milidetik data audio baru setiap kali, sehingga membuat analisis klip tumpang tindih sebesar 50%.

Untuk mulai menjalankan prediksi pada data audio:

  1. Gunakan metode AudioClassificationHelper.startAudioClassification() untuk memulai perekaman audio untuk model:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. Tetapkan seberapa sering model menghasilkan inferensi dari klip audio dengan mengatur interval kecepatan tetap di objek ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. Objek classifyRunnable pada kode di atas mengeksekusi metode AudioClassificationHelper.classifyAudio() , yang memuat data audio terbaru yang tersedia dari perekam dan melakukan prediksi:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

Hentikan pemrosesan prediksi

Pastikan kode aplikasi Anda berhenti melakukan klasifikasi audio ketika Fragmen atau Aktivitas pemrosesan audio aplikasi Anda kehilangan fokus. Menjalankan model pembelajaran mesin secara terus menerus mempunyai dampak yang signifikan terhadap masa pakai baterai perangkat Android. Gunakan metode onPause() aktivitas atau fragmen Android yang terkait dengan klasifikasi audio untuk menghentikan perekaman audio dan pemrosesan prediksi.

Untuk menghentikan perekaman dan klasifikasi audio:

  • Gunakan metode AudioClassificationHelper.stopAudioClassification() untuk menghentikan perekaman dan eksekusi model, seperti yang ditunjukkan di bawah pada kelas AudioFragment :

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

Menangani keluaran model

Di aplikasi Android, setelah Anda memproses klip audio, model menghasilkan daftar prediksi yang harus ditangani oleh kode aplikasi Anda dengan menjalankan logika bisnis tambahan, menampilkan hasil kepada pengguna, atau mengambil tindakan lainnya. Output dari setiap model TensorFlow Lite bervariasi dalam hal jumlah prediksi yang dihasilkan (satu atau banyak), dan informasi deskriptif untuk setiap prediksi. Dalam kasus model di aplikasi contoh, prediksinya berupa daftar suara atau kata yang dikenali. Objek opsi AudioClassifier yang digunakan dalam contoh kode memungkinkan Anda menyetel jumlah prediksi maksimum dengan metode setMaxResults() , seperti yang ditunjukkan di bagian Inisialisasi model ML .

Untuk mendapatkan hasil prediksi dari model:

  1. Dapatkan hasil metode classify() objek AudioClassifier dan teruskan ke objek pendengar (referensi kode):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. Gunakan fungsi onResult() pendengar untuk menangani keluaran dengan menjalankan logika bisnis atau menampilkan hasilnya kepada pengguna:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

Model yang digunakan dalam contoh ini menghasilkan daftar prediksi dengan label untuk suara atau kata yang diklasifikasikan, dan skor prediksi antara 0 dan 1 sebagai Float yang mewakili keyakinan prediksi, dengan 1 sebagai peringkat keyakinan tertinggi. Secara umum, prediksi dengan skor di bawah 50% (0,5) dianggap tidak meyakinkan. Namun, cara Anda menangani hasil prediksi bernilai rendah terserah Anda dan kebutuhan aplikasi Anda.

Setelah model mengembalikan serangkaian hasil prediksi, aplikasi Anda dapat bertindak berdasarkan prediksi tersebut dengan menyajikan hasilnya kepada pengguna atau mengeksekusi logika tambahan. Dalam kasus kode contoh, aplikasi mencantumkan suara atau kata yang teridentifikasi di antarmuka pengguna aplikasi.

Langkah selanjutnya

Anda dapat menemukan model TensorFlow Lite tambahan untuk pemrosesan audio di TensorFlow Hub dan melalui halaman panduan model terlatih . Untuk informasi selengkapnya tentang penerapan pembelajaran mesin di aplikasi seluler Anda dengan TensorFlow Lite, lihat Panduan Pengembang TensorFlow Lite .