Merhaba arkadaşlar!
Bir süre aradan sonra tekrar bir C# yazısı ile birlikteyiz. Bu yazıda Speech Recognition üzerinde basit bir giriş işlemi yapacağız. Öncelikle C# ile konuşma algılama v.b. işlemleri Türkçe olarak henüz yapamadığımızı üzülerek belirtiyoruz çünkü Gramer altyapısında mevcut bir Türkçe grameri bulunmuyor(Özel bir Türkçe gramer dosyanız varsa bilemem) bu yüzden bizde bu işlemi İngilizce olarak sürdüreceğiz. Girişimizi uzatmadan hemen başlayalım öncelikle bir kaç gerekli işlem var yapmamız gereken.
DÜZELTME: Artık Türkçe Olarak Konuşma Algılama yapmak mümkün. Bunun için aşağıda linkini vermiş olduğum makaleme gidebilirsiniz.
Türkçe Konuşma Algılama -Turkish Speech Recognition
Eğer adımları doğru takip ederseniz internette gördüğünüz bir çok hata ile karşılaşmadan doğru bir şekilde sonuca ulaşabilirsiniz!
1. Referans Ekleme Ve Kütüphane Tanımlama
Öncelikle şu yolu izleyeceğiz.
“Projects > Add Reference ” ve ardından açılan pencerede “Assemblies” tabı altında “Framework” sekmesinde “System.Speech” referansını projemize ekliyoruz.
Bu işlemi yapabilmek için projemizin .net sürümünün 3.0 ve üstünde olması gerektiğini unutmayalım!
Gerekli kütüphaneyi tanımlamayı unutmuyoruz!
using System.Speech.Recognition;
2.Gerekli Dil Paketlerinin Yüklenmesi
Bir çoğumuz Windows’un Türkçe paketlerini kullanıyoruz ve tabi bu sebeple bu aşamada ortaya bir çok hata çıkıyor. Bu adımda İngilizce dil paketi indirmemiz gerekiyor. Peki bunu nasıl yapacağız? Hemen detaylara girelim, her işletim sistemi için farklı adımlar olduğu için farklı farklı belirteceğim.
-Windows 10-
Başlat simgesine tıklayıp “Ayarlar” yazıyoruz. Açılan pencereden “Zaman ve Dil” seçeneklerini seçip yeni pencereye geçiyoruz ve o pencerede sol kısımdaki “Bölge ve Dil” seçeneğini seçiyoruz. “Dil Ekle” seçeneği karşımıza çıkıyor. “Dil Ekle” seçeneğine tıklayıp gelen ekrandan ” English” seçeneğini seçiyoruz ardından “English(United States)” seçeneğini seçiyoruz. Ardından Dil ekranına geri dönüyor. “Diller” listesinde “English” e tıklayıp “Seçenekler” butonuna tıklıyoruz. O ekranda “Temel Yazı” ve “Konuşma” dillerini indiriyoruz. İndirme işlemi tamamlanınca bilgisayarımızı yeniden başlatıyoruz.
-Windows 8-
Mouse’mizi sağ kısıma yaklaştırınca açılan menüden “Ayarlar” seçeneğine tıklıyoruz. Denetim Masası seçeneğini seçip açılan ekranda “Dil Seçenekleri” butonuna tıklıyoruz. Bu seçimi yaptıktan sonra karşımıza gelen menüde “Dil Ekle” seçeneğine tıklayıp “English-US” dilini indiriyoruz. İşlem tamamlandıktan sonra bilgisayarımızı yeniden başlatıyoruz.
-Windows 7-
Bu adımları tamamlamak için Windows7 de çok güzel bir uyulama var “Vistalizator” bu uygulama için gerekli detayı linke tıklayarak bulabilirsiniz!
3. Gerekli İzinleri Tanımlamak
Bu adımda gerekli yönetici izinlerini tanımlamamız gerekiyor yoksa yine bir çok hata ile karşılaşılabiliyor. İnternetteki hataların çoğu dil paketi ve izinden kaynaklanan hatalar olduğunu unutmayalım. Peki yönetici izni nedir? Nasıl tanımlarız? Hemen cevaplayalım.
“Projects > Add New Item” sekmesinden açılan pencereden “Application Manifest File” öğesini seçip ekliyoruz. Açılan pencerede aşağıdaki gibi olan kısmı buluyoruz.
requestedExecutionLevel level="asInvoker" uiAccess="false
Bu kısımı aşağıdaki gibi değiştirmemiz gerekiyor:
requestedExecutionLevel level="requireAdministrator" uiAccess="false"
Bu kısım ile ilgili detaylı bilgiyi C# Yönetici İzni Tanımlamak sekmesinden bulabilirsiniz.
4. Kodlama Kısmı
Bu kısıma kadar gerekli işlemleri doğru takip ettiyseniz sorunsuz bir şekilde kodlamamızı bitirip, uygulamamızı çalıştırabiliriz.
Tanımlamalar ile başlıyoruz.
Load kısmına tanımlamayı yapmamız yeterli olacaktır , ilk adımda Algılama motoruna ihtiyacımız var.
SpeechRecognitionEngine algilamaMotoru= new SpeechRecognitionEngine();
Daha sonra bu motoru doğru dinleme için default audio device olarak ayarlıyoruz.
algilamaMotoru.SetInputToDefaultAudioDevice();
Bir sonraki aşamada belirli bir ses grubu oluşturmamız gerekiyor. Belirlenen kelime grubunu burada tanımlıyoruz.
Choices sesGrubu = new Choices("hello","hi","bye","how are you");
Belirtilen kelime grupları bir sonraki aşamada gramer oluşturmamıza faydası olacak.
Bu adımda bir gramer yapısı oluşturacağız.
GrammarBuilder gramerYapilandirici= new GrammarBuilder(sesGrubu); gramerYapilandirici.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar gramer = new Grammar(gramerYapilandirici);
Bu adımda gerekli gramer yapısını oluşturmuş olacağız. Oluşturduğumuz gramer yapısını algılama motoruna yüklüyoruz.
algilamaMotoru.LoadGrammar(gramer);
Bu adımda algılama işlemi gerçekleştiğinde ne yapacağımıza dair bir metod yazmamız gerekecek hemen işe koyulalım. Bu kısımda ekrana bir textbox eklendiğini varsayarak yazdım, eğer console uygulamasında çalışıyorsanız burayı kendinize göre düzenleyebilirsiniz.
void ses_Duyuldu(object sender, SpeechRecognizedEventArgs e) { foreach (RecognizedWordUnit kelime in e.Result.Words) { textBox1.Text += kelime.Text+" "; }
Bu metodu tanımladıktan sonra LOAD kısmında kaldığımız yerden devam ediyoruz. Ses duyulma anında tetiklenecek metodu belirtip, algilama motorunu multiple olarak açıyoruz.
algilamaMotoru.SpeechRecognized += ses_Duyuldu; algilamaMotoru.RecognizeAsync(RecognizeMode.Multiple);
Son adımı da tamamladığımızda Form_Load metodumuz aşağıdaki gibi olacaktır.
private void Form1_Load(object sender, EventArgs e) { SpeechRecognitionEngine algilamaMotoru= new SpeechRecognitionEngine(); algilamaMotoru.SetInputToDefaultAudioDevice(); Choices sesGrubu = new Choices("hello","hi","bye","how are you"); GrammarBuilder gramerYapilandirici= new GrammarBuilder(sesGrubu); gramerYapilandirici.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar gramer = new Grammar(gramerYapilandirici); algilamaMotoru.LoadGrammar(gramer); algilamaMotoru.SpeechRecognized += ses_Duyuldu; algilamaMotoru.RecognizeAsync(RecognizeMode.Multiple); }
Bu aşamaya kadar eğer doğru olarak tamamladıysanız uygulamanızı Debug ettiğinizde şuan doğru bir şekilde konuşma algılama uygulamanız çalışıyor olacaktır!
Yinede biraz daha devam edip, sık karşılaşılan hatalar ve çözümlerini inceleyelim.
5.Sık Karşılaşılan Hatalar Ve Çözümleri
HATA 1
Erişim engellendi. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
ÇÖZÜM 1
Eğer bu hatayla karşı karşıyaysanız yönetici izini verip vermediğinizi kontrol edin. Bu hata sıklıkla gerekli izinler verilmediğinden dolayı kaynaklanmaktadır.
HATA 2
Speech Recognition is not available on this system. SAPI and Speech Recognition engines cannot be found.
ÇÖZÜM 2
Doğru dil paketini yüklemediğiniz için veya İşletim sisteminizin paketi bu işlemi desteklemediği için alınan hatadır, dil paketinizi kontrol edin şayet doğruysa işletim sistemi ile ilgili bir problem söz konusudur.
HATA 3
The language for the grammar does not match the language of the speech recognizer.
ÇÖZÜM 3
Dil paketi kaynaklı bir problemdir “Englis-US” yani “English(United States)” dil paketini kontrol edin.
HATA 4
An unhandled exception of type ‘System.UnauthorizedAccessException’ occurred in System.Speech.dll
Additional information: Erişim engellendi. (HRESULT özel durum döndürdü: 0x80070005 (E_ACCESSDENIED))
ÇÖZÜM 4
Speech kütüphanenizin sürümü eski olabilir, .NET sürümünüzü kontrol edin. Eğer hata devam ediyorsa gerekli izinlerin tanımlandığından emin olun.
HATA 5
No recognizer is installed.
ÇÖZÜM 5
Mevcut algılayıcı(Mikrofon v.b) öğesinin varsayılan olarak ayarlandığından emin olun.
Elimden geldiğince C# ile Konuşma algılama nedir nasıl yapılır hatalar nasıl giderilir bunlardan bahsettim, umarım yardımcı olabilmişimdir. Mevcut hata ve sorularınızı yorum kısmından sorabilirsiniz!
Teşekkürler!
Googledeki dokümanı da aldım fakat bir türlü programı çalıştıramadım yardımcı olursanız sevinirim. Aldığım hata aşağıdaki gibidir.
System.InvalidOperationException: ‘The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.’
Merhabalar,
Credentials ekranında uygulamanızı oluşturup izinleri tanımladınız mı?