Pengantar Lembut tentang Klasifikasi Audio dengan Tensorflow – Menuju AI – Teknologi, Sains, dan Teknik Terbaik

Penulis: Dimitre Oliveira

Pembelajaran Mendalam

Menerapkan pembelajaran mendalam untuk mengklasifikasikan audio dengan Tensorflow

Sumber: https://www.tensorflow.org/tutorials/audio/simple_audio

Kami telah melihat banyak kemajuan baru-baru ini dalam pembelajaran mendalam yang terkait dengan bidang visi dan bahasa, sangat intuitif untuk memahami mengapa CNN berkinerja sangat baik pada gambar, dengan korelasi lokal piksel, dan bagaimana model sekuensial seperti RNN atau transformator juga berkinerja sangat baik pada bahasa. , dengan sifatnya yang berurutan, tapi bagaimana dengan audio? Apa jenis model dan proses yang digunakan saat kita berurusan dengan data audio?

Dalam artikel ini, Anda akan mempelajari cara mendekati masalah klasifikasi audio sederhana, Anda akan mempelajari beberapa metode umum dan efisien yang digunakan, dan kode Tensorflow untuk melakukannya.

Penafian: Kode yang disajikan di sini didasarkan pada pekerjaan saya yang dikembangkan untuk kompetisi Kaggle “Deteksi Audio Spesies Koneksi Hutan Hujan”, tetapi untuk tujuan demonstrasi, saya akan menggunakan kumpulan data “Perintah Pidato”.

Bentuk gelombang

Kami biasanya memiliki file audio dalam format “.wav”, mereka biasanya disebut sebagai bentuk gelombang, bentuk gelombang adalah rangkaian waktu dengan amplitudo sinyal pada setiap waktu tertentu, jika kita memvisualisasikan salah satu sampel bentuk gelombang tersebut, kita akan mendapatkan sesuatu seperti ini :

sumbu x adalah waktu dan sumbu y adalah amplitudo sinyal yang dinormalisasi

Secara intuitif, seseorang dapat mempertimbangkan untuk memodelkan data ini seperti deret waktu biasa (mis. Peramalan harga saham) menggunakan beberapa jenis model RNN, pada kenyataannya, hal ini dapat dilakukan, tetapi karena kami menggunakan sinyal audio, pilihan yang lebih tepat adalah mengubah bentuk gelombang sampel ke dalam spektogram.

Spektogram

Spektogram adalah representasi gambar dari sinyal bentuk gelombang, ini menunjukkan rentang intensitas frekuensinya dari waktu ke waktu, ini bisa sangat berguna ketika kita ingin mengevaluasi distribusi frekuensi sinyal dari waktu ke waktu. Di bawah ini adalah representasi spektogram dari gambar bentuk gelombang yang kita lihat di atas.

sumbu x adalah waktu sampel dan sumbu y adalah frekuensi

Kasus penggunaan Perintah Ucapan

Untuk membuat tutorial ini lebih sederhana kita akan menggunakan dataset “Perintah Ucapan”, dataset ini memiliki klip audio satu detik dengan kata-kata yang diucapkan seperti: “down”, “go”, “left”, “no”, “right”, ” stop ”,“ up ”dan“ yes ”.

Pemrosesan audio dengan Tensorflow

Sekarang setelah kita memiliki ide tentang bagaimana kita memproses data audio untuk digunakan dengan model pembelajaran yang mendalam, kita dapat melanjutkan untuk melihat implementasi kode untuk melakukannya, pipeline kita akan mengikuti alur kerja sederhana yang dijelaskan oleh diagram di bawah ini:

Diagram pemrosesan audio sederhana

Perhatikan bahwa dalam kasus penggunaan kami pada langkah pertama, data dimuat langsung dari file “.wav”, dan langkah ketiga adalah opsional karena file audio masing-masing hanya memiliki satu detik, dalam beberapa kasus memotong audio mungkin merupakan ide yang bagus untuk file yang lebih panjang dan juga untuk menjaga panjang tetap di semua sampel.

Memuat data

def load_dataset (nama file):
dataset = tf.data.Dataset.from_tensor_slices (nama file)
mengembalikan dataset

Fungsi load_dataset akan bertanggung jawab untuk memuat file .wav dan mengubahnya menjadi set data Tensorflow.

Mengekstrak bentuk gelombang dan label

commands = np.array (tf.io.gfile.listdir (str (data_dir)))
perintah = perintah[commands != ‘README.md’]
def decode_audio (audio_binary):
audio, _ = tf.audio.decode_wav (audio_binary)
return tf.squeeze (audio, axis = -1) def get_label (nama file):
label = tf.strings.split (nama file, os.path.sep)[-2]
label = tf.argmax (label == perintah)
kembalikan label def get_waveform_and_label (nama file):
label = get_label (namafile)
audio_binary = tf.io.read_file (namafile)
waveform = decode_audio (audio_binary)
bentuk gelombang kembali, label

Setelah memuat file .wav kita perlu mendekodekannya, ini dapat dilakukan menggunakan fungsi tf.audio.decode_wav, ini akan mengubah file .wav menjadi tensor float. Selanjutnya, kita perlu mengekstrak label dari file, dalam kasus penggunaan khusus ini kita bisa mendapatkan label dari jalur file masing-masing sampel, setelah itu kita hanya perlu mengenkodekannya satu kali.

Berikut ini contohnya:
Pertama, kami mendapatkan jalur file seperti ini:

“data / mini_speech_commands / up / 50f55535_nohash_0.wav”

Kemudian kita mengekstrak teks setelah “/” kedua, dalam hal ini, labelnya NAIK, akhirnya, kita menggunakan daftar perintah untuk menyandikan label satu-panas.

Perintah: [‘up’ ‘down’ ‘go’ ‘stop’ ‘left’ ‘no’ ‘yes’ ‘right’]
Label = ‘up’ Setelah encoding one-hot: Label = [1, 0, 0, 0, 0, 0, 0, 0]

Mengubah bentuk gelombang menjadi spektrogram

Langkah selanjutnya adalah mengubah file bentuk gelombang menjadi spektogram, untungnya Tensorflow memiliki fungsi yang dapat melakukannya, tf.signal.stft menerapkan short-time Fourier transform (STFT) untuk mengubah audio menjadi domain frekuensi waktu, lalu kita terapkan operator tf.abs untuk menghapus fase sinyal, dan hanya menyimpan besarnya. Perhatikan bahwa fungsi tf.signal.stft memiliki beberapa parameter seperti frame_length dan frame_step, mereka akan mempengaruhi spektogram yang dihasilkan, saya tidak akan menjelaskan secara rinci tentang cara menyetelnya tetapi Anda dapat merujuk ke video ini untuk mempelajari lebih lanjut.

def get_spectrogram (bentuk gelombang, padding = False, min_padding = 48000):
bentuk gelombang = tf.cast (bentuk gelombang, tf.float32)
spektrogram = tf.signal.stft (bentuk gelombang, frame_length = 2048, frame_step = 512, fft_length = 2048)
spektrogram = tf.abs (spektrogram)
kembalikan spektogram def get_spectrogram_tf (bentuk gelombang, label):
spektrogram = get_spectrogram (bentuk gelombang)
spektrogram = tf.expand_dims (spektrogram, sumbu = -1)
kembali spektrogram, label

Ubah spektogram menjadi gambar RGB

Langkah terakhir adalah mengubah spektogram menjadi gambar RGB, langkah ini opsional, tetapi di sini kita akan menggunakan model yang sudah dilatih sebelumnya pada dataset ImageNet, dan model ini membutuhkan gambar input dengan 3 saluran, jika tidak, Anda dapat menyimpan spektrogram dengan hanya satu saluran.

def prepared_sample (spektrogram, label):
spektrogram = tf.image.resize (spektrogram, [HEIGHT, WIDTH])
spektrogram = tf.image.grayscale_to_rgb (spektrogram)
kembali spektrogram, label

Menggabungkan semuanya

TINGGI, LEBAR = 128, 128
AUTO = tf.data.AUTOTUNE def get_dataset (nama file, batch_size = 32):
dataset = load_dataset (nama file)

dataset = files_ds.map (get_waveform_and_label, num_parallel_calls = AUTO)
dataset = dataset.map (get_spectrogram_tf, num_parallel_calls = AUTO)
dataset = dataset.map (prepared_sample, num_parallel_calls = AUTO)

dataset = dataset.shuffle (256)
dataset = dataset.repeat ()
dataset = dataset.batch (batch_size)
dataset = dataset.prefetch (AUTO)
mengembalikan dataset

Menyatukan semuanya kita memiliki fungsi get_dataset yang mengambil nama file sebagai input dan setelah melalui semua langkah yang dijelaskan di atas, mengembalikan dataset Tensorflow dengan gambar spektogram RGB dan labelnya.

Model

def model_fn (bentuk_input, N_CLASSES):
input = L. Input (bentuk = bentuk_input, nama = ‘input_audio’)
base_model = efn.EfficientNetB0 (input_tensor = input,
include_top = False,
bobot = ‘imagenet’)

x = L.GlobalAveragePooling2D () (base_model.output)
x = L. Dropout (.5) (x)
output = L. Dense (N_CLASSES, activation = ‘softmax’, name = ‘output’) (x)

model = Model (masukan = masukan, keluaran = keluaran)

model pengembalian

Model kami akan memiliki tulang punggung EfficientNetB0, dan di puncaknya, kami telah menambahkan GlobalAveragePooling2D diikuti oleh Dropout, dengan lapisan Dense akhir yang akan melakukan klasifikasi kelas jamak yang sebenarnya.

Dengan set data kecil, EfficientNetB0 mungkin merupakan baseline yang baik, ia memiliki akurasi yang layak bahkan menjadi model yang cepat dan ringan.

Latihan

model = model_fn ((Tidak Ada, Tidak Ada, CHANNELS), N_CLASSES) model.compile (pengoptimal = tf.optimizers.Adam (),
kerugian = kerugian.CategoricalCrossentropy (),
metrik =[metrics.CategoricalAccuracy()])

model.fit (x = get_dataset (FILENAMES),
steps_per_epoch = 100,
zaman = 10)

Kode pelatihan sangat standar untuk model Keras, jadi Anda mungkin tidak akan menemukan sesuatu yang baru di sini.

Kesimpulan

Sekarang Anda harus memiliki pemahaman yang lebih jelas tentang alur kerja untuk menerapkan pembelajaran mendalam ke file audio, meskipun ini bukan satu-satunya cara Anda dapat melakukannya, ini adalah salah satu opsi terbaik terkait trade-off kemudahan / kinerja. Jika Anda akan memodelkan audio, Anda mungkin ingin juga mempertimbangkan pendekatan lain yang menjanjikan seperti transformer.

Sebagai langkah prapemrosesan tambahan, Anda dapat memotong atau memadatkan bentuk gelombang, ini mungkin merupakan ide yang baik dalam kasus di mana sampel Anda memiliki panjang yang berbeda atau jika sampel terlalu panjang dan Anda hanya memerlukan bagian yang lebih kecil darinya, Anda dapat menemukan kodenya tentang caranya. untuk melakukannya di bagian referensi di bawah ini.

Referensi
– Pengenalan audio sederhana: Mengenali kata kunci
– Pemula Tensorflow klasifikasi Rainforest-Audio
– TF Klasifikasi Hutan Hujan-Audio Ditingkatkan

Pengantar Lembut untuk Klasifikasi Audio Dengan Tensorflow awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyorot dan menanggapi cerita ini.

Diterbitkan melalui Towards AI