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:
- 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 mendapatkan petunjuk, lihat Panduan Penyiapan untuk Android.
Komponen utama
File berikut berisi kode penting untuk audio ini contoh aplikasi klasifikasi:
- AudioClassifierHelper.kt - Melakukan inisialisasi pengklasifikasi audio serta menangani model dan mendelegasikan pilihan.
- 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 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 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 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.