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

Penulis: Dimitre Oliveira

Pembelajaran Mendalam

Menerapkan pembelajaran mendalam untuk mengklasifikasikan sound 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 version sekuensial seperti RNN atau transformator juga berkinerja sangat baik pada bahasa. , dengan sifatnya yang berurutan, tapi bagaimana dengan sound? Apa jenis version dan proses yang digunakan saat kita berurusan dengan info sound?

Dalam artikel ini, Anda akan mempelajari cara mendekati masalah klasifikasi sound 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 information”Perintah Pidato”.

Bentuk gelombang

Kami biasanya memiliki file sound dalam structure”.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 information ini seperti deret waktu biasa (mis. Peramalan harga saham) menggunakan beberapa jenis version RNN, pada kenyataannya, hal ini dapat dilakukan, tetapi karena kami menggunakan sinyal sound, 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 guide ini lebih sederhana kita akan menggunakan dataset”Perintah Ucapan”, dataset ini memiliki klip sound satu detik dengan kata-kata yang diucapkan seperti:”down”,”move”,”abandoned”,”no”,”right”,” prevent”,” upward”dan” yes”.

Pemrosesan sound dengan Tensorflow

Sekarang setelah kita memiliki ide tentang bagaimana kita memproses data sound untuk digunakan dengan version 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 sound sederhana

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

Memuat info

Def load_dataset (nama document ):
dataset = tf.data.Dataset.from_tensor_slices (nama document )
mengembalikan dataset

Fungsi load_dataset akan bertanggung jawab untuk memuat document .wav dan mengubahnya menjadi put data Tensorflow.

Mengekstrak bentuk gelombang dan tag

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

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

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

“information / mini_speech_commands / upward / 50f55535_nohash_0.wav”

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

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

Mengubah bentuk gelombang menjadi spektrogram

Langkah selanjutnya adalah mengubah document bentuk gelombang menjadi spektogram, untungnya Tensorflow memiliki fungsi yang dapat melakukannya, tf.signal.stft menerapkan short-time Fourier transform (STFT) untuk mengubah sound 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 movie 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( tag ):
spektrogram = get_spectrogram (bentuk gelombang)
spektrogram = tf.expand_dims (spektrogram, sumbu = -1)
kembali spektrogram, tag

Ubah spektogram menjadi gambar RGB

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

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

Menggabungkan semuanya

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

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 document sebagai enter 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 = enter,
include_top = False, respectively
bobot =’imagenet’)

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

version = Model (masukan = masukan, keluaran = keluaran)

version 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 put information kecil, EfficientNetB0 mungkin merupakan baseline yang baik, ia memiliki akurasi yang layak bahkan menjadi version yang cepat dan ringan.

Latihan

Version = model_fn ((None, None, CHANNELS), N_CLASSES) model.compile (optimizer = 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 version 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 document sound, meskipun ini bukan satu-satunya cara Anda dapat melakukannya, ini adalah salah satu opsi terbaik terkait trade-off kemudahan / kinerja. Jika Anda akan memodelkan sound, Anda mungkin ingin juga mempertimbangkan pendekatan lain yang menjanjikan seperti transformer.

Sebagai langkah prapemrosesan tambahan, Anda dapat memotong atau memadatkan bentuk gelombang, ini mungkin 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 kode tentang caranya. untuk melakukannya di bagian referensi di bawah ini.

Referensi
– Pengenalan sound 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 Moderate, di mana orang-orang melanjutkan percakapan dengan menyorot dan menanggapi cerita ini.

Diterbitkan melalui Towards AI

Leave a Reply