Panduan klasifikasi audio untuk Android

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

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

Contoh kode

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

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

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal dari contoh kode 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 mendapatkan petunjuk, lihat Panduan Penyiapan untuk Android.

Komponen utama

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

Penyiapan

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

Dependensi

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

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

Model

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

Pilih dan download model, lalu simpan dalam direktori project Anda:

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

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

Di kolom kode contoh Pengklasifikasi Audio, model ini ditentukan di class AudioClassifierHelper.kt .

Membuat tugas

Anda dapat menggunakan fungsi createFromOptions untuk membuat tugas. Tujuan Fungsi createFromOptions menerima opsi konfigurasi termasuk menjalankan mode, nama tampilan lokal, jumlah hasil maksimal, ambang batas keyakinan, dan daftar kategori yang diizinkan atau ditolak. Untuk informasi selengkapnya tentang konfigurasi opsi, lihat Ringkasan Konfigurasi.

Tugas Pengklasifikasi Audio mendukung jenis data input berikut: klip audio dan streaming audio. Anda perlu menentukan mode berjalan yang sesuai dengan tipe data input Anda saat membuat tugas. Pilih tab yang sesuai dengan tipe 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);
    

Penerapan 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 peralihan mode dalam fungsi initClassifier() 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 yang akan menerima hasil klasifikasi secara asinkron.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Menyetel bahasa label yang akan digunakan untuk nama tampilan yang diberikan di 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 untuk hasil klasifikasi dengan skor tertinggi ke kembali. Jika < 0, semua hasil yang tersedia akan ditampilkan. Semua angka positif -1
scoreThreshold Menetapkan ambang batas 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 untuk nama kategori yang diizinkan. Jika tidak kosong, hasil klasifikasi yang nama kategorinya tidak ada dalam kumpulan ini akan disaring. Nama kategori duplikat atau yang tidak diketahui akan diabaikan. Opsi ini sama-sama bersifat eksklusif dengan categoryDenylist dan menggunakan keduanya akan menghasilkan {i>error<i}. String apa pun Tidak ditetapkan
categoryDenylist Menetapkan daftar opsional nama kategori yang tidak diizinkan. Jika hasil klasifikasi yang tidak kosong, yang nama kategorinya dalam rangkaian ini akan difilter posisi-posisi ini. Nama kategori duplikat atau yang tidak diketahui akan diabaikan. Opsi ini sama-sama eksklusif dengan categoryAllowlist dan menggunakan keduanya akan menyebabkan error. String apa pun Tidak ditetapkan
resultListener Menyetel pemroses hasil untuk menerima hasil klasifikasi secara asinkron saat Pengklasifikasi Audio berada dalam streaming audio mode. 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 berfungsi dengan klip audio dan streaming audio. Tugas menangani pra-pemrosesan input data, termasuk pengambilan ulang sampel, buffering, dan framing. Namun, Anda harus mengonversi data audio input ke 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 users device as a float array.

// Convert a float array to a MediaPipes 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 kategori yang mungkin 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 menjalankan dalam mode streaming audio, Anda juga harus menyediakan Tugas Pengklasifikasi Audio dengan stempel waktu untuk melacak data audio di dalamnya {i>stream <i}itu digunakan untuk inferensi.
  • Saat dijalankan di model klip audio, tugas Pengklasifikasi Audio memblokir thread saat ini sampai selesai memproses audio input. Untuk menghindari pemblokiran respons antarmuka pengguna, jalankan pemrosesan dalam di thread latar belakang.

Anda dapat melihat contoh menjalankan Pengklasifikasi Audio dengan klip audio. Lihat Class AudioClassifierHelper di contoh kode.

Menangani dan menampilkan hasil

Setelah menjalankan inferensi, tugas Pengklasifikasi Audio akan menampilkan daftar kemungkinan untuk peristiwa audio dalam audio input. Listingan 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 akan menampilkan ClassificationResult yang berisi daftar objek AudioClassifierResult, yang mewakili 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 klasifikasi hasil yang ditampilkan dari tugas ini di class ProbabilitiesAdapter dari contoh kode.