Makale Özeti

Bu makalemde sizlerle kullanım örneklerini günümüzde çok fazla göremesek de zaman içerisinde örnekleri artan bir ivmede görmeye başlayacağımız bir konudan, Speech Recognition(Ses algılama)'dan bahsedeceğim. .Net Framework'ün 3.0 versiyonu ile gelen System.Speech kütüphanesinde bulunan metodlar ve sınıflar ile bu işlemleri nasıl yapabileceğimizi inceleyeceğiz.

Makale

Merhabalar,

Bu makalemde sizlerle kullanım örneklerini günümüzde çok fazla göremesek de zaman içerisinde örnekleri artan bir ivmede görmeye başlayacağımız bir konudan, Speech Recognition(Ses algılama)'dan bahsedeceğim. .Net Framework'ün 3.0 versiyonu ile gelen System.Speech kütüphanesinde bulunan metodlar ve sınıflar ile bu işlemleri nasıl yapabileceğimizi inceleyeceğiz.

Text To Speech ile ilgili bir makaleyi geçen aylarda yazmıştım. Text To Speech bilgisayardaki bir metni bilgisayarın okuması işlemi iken, Speech Recognition, bilgisayar tarafından sesin algılanması işlemidir. Esasında bu teknolojiye yakın bir teknoloji sesle arama özelliği olan cep telefonlarında görülebilir. Cep telefonlarındaki teknoloji tam olarak ses eşleştirmedir.

Speech Recognition kullanarak bilgisayarınıza ses ile komutlar verebilirsiniz, çok gelişmiş bir örnek olarak, evinizin çeşitli elektronik eşyalarını bağladığınız bir bilgisayar tarafından tüm evinizi koltuğunuzdan idare edebilir, ışıkları, klimayı, televizyonu açıp kapayabilirsiniz. Kullanılabilir örneklerden biri de sesli yanıt sistemlerini tuşlara tıklamak yerine konuşarak kullanmaktır. Daha basit bir örnek olarak bilgisayarınızdaki programları sesli komutlar ile çalıştırma veya konuşarak bilgisayara metin yazdırma gibi örnekleri inceleyebilirsiniz.

Şimdi bu işlemi .Net Framework kullanarak nasıl yapabileceğimizi inceleyelim.

Yeni bir Windows uygulaması oluşturalım. Bu uygulamada amacımız bilgisayara sesle komut vererek Notepad ve Paint uygulamalarını açtırmak olacak. Uygulamamız tek formdan oluşsun ve formu aşağıdaki gibi dizayn edelim:



Formda basitçe bir label ve progress bar var. Label üzerinde ses tanıma işlemi sırasında durum yazacak.

İlk olarak uygulamamıza System.Speech namespace'ini C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Speech.dll lokasyonundan referans ekleyelim. Ardından class level bir SpeechRecognitionEngine nesnesi tanımlayalım. Ardından da formun Load event'inde SpeechRecognitionEngine nesnesinin bazı event'leri fırladığında çalışacak metodları tanımlayalım:

SpeechRecognitionEngine sre = new SpeechRecognitionEngine();

private void Form1_Load(object sender, EventArgs e)
{
            KomutlariOlustur();
            sre.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(sre_SpeechDetected);
            sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
            sre.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(sre_RecognizeCompleted);
            sre.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(sre_SpeechRecognitionRejected);
            Thread t = new Thread(delegate() { sre.SetInputToDefaultAudioDevice(); sre.RecognizeAsync(RecognizeMode.Single); });
            t.Start();
}


Kodda görüldüğü gibi SpeechRecognitionEngine nesnesi bir ses farkettiğinde SpeechDetected, bu ses algılandığında SpeechRecognized, ses algılanamadığında SpeechRecognitionRejected, ses algılanması tamamlandığında RecognizeCompleted event'leri çalışacak. Son olarak SpeechRecognitionEngine'in SetInputToDefaultAudioDevice ve RecognizeAsync metodlarını bir thread içinde çalıştırıyoruz.

Formun Load event'inde ayrıca KomutlarıOlustur adında bir metodu da çağırıyoruz:
 
private void KomutlariOlustur()
{
            string[] komutlar = new string[] { "Run Notepad", "Run Paint" };
            Choices insChoices = new Choices(komutlar);
            GrammarBuilder insGrammarBuilder = new GrammarBuilder(insChoices);
            Grammar insGrammar = new Grammar(insGrammarBuilder);
            sre.LoadGrammar(insGrammar);
}

KomutlariOlustur metodunda SpeechRecognitionEngine nesnesinin algılayabileceği komutlar listesini oluşturuyoruz. SpeechRecognitionEngine için algılayabileceği kelime listesini oluşturmak, uygulamamızın algılanmasını istediğimiz kelimelerde daha başarılı sonuçlar vermesini sağlayacaktır. komutlar adında bir string array tanımlıyoruz ve tanımladığımız Choices nesnesinin instance'ını alırken komutlar array'ini parametre geçiriyoruz. Choices nesnesini de GrammarBuilder nesnesinin instance'ını alırken parametre geçiriyoruz. Ardından da Grammar nesnesinin instance'ını alıp, SpeechRecognitionEngine nesnesinin LoadGrammar metoduna parametre geçiriyoruz.

Sırada SpeechRecognitionEngine nesnesinin event'lerini handle etmek kaldı:
 

void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
            progressBar1.Style = ProgressBarStyle.Blocks;;
            lblDurum.Text = "Komut algılanamadı.";
}

void sre_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
{
            sre.RecognizeAsync();
            progressBar1.Style = ProgressBarStyle.Blocks;
}

void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
            if (e.Result.Text == "Run Notepad")
            {
                Process.Start("notepad.exe");
            }
            else if (e.Result.Text == "Run Paint")
            {
                Process.Start("mspaint.exe");           
            }
            lblDurum.Text = ""
}

void
sre_SpeechDetected(object sender, SpeechDetectedEventArgs e)
{
            lblDurum.Text = "Komut algılanıyor...";
            progressBar1.Style = ProgressBarStyle.Marquee;
}

SpeechRecognized event'inde eğer algılanan ses biraz önce LoadGrammar metodu ile tanımladığımız kelime öbeklerinden biri ise, ilgili işlem yapılıyor. Eğer değilse SpeechRecognitionRejected event'i devreye giriyor ve durum label'ına komutun algılanamadığı yazılıyor. RecognizeCompleted event'inde ise SpeechRecognitionEngine nesnesinin RecognizeAsync metodu çağırılıyor.

Uygulamamızın kodları bu kadar. Şimdi derleyip çalıştıralım ve komut vererek Notepad'i uygulamamıza çalıştırtalım:



Uygulamayı çalıştırdıktan sonra "Run Notepad" şeklinde komut verirsek Notepad'in açıldığını, "Run Paint" şeklinde komut verirsek de Paint'in açıldığını görmüş oluruz.

Umarım faydalı olmuştur.

Işıl ORHANEL
http://www.isilorhanel.net

Örnek kodları buradan indirebilirsiniz.