Cuma, Mayıs 04, 2012

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

,
Geçen seneki Kasım ayındaki yazımızda
 Eğer "o kadar yazını okuduk, bizim de üzerimizde borç var bizde bir ucundan destek olalım"  deyip bir şeyler karalarsanız bizde burdan yayınlamaya çalışırız.
 diye bir duyruda bulunmuştuk . Bu Duyrumuza İstanbuldan Şubat ayında bir cevap geldi. Firmalarında yaz stajına gelen öğrencilerle beraber yaptırdıkları bir projeyi anlatmak istiyorlardı.
Yazı yanınlanmak üzre geldi ama, öncelikle yazılım atölyesinde sunum yapılması tercih edildiğinden, yayınlanması bu zamana kadar tehir edildi.
Şimdi bu yazıyı yayınlamaya başlıyoruz ve sizlerden de yenilerini bekliyoruz...

Yapay Sinir Ağları ile Ses Tanıma
Ses Tanıma genel olarak  üç aşamadan oluşuyor.
1) Ön işleme
2) Öznitelik Çıkarma
3) Tanıma ( YSA, başka Yapay Zeka yada Makine Öğrenmesi (Machine Learning) ile)
Deneysel olarak yaptığımız çalışmada biz, RASTA-PLP, MFCC ve LP yöntemlerini gerçekleştirdik. Bu yazıda akustik vektörlerin MFCC (mel frequency cepstral coefficients) yöntemiyle oluşturulması anlatılıyor.

Önbilgi
  • Dünyanın en başarılı konuşma tanıma sistemi bizler olduğumuzdan, birçok yöntem kulak, gırtlak, dudak, dil, dişi beyin vs gibi organlarımızın özellikleri incelenerek ve taklit edilerek gerçekleştirilmiştir.
  • Konu çok uzun ve detaylı olduğundan bu yazı daha çok bizim izlediğimiz yöntemlere yüzeysel bir bakış olarak düzenlendi. Birçok adım tek başına ayrı bir araştırma konusu olabilecek nitelikte ve derin matematiksel temellere oturan bir yapıda olduğundan pek detaylandırılmadı. Detaylar için konu ile ilgilenen arkadaşlara kapılar her zaman açık.
  • Yapılan çalışma literatürde Ayrık Sözcük Tanıma (isolated word recognition) olarak geçiyor. Nispeten daha kolay bir yöntem olduğundan başlangıç çalışmaları için bu yöntemi seçtik.
  • Konuşma olarak nitelenen kavram aslında küçük ses parçalarının bir araya gelmesi ile oluşur. Bu ses parçalarını ses telleri, ağız boşluğu, dil, diş ve dudak gibi organlarımızı kullanılarak oluşturuyoruz.
  • Ses işareti mikrofondan analog bir elektrik sinyali olarak çıkar. Bunu mikroişlemcinin anlaması için sayısal olarak ifade edilmesi gerekiyor. Dönüştürme işlemi analog işaret örneklenerek yapılıyor.
  •  Genelde işaret işleme uygulamalarında farklı düzlemlerde çalışmak yeni yetenekler kazandırdığından, başarılı uygulamalar için mecburen düzlem dönüşümleri kullanmak durumunda kalıyoruz. Fourier transform, Z-transform gibi iki örnek sayısal işaret işlemede sık kullanılan ikisi olarak gösterilebilir.
  • Ses işaretinin Fourier dönüşümü ile frekans düzlemindeki ifadesi o sesin spektrumu olarak adlandırılır ve sesin frekans bileşenlerini gösterir.
  • Buradaki işlem adımları için hazır kodlar bulunabilir belki, ama biz tümünü arkadaşlarla beraber yazdık ki staj bir işe yarasın. Yaklaşımımız bu yönde.
Kısa bir önbilgi sonrası basit bir ses tanıma sistemini adım adım gerçekleştirelim;

 Sesin Kaydedilmesi


Yukarıda fener sözcüğünün seslendirilmesi sonucu oluşan işaretin zamana bağlı fonksiyon grafiğini
görebilirsiniz. E harfinin yüksek enerjili ve daha düşük frekanslı olduğu açıkça görülüyor.

  DC Bileşenin Temizlenmesi

Ses kaydedilirken işaret üzerinde donanımsal vs gibi sebeplerden bir DC (doğru akım) değer olabilir.
DC bileşeni ses işaretine + veya – bir ofset ekleyerek işaretin formunu değiştirir. Birebir aynı işaret
dahi olsa DC bileşenleri farklıysa tanıma olumsuz etkilenebiliyor. Bu nedenle ilk aşamada işaretten DC bileşenin temizlenmesi gerekiyor..


Önvurgu Filtresi

Ses işareti ağzımızdan çıkarken daha çok dudaklardan dolayı yüksek frekans bileşenleri bir miktar zayıflar. Bu etki yüksek frekansların birinci derecenden basit bir FIR filtre ile önvurgu işleminden geçirilmesi ile giderilebiliyor. Aşağıda filtrenin Z düzlemindeki ifadesini bulabilirsiniz.
H(z)=1 – a * z-1
Buradaki a katsayısı genelde 0.95 ve 1 arasında seçilir.(a değeri filtrenin kesim frekansını değiştiriyor) Bizim uygulamamızda seçtiğimiz rakam 0.97 oldu. Z düzlemindeki ifadenin programatik şeklini basitçe her örnekten kendinden önceki örneğin a katını çıkarmak olarak düşünebilirsiniz.
w[i] = w[i] – a * w[i -1]

  
Aynı işaretin önvurgu sonrası hali.

 

Konuşma Tespiti ( voice activty detection)


VAD olarak kısaltılan (bu yazıda KT olarak ifade edilecek) konuşmanın başladığı ve bittiği yerlerin doğru tespiti konuşma tanımada hayati önem taşır. Başarılı bir tespit sistemi tasarlayabilmek başlı başına zor bir uygulamadır. Bazı temel zorlukları şöyle sayabilirim;
Gürültülü ortamlarda yapılan kayıtlarda, düşük enerjili ve yüksek frekanslı harfler.
F, S gibi sessizlerle başlayan sözcükler. N, M gibi burun veya dudak sessizleri ile biten sözcükler. P gibi patlamalı seslerle başlayan veya biten sözcükler.
Sözcük söylendikten hemen sonra veya söylenmeden hemen önce nefes alıp verme olan durumlar.
Biz KT için işaretin enerji seviyeleri ve oto-korelâsyonunu kullanan basit bir karma sistem uyguladık.

Gürültü Giderme

Gürültü giderme işlemi de genellikle KT öncesi ve sonrasında birçok aşamada yapılır. Bizim uyguladığımız yöntem;
  • KT öncesi çıtırtı,tıkırtı gibi sesleri gidermek. 
  • Konuşmayı tespit ettikten sonra muhtemel konuşma dışı bölgelerin spektrumunu kullanarak konuşmaya ait spektrumda iyileştirmeler yapmak. 
  • Konuşmaya ait spektrum üzerinde filtreleme ve polynomial regression işlemleri ile düzenlemeler  yapmak şeklinde.

Çerçeveleme - Pencereleme

Sözcüklere ait öznitelik vektörlerinin çıkarımı için en başarılı yöntem, konuşmayı oluşturan temel sesler mertebesinde inceleme yapmaktır.
Gırtlak ve ses yolu üzerine yapılan araştırmalar, konuşmayı oluşturan her bir temel sesin 15ms – 25ms periyodunda seslendirildiğini ortaya koymuştur.
Bu bilgi ışığında şimdiki aşamada elimizdeki ses sinyalini yaklaşık 20ms uzunluğunda çerçevelere böldük.
Her bir çerçeveyi 10ms kaydırarak işlemi gerçekleştirdik ki geçişlerde herhangi bir foneme ait bilgiyi kaybetmeyelim.
 
Çerçeveleme ortaya spectral leakage adı verilen bir problemi de beraberinde getiriyor. SL problemini aşmak içinde pencereleme adı verilen bir yöntem uyguladık.




 
Pencereleme için en çok yukarıda görülen hamming filtresi kullanılıyor ancak biz uygulamamızda aşağıdaki Hamming-Cosine penceresini tercih ettik

 
Çerçeveleme ve pencereleme ardından ses işaretine ait bir bölümü aşağıda görebilirsiniz. Grafikte fener sözcüğünün başlangıcındaki f sesinin başlangıcına ait bileşenleri görmekteyiz.

 
Hamming filtresi sonucu işaretin her bir çerçevesindeki değişikliğe dikkat ediniz.

Hiç yorum yok: