Saya telah membaca sedikit demi sedikit secara online tetapi saya tidak bisa menyatukan semuanya. Saya memiliki beberapa latar belakang pengetahuan tentang sinyal / hal-hal DSP yang harus cukup prasyarat untuk ini. Saya tertarik akhirnya coding algoritma ini di Jawa tapi saya belum memahaminya sepenuhnya karena itulah saya di sini (itu dihitung sebagai matematika, kan?).
Begini menurut saya cara kerjanya seiring dengan kesenjangan dalam pengetahuan saya.
Mulailah dengan sampel pidato audio Anda, ucapkan file .wav, yang dapat Anda baca menjadi sebuah array. Sebut array ini , di mana berkisar dari (jadi sampel). Nilai sesuai dengan intensitas audio yang saya kira - amplitudo.
Pisahkan sinyal audio menjadi "bingkai" berbeda 10ms atau lebih di mana Anda menganggap sinyal ucapan "diam". Ini adalah bentuk kuantisasi. Jadi jika laju sampel Anda adalah 44.1KHz, 10ms sama dengan 441 sampel, atau nilai .
Lakukan transformasi Fourier (FFT demi komputasi). Sekarang apakah ini dilakukan pada seluruh sinyal atau pada setiap frame ? Saya pikir ada perbedaan karena secara umum transformasi Fourier melihat semua elemen sinyal, jadi bergabung dengan bergabung dengan di mana adalah frame yang lebih kecil. Ngomong-ngomong, katakanlah kita melakukan beberapa FFT dan berakhir dengan untuk sisa ini.
Pemetaan ke skala Mel, dan logging. Saya tahu cara mengubah angka frekuensi reguler ke skala Mel. Untuk setiap dari ( "x-axis" jika Anda akan mengizinkan saya), Anda dapat melakukan rumus di sini: http://en.wikipedia.org/wiki/Mel_scale . Tetapi bagaimana dengan "nilai-y" atau amplitudo ? Apakah mereka hanya tetap nilai yang sama tetapi bergeser ke tempat yang sesuai pada sumbu Mel (x-) yang baru? Saya melihat di beberapa kertas ada sesuatu tentang logging nilai aktual karena jika mana salah satu sinyal tersebut dianggap sebagai noise yang tidak Anda inginkan , operasi log pada persamaan ini mengubah noise multiplikatif menjadi noise tambahan, yang diharapkan dapat disaring (?).
Sekarang langkah terakhir adalah mengambil DCT Anda yang telah dimodifikasi dari atas (namun akhirnya diubah). Kemudian Anda mengambil amplitudo dari hasil akhir ini dan itu adalah MFCC Anda. Saya membaca sesuatu tentang membuang nilai frekuensi tinggi.
Jadi saya mencoba untuk benar-benar memahami cara menghitung orang-orang ini langkah demi langkah, dan jelas ada beberapa hal yang menghindarkan saya dari atas.
Juga, saya pernah mendengar tentang menggunakan "bank filter" (array band pass filter pada dasarnya) dan tidak tahu apakah ini mengacu pada pembuatan frame dari sinyal asli, atau mungkin Anda membuat frame setelah FFT?
Terakhir, ada sesuatu yang saya lihat tentang MFCC yang memiliki 13 koefisien?
sumber
Jawaban:
Selangkah demi selangkah...
1. & 2 . Ini benar. Perhatikan bahwa frame biasanya tumpang tindih, misalnya, frame 0 adalah sampel 0 hingga 440; bingkai 1 adalah sampel 220 hingga 660; bingkai 2 adalah sampel 440 hingga 880 dan seterusnya ... Perhatikan juga bahwa fungsi jendela diterapkan pada sampel dalam bingkai.
3 . Transformasi Fourier dilakukan untuk setiap frame. Motivasi di balik ini sederhana: sinyal wicara bervariasi dari waktu ke waktu, tetapi diam di atas segmen pendek. Anda ingin menganalisis setiap segmen pendek secara individual - karena pada segmen ini sinyalnya cukup sederhana untuk dijelaskan secara efisien oleh beberapa koefisien. Pikirkan seseorang yang mengatakan "halo". Anda tidak ingin melihat semua fonem diciutkan menjadi satu spektrum tunggal (FFT menciutkan informasi temporal) dengan menganalisis semua suara sekaligus. Anda ingin melihat "hhhhheeeeeeeeeeooooooooooo" untuk mengenali kata tahap demi tahap, sehingga harus dipecah menjadi segmen pendek.
4 . "Memetakan ke skala Mel" menyesatkan dan mungkin itulah sebabnya Anda bingung. Deskripsi yang lebih baik untuk langkah ini adalah: "Hitung energi sinyal melalui setumpuk filter yang disetel ke frekuensi skala mel". Inilah cara melakukannya. Kami menganggap frekuensi (nilai yang umum digunakan adalah ) dengan jarak yang sama sesuai dengan skala mel, antara 20 Hz (bagian bawah rentang pendengaran) dan frekuensi Nyquist. Contoh praktis: Sinyal dicicipi pada 8kHz dan kami ingin 40 nampan. Karena 4kHz (Nyquist) adalah 2250 mel, frekuensi pusat filterbank adalah: 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel.N N=40
Setelah frekuensi ini ditetapkan, kami menghitung jumlah bobot FFT (atau energi) tertimbang di sekitar masing-masing frekuensi ini.
Lihatlah gambar berikut, mewakili bank filter dengan 12 nampan:
Tempat sampah ke-8 memiliki frekuensi pusat sekitar 2kHz. Energi di tempat sampah ke-8 diperoleh dengan menjumlahkan energi FFT tertimbang di kisaran 1600 hingga 2800 Hz - dengan berat memuncak sekitar 2kHz.
Catatan Implementasi: Kumpulan jumlah tertimbang ini dapat dilakukan dalam satu operasi - penggandaan matriks dari "filterbank matrix" oleh vektor energi FFT.
Jadi pada tahap ini kita telah "meringkas" spektrum FFT menjadi satu set nilai energi 40 (12 dalam ilustrasi), masing-masing sesuai dengan rentang frekuensi yang berbeda. Kami mengambil log dari nilai-nilai ini.
5 . Langkah selanjutnya adalah mengambil DCT dari urutan 40 log-energi ini. Ini akan menghasilkan 40 nilai. Koefisien pertama adalah MFCC (Biasanya, ). Sebenarnya, koefisien DCT pertama adalah jumlah dari semua energi log yang dihitung pada langkah sebelumnya - jadi ini adalah ukuran keseluruhan dari kenyaringan sinyal dan tidak terlalu informatif mengenai kandungan spektral sinyal yang sebenarnya - sering dibuang. untuk aplikasi pengenalan suara atau pengeras suara di mana sistem harus kuat terhadap variasi kenyaringan.K K=13
sumber
39 mel
langkah 4?