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.
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:)
İ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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); private void Form1_Load(object sender, EventArgs e) { LoadGrammer(); StartRecognition(); } public void LoadGrammer() { Choices choices = new Choices(new string[] { "Light", "Dark" }); GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); recognizer.LoadGrammar(grammar); } |
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.
1 2 3 4 |
private void recognizer_SpeechDetected(object sender, SpeechDetectedEventArgs e) { label1.Text = "Ses Tanınıyor"; } |
- SpeechRecognitionRejected eventin de aranan kelime ilgili library’de bulunamayınca çağrılır.
1 2 3 4 5 6 |
// Konuşulan kelimeler gramerde bulumuyorsa tetiklenen olay private void recognizer_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e) { label1.Text = "Ses Tanıma İşlemi Başarısız."; } |
- 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Kullanıcının konuştuğu kelimeler gramerde bulunuyorsa tetiklenen olay private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Text == "Light") { pictureBox1.Image = Properties.Resources.lightsOn; } else if (e.Result.Text == "Dark") { pictureBox1.Image = Properties.Resources.lightsOff; } label1.Text = e.Result.Text; } |
- RecognizeCompleted eventi kelime tanıma işlemi başarılı veya başarısız şekilde tamamlandıktan sonra çağrılır.
1 2 3 4 5 6 7 |
// Tanıma işlemi başarılı olsun veya olmasını sonuçlandığında tetiklenen olay // İşlem sona erdiğinde private void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e) { recognizer.RecognizeAsync(); } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private void StartRecognition() { // Belirli sesleri tanıma işlemindeki ana olaylar recognizer.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(recognizer_SpeechDetected); recognizer.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(recognizer_SpeechRecognitionRejected); recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted); // recognizer.SetInputToDefaultAudioDevice() Bu metotun bir Thread içinde çalıştırılması gerekmektedir! // Ses tanıma işlemini başlatıyoruz. Thread t1 = new Thread(delegate() { recognizer.SetInputToDefaultAudioDevice(); recognizer.RecognizeAsync(RecognizeMode.Single); }); t1.Start(); } |
Form1.cs (Tamamı):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Speech.Recognition; using System.Threading; namespace Voice { public partial class Form1 : Form { private SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); public Form1() { InitializeComponent(); } public void LoadGrammer() { Choices choices = new Choices(new string[] { "Light", "Dark" }); GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); recognizer.LoadGrammar(grammar); } private void StartRecognition() { // Belirli sesleri tanıma işlemindeki ana olaylar recognizer.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(recognizer_SpeechDetected); recognizer.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(recognizer_SpeechRecognitionRejected); recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted); // recognizer.SetInputToDefaultAudioDevice() Bu metotun bir Thread içinde çalıştırılması gerekmektedir! // Ses tanıma işlemini başlatıyoruz. Thread t1 = new Thread(delegate() { recognizer.SetInputToDefaultAudioDevice(); recognizer.RecognizeAsync(RecognizeMode.Single); }); t1.Start(); } private void recognizer_SpeechDetected(object sender, SpeechDetectedEventArgs e) { label1.Text = "Ses Tanınıyor"; } // Kullanıcının konuştuğu kelimeler gramerde bulunuyorsa tetiklenen olay private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Text == "Light") { pictureBox1.Image = Properties.Resources.lightsOn; } else if (e.Result.Text == "Dark") { pictureBox1.Image = Properties.Resources.lightsOff; } label1.Text = e.Result.Text; } // Konuşulan kelimeler gramerde bulumuyorsa tetiklenen olay private void recognizer_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e) { label1.Text = "Ses Tanıma İşlemi Başarısız."; } // Tanıma işlemi başarılı olsun veya olmasını sonuçlandığında tetiklenen olay // İşlem sona erdiğinde private void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e) { recognizer.RecognizeAsync(); } private void Form1_Load(object sender, EventArgs e) { LoadGrammer(); StartRecognition(); } } } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Synthesis; using System.Text; using System.Windows.Forms; using System.Speech.Recognition;//C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Speech.Dll using System.Threading; using SpeechLib;//Add referance Com nesnesinde Microsoft Speech Object Library using mshtml; using System.Runtime.InteropServices;//user32.dll için using System.Diagnostics;//Process için using WatiN.Core; using WatiN.Core.Native.Windows; |
Ö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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
//Mouse Move için [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); private const int MOUSEEVENTF_LEFTDOWN = 0x02; private const int MOUSEEVENTF_LEFTUP = 0x04; private const int MOUSEEVENTF_RIGHTDOWN = 0x08; private const int MOUSEEVENTF_RIGHTUP = 0x10; private const int MOUSEEVENTF_WHEEL = 0x800; //0x800 is wheel movement //Mouse Move bitti //Mouse Scrolle için [DllImport("user32.dll", SetLastError = true)] public static extern int SendInput(int nInputs, ref INPUT mi, int cbSize); private const int WHEEL_DELTA = 10; public const int INPUT_MOUSE = 0; public const int INPUT_KEYBOARD = 1; [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public int dx; public int dy; public int mouseData; public int dwFlags; public int time; public IntPtr dwExtraInfo; }; // Not needed for this example... [StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public short wVk; public short wScan; public int dwFlags; public int time; public IntPtr dwExtraInfo; }; [StructLayout(LayoutKind.Explicit)] public struct INPUTUNION { [FieldOffset(0)] public MOUSEINPUT mouseInput; [FieldOffset(0)] public KEYBDINPUT keyboardInput; }; [StructLayout(LayoutKind.Sequential)] public struct INPUT { public int type; public INPUTUNION union; }; //Mouse Scroll Bitti--- public void DoMouseClick() { //Call the imported function with the cursor's current position int X = Cursor.Position.X; int Y = Cursor.Position.Y; mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); } public void DoMousePressed() { //Call the imported function with the cursor's current position int X = Cursor.Position.X; int Y = Cursor.Position.Y; mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); } public void DoMouseUnPressed() { //Call the imported function with the cursor's current position int X = Cursor.Position.X; int Y = Cursor.Position.Y; mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0); } public void DoMouseWheelUp(int speed) { Point pt = Cursor.Position; pt.Y = Screen.PrimaryScreen.Bounds.Height / 2; pt.X = Screen.PrimaryScreen.Bounds.Width / 2; Cursor.Position = pt; INPUT mi = new INPUT(); mi.type = INPUT_MOUSE; mi.union.mouseInput.dx = 0; mi.union.mouseInput.dy = 0; if (speed == 1) mi.union.mouseInput.mouseData = 10; else if (speed == 2) mi.union.mouseInput.mouseData = 40; else if (speed == 0) mi.union.mouseInput.mouseData = 0; mi.union.mouseInput.dwFlags = MOUSEEVENTF_WHEEL; mi.union.mouseInput.time = 0; mi.union.mouseInput.dwExtraInfo = new IntPtr(0); SendInput(1, ref mi, Marshal.SizeOf(mi)); } public void DoMouseWheelDown(int speed) { Point pt = Cursor.Position; pt.Y = Screen.PrimaryScreen.Bounds.Height / 2; pt.X = Screen.PrimaryScreen.Bounds.Width / 2; Cursor.Position = pt; INPUT mi = new INPUT(); mi.type = INPUT_MOUSE; mi.union.mouseInput.dx = 0; mi.union.mouseInput.dy = 0; if (speed == 1) mi.union.mouseInput.mouseData = -10; else if (speed == 2) mi.union.mouseInput.mouseData = -40; else if (speed == 0) mi.union.mouseInput.mouseData = 0; mi.union.mouseInput.dwFlags = MOUSEEVENTF_WHEEL; mi.union.mouseInput.time = 0; mi.union.mouseInput.dwExtraInfo = new IntPtr(0); SendInput(1, ref mi, Marshal.SizeOf(mi)); } |
İ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:)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
private SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { LoadGrammer(); StartRecognition(); } public void LoadGrammer() { Choices choices = new Choices(new string[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero", "pass", "Topla", "Clean", "Multi", "Kapat", "Line", "Rahat", "Say", "Take One", "Never Say Goodbye", "How Are You", "What is eating", "Open Milliyet", "Open Google", "Open C#", "Search", "Ps3", "c sharp", "Number", "Scroll Down", "Stop", "Scroll Up", "Faster Down", "Faster Up", "Open GameSpot", "xbox", "wider", "small", "what time is it", "mouse down", "mouse up", "mouse left", "mouse right", "Scroll Stop", "Push Button", "Faster", "Are U Gay", "clear search", "go back", "go forward", "Run Notepad", "Run Paint", "Kapat Notepad", "Kapat Paint", "Open Yahoo", "IPAD search", "Kapat Ex", "Ex Up", "Ex Down", "ex back", "ex forward", "Ex Up Faster", "Ex Down Faster", "Ex Stop", "Open Garanti", "Garanti Enter", "Ex Max", "Ex Min", "Learn", "Don't Learn", "Shout Up", "Say Load", "Ex Learn", "Dot", "Ex Don't Learn", "Boya", "No Boya", "temperature", "Get Money", "Get Movies", "Open Bora" }); GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); recognizer.RequestRecognizerUpdate(); recognizer.LoadGrammar(grammar); //SpeechSynthesizer ss = new SpeechSynthesizer(); //ss.SelectVoice("Microsoft Anna"); //ss.SpeakAsync("Wellcome Master Bora"); SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Wellcome Master Bora", svsp); } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private void StartRecognition() { // Belirli sesleri tanıma işlemindeki ana olaylar recognizer.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(recognizer_SpeechDetected); recognizer.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(recognizer_SpeechRecognitionRejected); recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted); // recognizer.SetInputToDefaultAudioDevice() Bu metotun bir Thread içinde çalıştırılması gerekmektedir! // Ses tanıma işlemini başlatıyoruz. Thread t1 = new Thread(delegate() { recognizer.SetInputToDefaultAudioDevice(); recognizer.RecognizeAsync(RecognizeMode.Single); }); t1.Start(); } |
SpeechDetected eventi ses tanınma işlemi sırasında çağrılır. Kullanıcı “Ses Tanınıyor” yazısı ile bilgilendirilir.
1 2 3 4 |
private void recognizer_SpeechDetected(object sender, SpeechDetectedEventArgs e) { label1.Text = "Ses Tanınıyor"; } |
SpeechRecognitionRejected eventin de aranan kelime ilgili library’de bulunamayınca çağrılır. Kullanıcıya “What?” şeklinde seslenilerek uyrılır.
1 2 3 4 5 6 7 |
private void recognizer_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e) { label1.Text = "Ses Tanıma İşlemi Başarısız."; SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("What?", svsp); } |
RecognizeCompleted eventi kelime tanıma işlemi başarılı veya başarısız şekilde tamamlandıktan sonra çağrılır.
1 2 3 4 5 6 7 |
// Tanıma işlemi başarılı olsun veya olmasını sonuçlandığında tetiklenen olay // İşlem sona erdiğinde private void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e) { recognizer.RecognizeAsync(); } |
Ş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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { timer4.Stop(); if (e.Result.Text == "One") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "1"; } else ((TextBox)this.ActiveControl).Text += "1"; } else if (e.Result.Text == "Two") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "2"; } else ((TextBox)this.ActiveControl).Text += "2"; } else if (e.Result.Text == "Three") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "3"; } else ((TextBox)this.ActiveControl).Text += "3"; } else if (e.Result.Text == "Four") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "4"; } else ((TextBox)this.ActiveControl).Text += "4"; } else if (e.Result.Text == "Five") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "5"; } else ((TextBox)this.ActiveControl).Text += "5"; } else if (e.Result.Text == "Six") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "6"; } else ((TextBox)this.ActiveControl).Text += "6"; } else if (e.Result.Text == "Seven") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "7"; } else ((TextBox)this.ActiveControl).Text += "7"; } else if (e.Result.Text == "Eight") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "8"; } else ((TextBox)this.ActiveControl).Text += "8"; } else if (e.Result.Text == "Nine") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "9"; } else ((TextBox)this.ActiveControl).Text += "9"; } else if (e.Result.Text == "Zero") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "0"; } else ((TextBox)this.ActiveControl).Text += "0"; } else if (e.Result.Text == "Dot") { if (ie != null && ie.NativeBrowser != null && ie.ActiveElement.Id == "smsSifreSahasi") { ie.TextField(Find.ById("smsSifreSahasi")).Value += "."; } else ((TextBox)this.ActiveControl).Text += "."; } else if (e.Result.Text == "pass") { if (this.ActiveControl.Name == "textBox1") textBox2.Focus(); else if (this.ActiveControl.Name == "textBox2") { if (webBrowser1.Url != null) { HtmlDocument doc = webBrowser1.Document; if (doc.All.GetElementsByName("q")[0] != null) { HtmlElement search = (HtmlElement)doc.All.GetElementsByName("q")[0]; search.Focus(); } else textBox1.Focus(); } else textBox1.Focus(); } } else if (e.Result.Text == "Number") { textBox1.Focus(); } else if (e.Result.Text == "Topla") { if (textBox1.Text.Trim() != "" && textBox2.Text.Trim() != "") { textBox3.Text = ((textBox1.Text.IndexOf(".") != -1 ? double.Parse(textBox1.Text.Replace(".", ",")) : int.Parse(textBox1.Text)) + (textBox2.Text.IndexOf(".") != -1 ? double.Parse(textBox2.Text.Replace(".", ",")) : int.Parse(textBox2.Text))).ToString(); } } else if (e.Result.Text == "Multi") { if (textBox1.Text.Trim() != "" && textBox2.Text.Trim() != "") { textBox3.Text = ((textBox1.Text.IndexOf(".") != -1 ? double.Parse(textBox1.Text.Replace(".", ",")) : int.Parse(textBox1.Text)) * (textBox2.Text.IndexOf(".") != -1 ? double.Parse(textBox2.Text.Replace(".", ",")) : int.Parse(textBox2.Text))).ToString(); } } else if (e.Result.Text == "Take One") { if (ie != null && ie.NativeBrowser != null && ie.Frames.Count > 1 && ie.Frames[2].ActiveElement.Id == "textPIN") { ie.Frames[2].TextField(Find.ByName("textPIN")).Value = ie.Frames[2].TextField(Find.ByName("textPIN")).Value.Substring(0, ie.Frames[2].TextField(Find.ByName("textPIN")).Value.Length - 1); } else ((TextBox)this.ActiveControl).Text = ((TextBox)this.ActiveControl).Text.Substring(0, ((TextBox)this.ActiveControl).Text.Length - 1); } else if (e.Result.Text == "Line") { timer1.Start(); } else if (e.Result.Text == "Rahat") { timer2.Start(); } else if (e.Result.Text == "Say") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak(textBox3.Text + " Master Bora", svsp); } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
else if (e.Result.Text == "Kapat") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("See you Later Master Bora", svsp); Application.Exit(); } else if (e.Result.Text == "Never Say Goodbye") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Ok but I am Just Obey the Order.", svsp); } else if (e.Result.Text == "How Are You") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Not Bad too Cold and Lonely.", svsp); } else if (e.Result.Text == "What is eating") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Eat My Power Cable.", svsp); } |
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.
“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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
else if (e.Result.Text == "Open Google") { webBrowser1.Url = new Uri("http://www.google.com.tr/"); } else if (e.Result.Text == "Open Milliyet") { webBrowser1.Url = new Uri("http://www.milliyet.com.tr/"); } else if (e.Result.Text == "Open C#") { webBrowser1.Url = new Uri("http://www.csharpnedir.com/"); } else if (e.Result.Text == "Open GameSpot") { webBrowser1.Url = new Uri("http://www.GameSpot.com/"); } else if (e.Result.Text == "xbox") { if (webBrowser1.Url != null && webBrowser1.Url == new Uri("http://www.GameSpot.com/")) { webBrowser1.Url = new Uri("http://www.gamespot.com/xbox360/index.html?navclk=xbox360&tag=nav-top;xbox360"); } } else if (e.Result.Text == "Ps3" || e.Result.Text == "c sharp") { if (webBrowser1.Url != null && webBrowser1.Url.Host == "www.google.com.tr") { HtmlDocument doc = webBrowser1.Document; HtmlElement search = (HtmlElement)doc.All.GetElementsByName("q")[0]; search.Focus(); search.InnerText = e.Result.Text; } } else if (e.Result.Text == "wider") { this.Width = this.Width + 150; webBrowser1.Width = webBrowser1.Width + 150; this.Location = new Point((Screen.PrimaryScreen.Bounds.Width - this.Width) / 2, this.Location.Y); } else if (e.Result.Text == "small") { this.Width = this.Width - 150; webBrowser1.Width = webBrowser1.Width - 150; this.Location = new Point((Screen.PrimaryScreen.Bounds.Width - this.Width) / 2, this.Location.Y); } else if (e.Result.Text == "Search") { HtmlDocument doc = webBrowser1.Document; IHTMLElement button = (IHTMLElement)doc.GetElementById("btnG").DomElement; button.click(); } else if (e.Result.Text == "clear search") { if (webBrowser1.Url != null && webBrowser1.Url == new Uri("http://www.google.com.tr/")) { HtmlDocument doc = webBrowser1.Document; HtmlElement search = <span class="words_added">(HtmlElement)doc.All.GetElementsByName("q")[0];</span> search.Focus(); search.InnerText = ""; } } else if (e.Result.Text == "Faster Down") { if (webBrowser1.Url != null) { webBrowser1.Navigate("javascript:var s = function() { window.scrollBy(0,10); setTimeout(s, 50); }; s();"); } } else if (e.Result.Text == "Faster Up") { if (webBrowser1.Url != null) { webBrowser1.Navigate("javascript:var s = function() { window.scrollBy(0,-10); setTimeout(s, 50); }; s();"); } } else if (e.Result.Text == "Scroll Down") { if (webBrowser1.Url != null) { webBrowser1.Navigate("javascript:var s = function() { window.scrollBy(0,10); setTimeout(s, 100); }; s();"); } } else if (e.Result.Text == "Scroll Up") { if (webBrowser1.Url != null) { webBrowser1.Navigate("javascript:var s = function() { window.scrollBy(0,-10); setTimeout(s, 100); }; s();"); } } else if (e.Result.Text == "Scroll Stop") { webBrowser1.Navigate("javascript:var s = function() { window.scrollBy(0,0); }; s();"); } else if (e.Result.Text == "go back") { webBrowser1.GoBack(); } else if (e.Result.Text == "go forward") { webBrowser1.GoForward(); } |
Ş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.
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 :)
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.
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.
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.
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 :)
Teşekkürler Murat.
Daha neler yazıcaz neler:)
Güzel bir anlatım, teşekkürler.
Hocam Merhaba, cok ii bi calisma olmus, elinzie saglik :) Facebook profilinze yazdim, lutfen ilgilenin
Teşekkürler Ahmet.
Malesef yazdığın yazıyı göremedim..
Emeğinize sağlık. Gerçekten güzel bir çalışma olmuş. Tebrik ederim
Teşekkürler Salim…
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?
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.
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.
Merhabalar burada anlattıklarınız proje halinde paylaşabilirmisiniz bizde deneyerek geliştirme yapsak olmazmı.
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.
Merhaba bora bey acaba bunun birde videosunu çekseniz olmaz mı
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.
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
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.
Çok Başarılı olmuş teşekkürler Bora Kaşmer ! Devamını Bekliyoruz merakla.
Teşekkürler Doğan :)
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?