Pazartesi, Mayıs 14, 2012

Yapay Sinir Ağları ile Ses Tanıma 2


Yazımıza devam ediyoruz.


FFT – Artık frekansa geçme zamanı geldi :)

Pencerelenmiş dizimize şimdi Fourier dönüşümü uygulayarak frekanstaki ifadesini buluyoruz.


Fourier dönüşümünün matematiksel ifadesi yukarıdaki gibidir.  Doğal olarak ifadedeki integral işlemi ayrık işaretler için uygulanamıyor.
Hatırlarsanız biz mikroişlemci ortamında ayrık bir dünyadayız, bu nedenle aynı ifadenin ayrık şekli olan


İfadesi bizim için geçerli.
FFT kodunu kendimizin yazmamıza gerek yok ama araştırmakta tabii ki yarar var.
Yeri gelmişken matematikçilerden kahramanım diyebileceğim üçü, sırayla;  Euler, Gauss ve Fourier ‘in çalışmalarını ve hayatlarını araştırmanızı tavsiye ederim. Gaz açısından : )

FFT işlemi sonucunda elimizde zamandaki işaretin karmaşık sayılarla ifade edilen frekans ve faz bilgileri var. Faz bilgisi ses işaretleri için çok anlamlı olmadığından faz kısmını kullanmıyoruz.
Fener sözcüğündeki F harfini içeren pencerenin frekans düzleminde gösterimi


Fener sözcüğündeki E harfini içeren pencerenin frekans düzlemindeki bileşenleri ise yukarıdaki gibi.

Ses özellikleri spektrumda çok iyi ifade edildiğinden, sonraki aşamada yapılması gereken yukarıdaki gibi verileri gruplayarak ilgili fonemi ifade edebilecek hale getirmek.

FFT işlemi, Fourier dönüşümünün ayrık ve hızlı biçimde yapılabilmesi için geliştirilen özel bir yöntemdir. Bazı kaynaklarda dönüşüm işlemi için DFT (ayrık fourier dönüşümü) geçiyor. Temelde yapılan işlem aynı.

FFT ayrık bir işaret alıp, istenen sayıda ayrık bir işaret oluşturur. FFT sonrası yeterince frekans bilgisine ulaşabilmek için en azından 512 adet sonuç verecek şekilde FFT uygulanmalı.

Yukarıdaki spektrumların oldukça yumuşak geçişlere sahip bir formda olduğunu görebilirsiniz.  Aslında spektrum çok daha karmaşık bir yapıdadır. Yukarıdaki sonuç gürültü giderme ve spektral biçimlendirmeler sonucu ortaya en değerli bilginin çıkarılması sonucunda elde edilmiştir.

Aşağıdaki grafikte mavi eğri asıl spektral bileşenleri gösterirken, yeşil eğri işlem görmüş spektrumu gösterir.
Dikkat ederseniz yatay eksende frekans bileşenleri 5000Hz den sonra alınmamış. Bu deneysel bir çizim ancak gerçek uygulamada da benzer biçimde 8000Hz den sonraki frekans bileşenlerini kullanmadık.
Hani duyulabilen ses aralığı 20KHz’e kadar gidiyordu. Yüksek frekans bileşenlerinin günahı ne?
(konu dışı: 20 KHz i kim duyuyor merak ediyorum, ben 15KHz den fazlasını duyanı görmedim : ))

Bunun asıl sebebi şu;
İnsan sesine ait bileşenlerin çoğu düşük frekanslardadır. Yüksek frekanslardaki bilgiyi işlemek sistem başarımı üzerinde neredeyse hiç etki etmiyor. Yani asıl bilgi 10000Hz altında. Biz 8000 altındaki frekansları kullanarak işlemler yaptık.
Konu dışı sayılabilecek bir bilgi olarak şunu da eklemek isterim;
Yapılan araştırmalar karşıdaki kişinin kim olduğunun tanınması için 3.4Khz ‘e kadar olan bileşenlerin yettiğini göstermiştir. Bu nedenle telefon hatlarımızda 3.4KHz den sonraki bileşenler bant genişliğini daha etkin kullanmak için yok edilir. Ama biz kiminle konuştuğumuzu ve karşıdakinin ne dediğini genelde anlayabiliyoruz.
Sanırım son dönem sabit telefonlar ve GSM sisteminde bu sınır 5KHz olarak uygulanıyor.




Mel Filtreleme

Frekans bileşenlerini gruplayarak ses ile ilgili bir veri elde etmek istiyoruz. Ama bunu nasıl yapmalıyız?
0-1000 arası, 1000-2000 arası……..7000-8000 arası toplanarak 8 adet değer ile sesi ifade edebiliriz.  Ancak yukarıda insan sesinin düşük frekans bileşenlerinin daha değerli olduğunu yazmıştık. Demek ki gruplamayı lineer yapmamamız gerekiyor.
Benzer şekilde kulak da düşük frekanslara daha duyarlı iken yüksek frekanslardaki değişimlere daha az duyarlı.
Örneğin 100 Hz deki bir sesi 200Hz yapınca bu değişikliği fark edebilirken,  10000Hz deki bir sesi 10100 Hz yapınca pek fark edemiyor.
Kulak mı konuşmanın düşük frekanslarının daha değerli olduğunu bilerek bu yönde gelişmiş yoksa gırtlak, ağız, dudak, dil, diş bir konsorsiyum kurup kulak yüksek frekanslara duyarlı değil konuşmayı biz düşük frekanslara daha çok bilgi verecek şekilde yapalım deyip bu yönde mi gelişmişler.  Hayret!

Neyse;
Mel yaklaşımı kulağın frekans tepkisini açıklayan bir kavram. Kesin doğru değil tabii, başka yaklaşımlar da var.



Dikkat ederseniz düşük frekanslar daha doğrusalken yüksek frekanslara doğru gidilirken eğim değişiyor.
Bu grafiği göz önüne alarak 8000Hz e kadar olan bölgeyi parçalara ayırmamız gerekiyor.
Genelde konuşmacı tanıma sistemlerinde 8000Hz e kadar olan bölge oldukça yüksek sayıda parçaya ayrılır. Bizim için yani konuşma tanıma için nispeten az sayıda bileşen yeterli.
Biz spektrumun 8000Hz e kadar olan kısmını 12 parçaya böldük.

Elde ettiğimiz spektrum bileşenlerini bu filtrelere göre grupluyoruz. İşlem sonucunda elimizde çerçevedeki sesi ifade eden 12 adet sayı olmuş oluyor.
...
Devam edecek...

7 yorum:

A. Tahir dedi ki...

Sinyal işleme dersimde simdi hatırladım Arş. Gor. Umut Gündoğdu hocam demişti ders sırasında insan sesini karakterize eden 12 değer yada deişken her ne ise vardır tabi canlıdan canlıya yada ses kaynagına durum değişkenlik gosterebilir.. Ve bu değişkenlerin varoluş noktaları sesi oluşturan havanın akciğerden başlayım ağızdan salınmasına kadar ugradığı gırtlak, ses teli vs.. gibi noktalar oldugunu soylemişti (Adaptif Filtreler) Siz de eğer yanlış anlamadı isem bunu elde ettiniz 12 bolge ile öyle mi?

Adsız dedi ki...

Kulağımız duyma aralığını genelde 24000 - 26000 farklı frekans bileşenine ayırıyor.

Makina tarafında kulağımız kadar hassas işlem yapmak mümkün olmadığından, mfcc yönteminde spektrumu gruplamak zorunda kalıyoruz.(Doğrudan spektrumun kendisini kullanan çalışmalar da çok sayıda mevcut)

Mel ölçeğinde gruplamayı 12 bölgede yapmak iyi sonuç veren bir yaklaşım. Ama 12 rakamı mutlak değildir.

Kısaca ses bilgisinin sadece 12 spektrum bölgesine indirgenmesine tamamen doğru diyemeyiz.

Hocanızın burada demek istediği, işlem yükünü azaltma amacıyla, spektrumun 12 bölgede incelenmesinin iyi karakterizasyon sağladığıdır ki çalışmadaki mfcc yönteminde yapılan da bu yaklaşımdır.

Adsız dedi ki...

fft nin ürettiği kompleks sayıalrı kod içerisinde nasıl işleyebiliyoruz?

Adsız dedi ki...

Merhaba,
FFT dönüşümünü konuşma içeren tüm veriye mi uyguladınız,yoksa pencere büyüklüğündeki veriye mi?

bluekid dedi ki...

about kısmında iletişim bilgileri var ordan ulaşabilirsiniz

1. Adsıza ; FFT den spekturumua geçişi bir araştırın

2. Adsıza ; Yazıları bütünüyle ve sırasıyla okuyun. Yazı serisinin ilkinde "Çerçeveleme - Pencereleme" kısmında bahsediliyor.

Yusuf Dad dedi ki...

iyi akşamlar admin
size bir konu hakkında danışmak istedim
3 kişilik bir grup olarak bitirme projesi yapıyoruz ve bu projemizin konusu ses ile komut edilen robot. işin asıl kısmı bu robot bu 3 kişiden sadece birinin sesi ile hareket edecek. bunun dışında başka biri komut verse veya gürültü olsa robot algılama yapmayacak bana yardımcı olurmusunuz. en azından yol göstermek bağbında kaynak falan
teşekkürler.

bluekid dedi ki...

yazılarda teknikler anlatılıyor ama sizin probleminiz dahada tefarruatlı
Kişi sesinden de ayırd etmesini yapmanız lazım -verification diye geçer -
Sesden önce kişiyi tanıtıp sonra komutu tanıtmanız gerekiyor
önereceğim doğrudan bir kaynak yok malesef.