Panduan klasifikasi audio untuk Android

Tugas Pengklasifikasi MediaPipe Audio memungkinkan Anda melakukan klasifikasi pada data audio. Anda dapat menggunakan tugas ini untuk mengidentifikasi peristiwa suara dari serangkaian kategori terlatih. Petunjuk ini menunjukkan cara menggunakan Pengklasifikasi Audio dengan aplikasi Android.

Untuk mengetahui informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.

Contoh kode

Kode contoh Tugas MediaPipe adalah implementasi sederhana aplikasi Pengklasifikasi Audio untuk Android. Contoh ini menggunakan mikrofon di perangkat Android fisik untuk secara terus-menerus mengklasifikasikan suara, dan juga dapat menjalankan pengklasifikasi pada file suara yang disimpan di perangkat.

Anda dapat menggunakan aplikasi tersebut sebagai titik awal untuk aplikasi Android Anda sendiri, atau merujuk ke aplikasi tersebut saat memodifikasi aplikasi yang sudah ada. Kode contoh Pengklasifikasi Audio dihosting di GitHub.

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal dari kode contoh menggunakan alat command line git.

Untuk mendownload kode contoh:

  1. Clone repositori git menggunakan perintah berikut:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Secara opsional, konfigurasikan instance git Anda untuk menggunakan checkout sparse, sehingga Anda hanya memiliki file untuk aplikasi contoh Pengklasifikasi Audio:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Setelah membuat versi lokal dari kode contoh, Anda dapat mengimpor project ke Android Studio dan menjalankan aplikasi. Untuk mengetahui petunjuknya, lihat Panduan Penyiapan untuk Android.

Komponen utama

File berikut berisi kode penting untuk aplikasi contoh klasifikasi audio ini:

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode secara khusus untuk menggunakan Pengklasifikasi Audio. Untuk informasi umum tentang menyiapkan lingkungan pengembangan Anda untuk menggunakan tugas MediaPipe, termasuk persyaratan versi platform, lihat Panduan penyiapan untuk Android.

Dependensi

Pengklasifikasi Audio menggunakan library com.google.mediapipe:tasks-audio. Tambahkan dependensi ini ke file build.gradle dari project pengembangan aplikasi Android Anda. Impor dependensi yang diperlukan dengan kode berikut:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-audio:latest.release'
}

Model

Tugas MediaPipe Audio Classifier memerlukan model terlatih yang kompatibel dengan tugas ini. Untuk mengetahui informasi selengkapnya tentang model terlatih yang tersedia untuk Pengklasifikasi Audio, lihat bagian Model ringkasan tugas.

Pilih dan download model, lalu simpan dalam direktori project:

<dev-project-root>/src/main/assets

Gunakan metode BaseOptions.Builder.setModelAssetPath() untuk menentukan jalur yang digunakan oleh model. Metode ini dirujuk dalam contoh kode di bagian berikutnya.

Dalam kode contoh Pengklasifikasi Audio, model ditentukan dalam file AudioClassifierHelper.kt.

Membuat tugas

Anda dapat menggunakan fungsi createFromOptions untuk membuat tugas. Fungsi createFromOptions menerima opsi konfigurasi yang mencakup mode berjalan, lokalitas nama tampilan, jumlah hasil maksimum, nilai minimum keyakinan, dan daftar kategori yang diizinkan atau daftar tolak. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi, lihat Ringkasan Konfigurasi.

Tugas Pengklasifikasi Audio mendukung jenis data input berikut: klip audio dan streaming audio. Anda perlu menentukan mode berjalan yang sesuai dengan jenis data input saat membuat tugas. Pilih tab yang sesuai dengan jenis data input Anda untuk melihat cara membuat tugas dan menjalankan inferensi.

Klip audio

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_CLIPS)
        .setMaxResults(5)
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Streaming audio

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_STREAM)
        .setMaxResults(5)
        .setResultListener(audioClassifierResult -> {
             // Process the classification result here.
        })
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Implementasi kode contoh Pengklasifikasi Audio memungkinkan pengguna beralih antar mode pemrosesan. Pendekatan ini membuat kode pembuatan tugas lebih rumit dan mungkin tidak sesuai untuk kasus penggunaan Anda. Anda dapat melihat kode pengalihan mode dalam fungsi initClassifier() dari AudioClassifierHelper.

Opsi konfigurasi

Tugas ini memiliki opsi konfigurasi berikut untuk aplikasi Android:

Nama Opsi Deskripsi Rentang Nilai Nilai Default
runningMode Menetapkan mode berjalan untuk tugas. Pengklasifikasi Audio memiliki dua mode:

AUDIO_CLIPS: Mode untuk menjalankan tugas audio pada klip audio independen.

AUDIO_STREAM: Mode untuk menjalankan tugas audio pada streaming audio, seperti dari mikrofon. Dalam mode ini, resultListener harus dipanggil untuk menyiapkan pemroses guna menerima hasil klasifikasi secara asinkron.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Menetapkan bahasa label yang akan digunakan untuk nama tampilan yang diberikan dalam metadata model tugas, jika tersedia. Defaultnya adalah en untuk bahasa Inggris. Anda dapat menambahkan label yang dilokalkan ke metadata model kustom menggunakan TensorFlow Lite Metadata Writer API Kode lokal id
maxResults Menetapkan jumlah maksimum opsional hasil klasifikasi dengan skor tertinggi yang akan ditampilkan. Jika < 0, semua hasil yang tersedia akan ditampilkan. Semua bilangan positif -1
scoreThreshold Menetapkan nilai minimum skor prediksi yang menggantikan skor yang diberikan dalam metadata model (jika ada). Hasil di bawah nilai ini ditolak. [0,0, 1,0] Tidak ditetapkan
categoryAllowlist Menetapkan daftar opsional nama kategori yang diizinkan. Jika tidak kosong, hasil klasifikasi yang nama kategorinya tidak ada dalam kumpulan ini akan difilter. Nama kategori duplikat atau tidak diketahui akan diabaikan. Opsi ini sama-sama bersifat eksklusif dengan categoryDenylist dan menggunakan keduanya akan menghasilkan error. String apa pun Tidak ditetapkan
categoryDenylist Menetapkan daftar opsional nama kategori yang tidak diizinkan. Jika tidak kosong, hasil klasifikasi yang nama kategorinya ada dalam kumpulan ini akan difilter. Nama kategori duplikat atau tidak diketahui akan diabaikan. Opsi ini sama-sama bersifat eksklusif dengan categoryAllowlist dan menggunakan keduanya akan menghasilkan error. String apa pun Tidak ditetapkan
resultListener Menetapkan pemroses hasil untuk menerima hasil klasifikasi secara asinkron saat Pengklasifikasi Audio dalam mode streaming audio. Hanya dapat digunakan saat mode lari disetel ke AUDIO_STREAM T/A Tidak ditetapkan
errorListener Menetapkan pemroses error opsional. T/A Tidak ditetapkan

Menyiapkan data

Pengklasifikasi Audio dapat digunakan dengan klip audio dan streaming audio. Tugas ini menangani prapemrosesan input data, termasuk pengambilan ulang sampel, buffering, dan framing. Namun, Anda harus mengonversi data audio input menjadi objek com.google.mediapipe.tasks.components.containers.AudioData sebelum meneruskannya ke tugas Pengklasifikasi Audio.

Klip audio

import com.google.mediapipe.tasks.components.containers.AudioData;

// Load an audio on the user’s device as a float array.

// Convert a float array to a MediaPipe’s AudioData object.
AudioData audioData =
    AudioData.create(
        AudioData.AudioDataFormat.builder()
            .setNumOfChannels(numOfChannels)
            .setSampleRate(sampleRate)
            .build(),
        floatData.length);
audioData.load(floatData);
    

Streaming audio

import android.media.AudioRecord;
import com.google.mediapipe.tasks.components.containers.AudioData;

AudioRecord audioRecord =
    audioClassifier.createAudioRecord(/* numChannels= */ 1, /* sampleRate= */ 16000);
audioRecord.startRecording();

...

// To get a one second clip from the AudioRecord object:
AudioData audioData =
    AudioData.create(
        16000 /*sample counts per second*/);
        AudioData.AudioDataFormat.create(audioRecord.getFormat()),
audioData.load(audioRecord)
    

Menjalankan tugas

Anda dapat memanggil fungsi classify yang sesuai dengan mode lari Anda untuk memicu inferensi. Audio Classifier API menampilkan kemungkinan kategori untuk peristiwa audio yang dikenali dalam data audio input.

Klip audio

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Streaming audio

// Run inference on the audio block. The classifications results will be available
// via the `resultListener` provided in the `AudioClassifierOptions` when
// the audio classifier was created.
audioClassifier.classifyAsync(audioBlock, timestampMs);
    

Perhatikan hal berikut:

  • Saat berjalan dalam mode streaming audio, Anda juga harus memberikan tugas Pengklasifikasi Audio dengan stempel waktu untuk melacak data audio apa dalam aliran yang digunakan untuk inferensi.
  • Saat berjalan dalam model klip audio, tugas Pengklasifikasi Audio akan memblokir thread saat ini hingga selesai memproses audio input. Untuk menghindari pemblokiran respons antarmuka pengguna, jalankan pemrosesan di thread latar belakang.

Anda dapat melihat contoh menjalankan Pengklasifikasi Audio dengan klip audio. Lihat class AudioClassifierHelper dalam contoh kode.

Menangani dan menampilkan hasil

Setelah menjalankan inferensi, tugas Pengklasifikasi Audio akan menampilkan daftar kategori yang memungkinkan untuk peristiwa audio dalam audio input. Daftar berikut menunjukkan contoh data output dari tugas ini:

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

Di aplikasi Android, tugas menampilkan ClassificationResult yang berisi daftar objek AudioClassifierResult, yang merepresentasikan prediksi untuk peristiwa audio, termasuk label kategori dan skor keyakinan.

Klip audio

// In the audio clips mode, the classification results are for the entire audio
// clip. The results are timestamped AudioClassifierResult objects, each
// classifying an interval of the entire audio clip that starts at
// ClassificationResult.timestampMs().get().

for (ClassificationResult result : audioClassifierResult.classificationResults()) {
  // Audio interval start timestamp:
  result.timestampMs().get();
  // Classification result of the audio interval.
  result.classifications();
}
    

Streaming audio

// In the audio stream mode, the classification results list only contains one
// element, representing the classification result of the audio block that
// starts at ClassificationResult.timestampMs in the audio stream.

ClassificationResult result = audioClassifierResult.classificationResults().get(0);
// The audio block start timestamp
audioClassifierResult.timestampMs();
// Alternatively, the same timestamp can be retrieved from
// result.timestampMs().get();

// Classification result.
result.classifications();
    

Anda dapat melihat contoh cara menampilkan hasil klasifikasi yang ditampilkan dari tugas ini di class ProbabilitiesAdapter contoh kode.