Web Browser’a Speech Recognition ile Sesli Komut Bölüm1

Selamlar;

Bu makalemizde speech recognition üzerine çok güzel bir proje yazacağız. Eminim sizde benim kadar memnun kalacaksınız.

Öncelikle speech recognition’ı tanımlayalım. İlgili yazılımın bulunduğu makinaya mikrofon ile gelen insan sesini tanımlamak ve anlamlı komutlara çevirmek için kullanılan teknolojidir. Bunun için çeşitli ses algoritmaları yani ses dalgasındaki frekans uyumu ile söylenen kelime algılanıp önceden tanımlanmış ses kütüphanesideki kelimeler ile karşılaştırılır ve belli bir yüzde oranında benzer olan seçilir. Böylece söylenen kelime tanımlanmış olur. Bu işlem için mutlaka kişiselleştirme yapılması gerekmektedir. Kişiselleştirmeden amaç kişinin telaffuz ve fonetik değerlerinin uygulamaya tanıtılması böylece uygulamanın söyleneni anlama ve text’e dönüştürme, hataları düzeltme gibi özellikler için gerekli parametreleri tanımlamasıdır. Aslında arkada kişnin belli textlerdeki ses frekans dalgaları kaydedilmekte ve bu veriden yola çıkılarak söylenen analog ses digital formata çevrilmektedir. Herşey kıyaslamaktan başka birşey değildir. Kişinin speech sırasında kulandığı ekipmanlar ve çevredeki gürültü gibi çeşitli etkenler verimlilik açısından çok önemli faktörlerdir.

speech-recognition-process

Image Source: http://www.turksan.com/images/ses/ses-tanima-islem-basamaklari.jpg

Bir windows application yazacağız. Amacımız bir web browser’ı sesli komut ile açmak. Yine sesli komutlar ile söylenen linkleri tıklamak; scroll’u ve mouse’u istediğimiz yöne hareket ettirmek ve tıklamak, borwser’da ileri, geri, minimize, maximize gibi eventler yapmaktır. Bunu yanında anlık saat, o günkü hava durumu ve haftanın filimleri gibi birkaç eğlenceli soruya cevap verecek bir modül yazacağız. İlerleyen kısımlarda paint açtırıp resim çizdireceğiz. Maillerimize ve banka hesabımıza bakabileceğimiz modüller yazacağız. Kısacası speech recognition ile sınırları zorluyacağız:)

speech

İsterseniz öncelikle bu karmaşık projeye başlamadan önce herşeyin temeli olarak bir lambayı windows applicationla sanal ortamda  yakıp söndüren basit bir uygulama yazalım. Öncelikle yukarıda görüldüğü gibi System.Speech.dll’in referancelara eklenmesi gerekir. Bir de gerek olmasa da projede com component kullanılması tercih edildiği için Interop.SpeechLib.dll ‘in referance edilmesi gerekir. Amaç makinanın konuşması üzerine istenen değişikliklerin daha geniş bir yelpazede yapılabilmesidir.

control

 

control2

control3

Makinanızda  speech recognition’ın düzgün çalışması için yukarıda görüldüğü gibi kişiselleştirme yapmanız gerekmektedir.  Bunun için çıkarılan yazıların sesli okunması gerekir.

Not: Ayrıca işlemtim sisteminizin ingilizce olması gerekmektedir.

Öncelikle ses işlemleri için gerekli olan referanslar aşşağıdaki gibi eklenir.

using System.Speech.Recognition;
using System.Threading;

Aşağıda görüldüğü gibi Load zamanında LoadGrammer()methodu çağrılmıştır. Speech Recognition’da en başta da bahsettiğim gibi Library’nin tanıtılması gerekmektedir. Amaç voice command den sonra benzer sesler bu library içerisinde aranacaktır. İşte bu tanımlamanın yapıldığı yer LoadGrammer()’dır.

  • Choices bu tanımlanacak kelimelerin tutulduğu özel bir string dizidir.
  • GrammerBuilder: Tanımlanan kelimelerin tutlduğu Culter property’si ile dil seçeğini belirlendiği nesnedir.
  • Grammer: Constructer’da GrammerBuilder bekleyen SpeechRecognitionEngine’e eklenen nesnedir.
  • SpeechRecognitionEngine: Esas ses tanıma işleminin yapıldığı nesnedir.

Voice command’den sonra bakılacak library tanımlandığına göre ilgili eventleri aşağıda görüldüğü gibi bağlayalım. StartRecognition() methodun da

  • SpeechDetected eventi ses tanınma işlemi sırasında çağrılır. Örnek olarak kullanıcı bilgilendirilebilir.

  •  SpeechRecognitionRejected  eventin de aranan kelime ilgili library’de bulunamayınca çağrılır.

  •  SpeechRecognized event’i aranan kelime ilgili library’de bulununca çağrılır. Aşşağıda görüldüğü gibi “Light” kelimesi bulununca, yanan lamba “Dark” bulununca sönen lamba resmi gösterilir.

picasion.com_6419dd6726b8b411236624d28ea39376

  •  RecognizeCompleted eventi kelime tanıma işlemi başarılı veya başarısız şekilde tamamlandıktan sonra çağrılır.

Aşşağıda  StartRecognition() methodunda eventlere EventHandlerların nasıl bağlandığını görüyoruz. Dikkat ederseniz RecognizeAsync() methodu bir thread içinde arkada çalışmaktadır. Çünkü uygulama her an yeni bir komut gelmesini arka planda beklemektedir.

 Form1.cs (Tamamı):

Bu giriş projesinden sonra şimdi gelelim esas projemize.

Eklenen Namespaceler aşşağıdaki gibidir. Ses için System.Speech.Recognition ve SpeechLib. Explorer açmak için WatiN.Core, WatiN.Core.Native.Windows kullanılmıştır.

Öncelikle ses ile mouse hareketleri yapmak için  windows kernel dll’i olan user32.dll com compenenti tanımlanır. Yani left, right button pressed ve unpressed, mouse  wheel up ve down eventleri için.

İlk örnekde de bahsedildiği gibi ses tanımlaması için gerekli library Load Grammer() methodu ile aşağıda tanımlanmıştır. Burda farklı olarak SpVoice adında bir class vardır. Amacı computer’ün bize sesli olarak dikte etmesini sağlamaktır. Bu class yerine SpeechSynthesizer’ıda kullanılabilirdi. Kullanım şekli aşağıdaki gibidir. Bir de giriş te “Wellcome Master Bora” şeklinde  bir karşılama konuşması yapılmaktadır:)

Aşşağıda  StartRecognition() methodunda ilgili speech eventlerinin nasıl bağlandığını görüyoruz. Dikkat ederseniz RecognizeAsync() methodu gene bir thread içinde arkada çalışmaktadır. Ve her an yeni bir komut gelmesini arka planda beklemektedir.

SpeechDetected eventi ses tanınma işlemi sırasında çağrılır. Kullanıcı “Ses Tanınıyor” yazısı ile bilgilendirilir.

SpeechRecognitionRejected  eventin de aranan kelime ilgili library’de bulunamayınca çağrılır. Kullanıcıya “What?” şeklinde seslenilerek uyrılır.

RecognizeCompleted eventi kelime tanıma işlemi başarılı veya başarısız şekilde tamamlandıktan sonra çağrılır.

Şimdi SpeechRecognized eventinde verilen komutlara göre yapılacak işleri tanımlayalım.

  • Öncelikle Hesap Makinası için olan komutları inceleyelim. İlgili alana belirtilen sayılar gelen komuta göre yazdırılır. Bu işlem yapılırken smsSifreSahasi olup olmadığına bakılır bu alan garanti bankasındaki şifre alanının ID’sidir. Buna göre komut olarak belirtilen sayılar ya ekrandaki textbox’a yada explorer da açılan garanti bankası web sayfasındaki şifre alanına yazılır. “pass” komutu ile ekrandaki bir sonraki textbox’a focuslanılır. Eğer google webBrowser açık ise googl’ın search text’ine de odaklanılır. “Take One” komutu ile focuslanmış textbox’dan son karakter silinir. “Clean” ile focuslanan textbox temizlenir. “Multi” çarpma işlemi, “Topla” toplama işlemi yapar. “Number” ilk sayısal textbox’a focuslanılır. “Say” sonucu makinanın sesle cevap vermesini sağlar. “Line” textbox2 textbox1’in yanına gelir. “Rahat” textbox2 textbox1’in altına eski yerine geçer. Dikkat ederseniz komut verildiği zaman timer4 durdurulur yani mouse hareketli ise durur.Bu konuya ileride detaylı olarak inceleyeceğiz.

calc

Aşağıda görüldüğü gibi “Kapat” komutu ile computer ses ile vedalaşıp kapanır. “Never Say Goodbye”‘, “How Are You” ve “What is eating” komutlarına komik bir şekilde SpVoice ile konuşarak cevap verir.

xbox

Aşağıda windows aplication içne yerleştirdiğimiz webBrowser ile yapılan işlemler ile alakalı methodları görüyoruz.

“Open Google” , “Open Milliyet” , “Open C#” ve “Open Gamespot” komutları ile webBrowser ilgili url’lere yönlendilirilir. “xbox” komutunda eğer webBrowser’ın url’i GameSpot ise ilgili sayfa içinde xbox360 ile ilgili konular aranır. Yukarıda bununla ilgili ekran görüntüsü görülmektedir.

csharp

“Ps3” ve “c sharp” komutlarında eğer google webBrowser’da açık ise ilgili textler google search’de yukarıda görüldüğü gibi aranır.

“wider” ve “small” komutlarında webBrowser 150 px genişler veya daralır. Buna bağlı olarak da genişlik artar ya da azalır.

“Search” komutu ile google’ın search button’u tıklanır.

“clear search” komutu ile eğer webBrowser’da google açık ise google’ın search textbox’ı temizlenir.

“Scroll Down” , “Scroll Up” ve “Scroll Stop” komutları ile webBrowser’ın scroll’u aşağı yukarı doğru hareket ettirilmektedir. Stop komutu ile hareketli scroll durdurulur.

“Faster Down” ve “Faster Up” komutlarında yukarı veya aşağıya hareket eden webBrowser scroll daha hızlı hareket etmeye başlar.

“go back” ve “go forward” komutlarında webBrowser’da geri ve ileri gidilir.

Şu ana kadar Speech Recognition’ın temelleri üzerine konuşup basit bir örnek yaptık. Daha sonra ses ile nasıl hesap işlemleri yapabileceğimizi inceledik .Ve son olarak sesli komut ile webBrowser üzerinde neler yapabilceğimize baktık. Bu makalenin 2. bölümünde eses yapıcağımız işlerin bir alt yapısını oluşturmuş ve speech recognition işlmelerinin ana komutlarını görerek olaya artık iyice ısınmış olduk. Bu makalenin 2. Bölümünde sizlerle çok güzel bir video paylaşıcağım. Ayrıca yukarıda tanımladığımız Choices içindeki geri kalan komutları da kullanıp esas yapmak istediğimiz işlere başlıyacağız.

Makalenin devamında görüşmek üzere hoşçakalın.

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

23 Cevaplar

  1. Ozgur dedi ki:

    Selamlar Hocam;
    Elinizi sağlık. Gene harika bir yazı olmuş. Ben ses teknolojiler ile çok ilgileniyorum. Özellikle akıllı ev teknolojileri ile.
    2. ve esas bölümü heycanla bekliyorum. Özellikle videonuzu :)

    • borsoft dedi ki:

      Teşekkürler Özgur.
      Akıllı ev teknolojileri ile bir çalışmam olmuştu. Perdeleri, ışıkları, müziğin sesini kapatıp açmıştık:) Merka ettiğin takıldığın birşey olursa çekinmeden sorabilirsin.
      İyi çalışmalar.

  2. Veli dedi ki:

    Selamlar hocam;
    Makalenizi çok beyendim. Öncelikle tamamen özgün ve çok başarılı. Lambayı evde sesli yakmayı başardım. İnanın çok mutlu oldum. 2. bölümü ve videonuzu heycanla bekliyorum. Satır satır evde aynen yazıyorum :) Yazılarınızı ve eventlerinizi herdaim takip ediyorum. İyi çalışmalar.

    • borsoft dedi ki:

      Teşekkürler Veli;
      Twitter’dan eventleri duyuruyorum. Video’yu çektim ama makalesi henüz bitmedi. Ben çok zevk aldım umarım siz de beyenirsiniz.

  3. murat dedi ki:

    Hocam video’nuzu çok merak ettim.. Bu arada çok farklı konularda bu kadar özgün yazılar yazan birini daha görmemiştim. Gerçekten araştırma öğrenme sizin göbek adınız :)

  4. HastaneBul dedi ki:

    Güzel bir anlatım, teşekkürler.

  5. Ahmed dedi ki:

    Hocam Merhaba, cok ii bi calisma olmus, elinzie saglik :) Facebook profilinze yazdim, lutfen ilgilenin

  6. Salim dedi ki:

    Emeğinize sağlık. Gerçekten güzel bir çalışma olmuş. Tebrik ederim

  7. Samet dedi ki:

    Merhaba Bora hocam; size çok teşekkür ederim paylaşımlarınız için. Bir şey soracaktım aslında bir sorunu. Mesela bir müzik açtığımızda bilgisayardan çıkan sesi de algılıyor bunu nasıl engelleyebiliriz? Sistemden gelen sesi algılamamasını nasıl sağlayabiliriz?

    • borsoft dedi ki:

      Selam Sammet,
      Öncelikle teşekkürler. Bunu algılamaman bu teknoloji ile pek mümkün değil gibi:) Ancak onun için ses frekansı ve dalga boyunu göre bir filter yazman gerekir ki onun da çok sağlıklı çalışabileceğini sanmıyorum.

      İyi çalışmalar.

      • Samet dedi ki:

        Teşekkürler hocam. Aslında Cortana’yı deniyordum uzun bir süredir fakat o bunu ayırt edebiliyor. Hemde çok başarılı bir şekilde. Hatta şöyle ki mesela YouTube’dan müziksiz bir konuşma açıyorum ve Cortana’ya sesleniyorum bu o konuşmayı algılamazken ben konuşmaya başladığımda sadece benim söylediklerimi kaliteli bir şekilde alıyor. Aklıma gelmişti bende sadece size sorayım demiştim. Ha birde aynı şeyi Cortana’ya telefondan dinlettim mi onu da algılayabiliyor. Herhalde sadece bilgisayardan çıkan seslere kulağını kapatıyor.

  8. Uğur Ziner dedi ki:

    Merhabalar burada anlattıklarınız proje halinde paylaşabilirmisiniz bizde deneyerek geliştirme yapsak olmazmı.

    • borsoft dedi ki:

      Selam Uğur,
      Malesef kaynak dosyaları paylaşamıyorum. Siz de yazıp deneseniz, aslında sizin için çok daha faydalı olacağını düşünüyorum.

      İyi çalışmalar.

  9. Bilgin dedi ki:

    Merhaba bora bey acaba bunun birde videosunu çekseniz olmaz mı

    • borsoft dedi ki:

      Selamlar Bilgin,

      Makalenin 2.bölümüne geçse idin seni şu :) https://www.youtube.com/watch?v=eRqM2AYbU1I
      video bekliyor olucaktı.

      İyi çalışmalar.

      • Bilgin dedi ki:

        Kusura bakmayın göremedin ben zaten sizin videonuzu izleyip buraya geldim. Bunun bir basit örneğini açıklamalı video halinde yapabilirmiisniz. Şöyle anlatayım geçmişte buna benzer ama bunun kadar kompleks olmayan bir kod yazmıştım türkçe olması için google cevirisini kullandım yani ben türkçe merhaba dediğim zaman web tarayıcıdan google translet oradaki ceviri okuma kısmına merhabaya karşılık gelmesini istedğim kelime örnek merhaba cevabını yazarak okumasını söylettirdim fakat bu kodlar şuan kayboldu ve yeterince elimde kaynak olmadığı için bir türlü mantığını anlamıyorum internnette bir çok kaynak olsada bir çoğu boş. Sizden ricam küçük bir video yapabilirmisniz

        • borsoft dedi ki:

          Bu aslında başka bir konu :) Çünkü orda google’a da okutabiliriz. Ama google’a çevirtip, biz okutacak isek o da kolay :) Video derken proje olarak yazmamı sanırım istiyorsun :)
          Dur bakayım olmadı onu da araya sıkıştırırım.

          İyi çalışmalar.

  10. Doğan dedi ki:

    Çok Başarılı olmuş teşekkürler Bora Kaşmer ! Devamını Bekliyoruz merakla.

  11. By Ahıskalı dedi ki:

    Hocam selamlar.
    Bu kodları arduinoya uyarlayıp wifi ve bluetooth a ihtiyaç olmadan kapalı devre bir proje oluşturmak niyetindeyim
    Sizce mümkünmüdür?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.