Friday, April 19, 2019

Ekstraksi fitur MFCC dan zero paddingnya dengan library LIBROSA

Mel frequency cepstral coefficient, disingkat MFCC, masih merupakan fitur yang paling banyak digunakan pada pemrosesan sinyal wicara, khususnya pengenalan sinyal wicara. Untuk mengekstrak fitur MFCC, salah satu tool yang paling banyak digunakan adalah librosa. Tulisan berikut merupakan paparan singkat untuk mengekstrak fitur MFCC dari set sinyal wicara dalam sebuah direktori.

Instalasi
pip3 install --user librosa

Workflow
Misalkan dalam direktory saat ini (`./`), kita memiliki 30 file wav sinyal wicara. Dari 30 file tersebut, tiap file akan kita ekstrak 20 MFCC per frame/window (dari default librosa). Karena panjang tiap file berbeda, maka bentuk/ukuran variabel MFCC untuk tiap file tersebut berbeda, misalnya: (20, 44), (20, 193) dan (20, 102).  Karena default window size atau hopsize (n_fft) dari librosa adalah 2048 (25ms) dengan 512 hop length /stride (10 ms overlap), maka untuk file suara dengan durasi 2 detik banyaknya frame mffc yang didapat adalah,

output _length = (seconds) * (sample rate) / (hop_length)
output_length = 2 * 22050/512 = 87 --> (20, 87)

Jika panjang file 3 detik maka panjang output_length adalah,

output_length = 3 * 22050/512 = 130 --> (20, 130)

Variabel lebar window and stride untuk memproses MFCC pada librosa bisa dikontrol dengan argumen n_fft dan hop_length. Misal n_fft = int(sr/40), hop_lenghth=int(sr/100) untuk lebar window 25 ms dan hop length (geser ke kanan) sebesar 10 ms. Perhatikan gambar berikut untuk lebih jelasnya, K adalah lebar window (n_fft) dan Q adalah stride atau hop length (disebut juga hop size). Pada beberapa literatur sinyal sistem, variabel pergeseran antar window memakai nilai % overlap yang pada gambar dibawah disimbolkan dengan 0. Jika default hop_length=512 dan n_fft = 2048, maka overlap defaultnya adalah 75%.

Windowing: window length, hop size, and its overlap.


Jadi, by default MFCC yang dihasilkan oleh librosa berbeda ukurannya bergantung pada ukuran file input. Padahal, agar bisa diproses oleh deep learning, kita inginkan panjang semua variabel MFCC tersebut sama, misal (20, 100). Jika kurang kita zero-paddingkan, jika lebih kita potong sampai 100 sample sehingga menjadi (20, 100). Karena input deeplearning berupa (sample, fitur), bentuk (20, 100) kita transpose menjadi (100, 20). Tujuan akhir kita adalah memperoleh bentuk dari variabel fitur berupa (30, 100, 20) yang siap dimasukkan pada arsitektur deep learning.

Berikut caranya:
import os
import librosa

lenmin = 100

mfcc =[]
for i in os.listdir('.'):
    x_i, sr = librosa.load(i, sr=None)
    mfcc_i = librosa.feature.mfcc(x_i, sr)
    if mfcc_i.shape[1] < lenmin:
        mfcc_i = np.hstack((mfcc_i, np.zeros((mfcc_i.shape[0], lenmin-mfcc_i.shape[1]))))
    mfcc_i = mfcc_i[:,:lenmin]
    mfcc.append(mfcc_i.T)

mfcc = np.array(mfcc)
Cek ukuran variable mfcc dengan:
In [1]: np_mfcc.shape
Out[1]: (30, 100, 20)

Mengekstrak Delta dan Delta-delta MFCC
Pada banyak aplikasi pemrosesan sinyal wicara, tidak hanya MFCC yang dipakai sebagai fitur, namun juga perbedaan antar koefisien MFCC (delta) dan perbedaan antar delta MFCC (delta-delta). Librosa menyediakan fungsi untuk mengekstrak kedua fitur tersebut.

Untuk mengekstrak delta MFCC dari MFCC:
delta = librosa.feature.delta(mfcc)

Untuk mengekstrak delta-delta dari MFCC:
deltad = librosa.feature.delta(MFCC, order=2)

Zero padding dengan Tensorflow 

Ada cara yang lebih singkat untuk zero padding, yakni dengan tensorflow. Dengan tensorflow, kita hanya butuh satu perintah (dan satu baris jika memungkinkan). Contoh jika kita mempunyai list MFCC dengan ukuran seperti [(100, 20), (28, 20), (53,20), ...]. Semua MFCC tersebut kita rubah menjadi ukuran (100, 200) dengan cara berikut.

import tensorflow as tf
mfcc_padded = tf.keras.preprocessing.sequence.pad_sequence(mfcc, maxlen=100, dtype=float)
Dimana mfcc_list merupakan list MFCC yang berbeda-beda ukuran dan hasilnya, mfcc_padded, merupakan list MFCC yang kesemuanya berukuran (100, 20) melalui teknik zero padding.
Related Posts Plugin for WordPress, Blogger...