C# - Sesle Komut İşleme (Speech Recognition)
C# ile .NET içindeki ses tanıma (Speech Recognition) kütüphanesini kullanarak mikrofondan aldığımız komutlara göre işlem yapabilir ya da tanıdığımız kelimeleri kaydedebiliriz.
Ben denemelerimi İngilizce Windows 7 Ultimate 64-bit üzerinde yaptım. Daha alt Windows sürümlerinde (XP, Vista) sorun çıkar mı bilmiyorum. Türkçe işletim sistemlerinde sorun çıkartabilir. En azından aktif etmesenizde sisteme ingilizce dil paketini kurup deneyebilirsiniz.
Hazırlık
Ses tanıma kütüphanesini projenizde kullanmak istiyorsanız Visual Studio içinde üst menüden Project > Add Reference...
yolunu izleyin. Ardından açılan pencerede soldaki menüden Assemblies
altındaki Framework
seçeneğini seçtikten sonra ortadaki listeden System.Speech
kütüphanesini seçili hale getirip OK
butonuna tıklayın.
using System.Speech.Recognition;
Tabi ki form içinde bu kütüphaneyi kullanacağımızı using
ile belirtiyoruz.
Tanımlanacak Kelimeler
Önce sınıf seviyesinde (Form1 içinde) string dizisi oluşturup tanımlanacak kelimeleri önceden belirtiyoruz. Yani Speech Recognition Engine
bu kelimelere duyarlı olacak.
private string[] words = { "hello", "bye", "speech", "example" };
Tanımlayıcı Nesne
Şimdi, belirlediğimiz kelimeleri tanıyacak olan SpeechRecognitionEngine nesnesini oluşturup gerekli ayarları yapacağız. Ben Form1_Load içine yazdım, size de öyle öneririm. Çünkü form dışında herhangi bir yerden erişim gerekmeyecek.
private void Form1_Load(object sender, EventArgs e) { // 1. Bölüm SpeechRecognitionEngine speechRecognitionEngine = new SpeechRecognitionEngine(); speechRecognitionEngine.SetInputToDefaultAudioDevice(); // 2. Bölüm Choices choices = new Choices(); foreach (string word in this.words) { choices.Add(word); } // 3. Bölüm GrammarBuilder grammarBuilder = new GrammarBuilder(choices); Grammar grammar = new Grammar(grammarBuilder); // 4. Bölüm speechRecognitionEngine.LoadGrammar(grammar); speechRecognitionEngine.SpeechRecognized += this.speechRecognitionEngine_SpeechRecognized; speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); }
Birinci bölümde gerekli nesneyi oluşturup SetInputToDefaultAudioDevice
varsayılan mikrofonu kullanmasını sağladık. Eğer harici mikrofon kullanıyorsanız değiştirmelisiniz.
İkinci bölümde algılanacak kelimeleri tutan Choices
nesnesini oluşturup bir döngü yardımıyla üstte belirlediğimiz kelimeleri tek tek seçeneklere -Add
methodu ile- ekledik.
Üçüncü bölümde belirlediğimiz kelimelerden bir "gramer yapıcı", ondan ise bir "gramer" nesnesi oluşturduk.
Dördüncü bölümde oluşturduğumuz gramer nesnesini, ses tanıma nesnesine -LoadGrammar
methodu ile- yükledik. Bir ses algılandığında form içindeki speechRecognitionEngine_SpeechRecognized
methoduna gidilmesini -ki henüz oluşturmadık- sağladık. Bir de ses algılama yöntemini asenkron/çoklu olarak ayarladık.
Buraya kadar karşılaştığınız tek problem dördüncü bölümün ikinci satırı ise sorun yok demektir. Şimdi oluşturacağımız method ile o hata da kaybolacak.
Ses Tanıma Olayı (SpeechRecognized Event)
Yukarıdaki örnekte kelimeleri yazdırmak için iki tane ListBox
kullandım. Siz isterseniz başka bir şeyler de yapabilirsiniz. Basitçe aşağıdaki method, algılanan kelimeyi üstte belirlediğimiz kelimeler içinde arar. Eğer varsa listBox1
yoksa listBox2
içine yazdırır.
private void speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { foreach (RecognizedWordUnit recognizedWord in e.Result.Words) { // words dizisi algılanan kelimeyi içeriyor mu? if (words.Contains(recognizedWord.Text)) { // Yukarıda belirlenen kelimeler için. listBox1.Items.Add(recognizedWord.Text); } else { // Tanınmayan kelimeler için. listBox2.Items.Add(recognizedWord.Text); } } }
Ayrıca fark ettim ki "merhaba" deyince de "hello" yazdırdı. Bu bir özellik midir yoksa kodda mı bir sorun var anlayamadım. Test edebilirsiniz. :)
Örnek proeyi indirmek isteyenler SpeechRecognitionExample1.rar linkine tıklayabilirler.