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:
- Clone repositori git menggunakan perintah berikut:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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:
- AudioClassifierHelper.kt - Menginisialisasi pengklasifikasi audio serta menangani pemilihan model dan delegasi.
- RecorderFragment.kt - Membuat antarmuka pengguna dan kode kontrol untuk perekaman audio live.
- LibraryFragment.kt - Membuat antarmuka pengguna dan kode kontrol untuk memilih file audio.
- ProbabilitiesAdapter.kt - Menangani dan memformat hasil prediksi pengklasifikasi.
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.