SpeechRecognizer ile Ses Kaydetmek

Merhaba bu yazımda SpeechRecognition modülünü kullanarak iPhone’un mikrofonundan faydalanmayı anlatacağım.

Örnek proje üzerinden bir uygulama yapacağız ve gerekli yerlerde açıklama yapacağım.

 

Örnek Proje

Basit bir ses kaydetme uygulaması yapacağız. Swift 4.2 ile uyumlu olacak.

SingleView bir Swift projesi yarattıktan sonra info.plist dosyasını açıp aşağıdaki keyleri ve açıklamaları ekleyelim.

 

Kullanıcı uygulamayı açtığında önce bu izinleri vermesi gerekecek.

 

ile Speech modülünü import edelim.

 

Speech web tabanlı çalışan bir modüldür. Projenin düzgün bir biçimde çalışması için internet bağlantınızın olması gerekiyor.

 

İsterseniz SpeechRecognition özelliğini ayrı bir class içinde gerçekleştirelim.

Daha sonra işimize yarayan tüm değişiklikleri bir delege fonksiyonuna atarız ve diğer sınıf içinde implement ederiz.

Böylece asıl class içinde kod kalabalığı yapmamış oluruz.

 

Eğer delegation hakkında merak ettikleriniz varsa Delege & Protokol Kullanımı yazıma bakmanızı tavsiye ederim.

 

Şimdi protokolü, delege metodunu, sınıfı ve değişkenleri tanımlayalım.

 

Yukarıda yazdıklarımı biraz açıklayayım:

 

SpeechRecognitionModalDelegate protokolü içinde didPrepareSpeech isminde bir delege metodu oluşturduk.

Oluşturduğumuz bu metod sayesinde şunları yapacağız:

  • Yazıya döktüğümüz konuşmayı canlı olarak alacağız,
  • Konuşmayı başlatmak için kullandığımız butonun aktif/pasif durum bilgisini anlık olarak elde edeceğiz.

 

SpeechRecognition ile ilgili tüm işlemleri bundan oluşturduğumuz bir obje üzerinden gerçekleştireceğiz.

SpeechRecognition API sine istekleri web servisi üzerinden yapıyoruz. Bu nedenle web servisine istek atacak request ve bunları gerçekleştirecek task objesine ihtiyacımız var.

Tüm ses sinyallerini AVAudioEngine yönetir. Bu nedenle bundan oluşturduğumuz bir objeye ihtiyacımız var.

lang değişkeni kullanılan cihazın başlatma dilini alıyor. Eğer iPhone’u türkçe kullanıyorsanız lang değeri “tr” olacaktır.

timer değişkenini ise sessizlik anında audioengine i durdurmak için kullanacağız.

 

Bu değişkenlerin hepsi private çünkü dışarıdan müdahale edilmesini istemiyoruz. Erişilmesini istediklerimizi zaten delege edeceğiz.

 

Kullanıcı İzinleri

 

Şimdi bir customInit() metodu yazalım. Bu metodu sınıfın kendisinden bir obje oluşturduktan sonra viewDidLoad() içinde çağıracağız.

 

SpeechRecognizer için gerekli tanımlamaları yaptık ve kullanıcıdan mikrofonu kullanabilmek için izin istedik.

Bunun sonucunda mikrofonun isEnabled statüsünü belirledik ve bunu delege metoduna gönderdik.

 

Buton Aksiyonu

 

Daha sonra yapmamız gereken mikrofon butonuna bastığımız zaman neler yapılacağını ayarlamak. Bunun için ise micButtonPressed adında bir metod hazırlayalım ve aşağıdaki kodları yazalım. Bu fonksiyonu daha sonra mikrofon butonunun aksiyonu içinde çağıracağız.

 

 

 

Keşke startRecording() diyip bütün işimiz bitse değil mi 😀

Ama yok öyle yağma, bi startRecording() fonksiyonu yapalım bakalım:

 

Bu metod ile ses kayıt işlemi sırasında yapılması gerekenleri belirttik. Çok kabaca şunu yapıyoruz:

Canlı olarak konuştuğumuz her kelime result bloğunun içine düşüyor ve biz onun string halini delege metoduna gönderiyoruz.

Ayrıca, eğer error un değeri nil değilse restartSpeechTimer diye bir fonksiyon çağırıyoruz. Yazacağımız bu fonksiyon timer fonksiyonunu çağırarak callback mekanizması içinde kendisini yeniden çağıracak.

 

Yazalım o zaman…

 

Bu fonksiyonumuz eğer 1.5 saniye içinde ses gelmezse mikrofon dinleme özelliğini kapatıyor ve yeniden kullanılmak üzere hazırlıklarını yapıyor.

Ayrıca delege metodunu butonun durumu hakkında bilgilendiriyorki diğer sınıfın bu değişiklikten haberi olsun 🙂

 

Son olarak SpeechRecognizer modülünün availability ile alakalı olan delege metodunu çağırmamız gerek.

 

 

Son Dokunuşlar…

 

 

 

SpeechRecognitionModal sınıfında yapmamız gerekenler bunlardı.

Artık tek yapmamız gereken IBOutlet, IBAction bağlantılarını yaptığımız sınıfı açmak ve delege metodunu gerekli yerlerde implement etmek.

Bunun için şekildeki gibi bir sayfa tasarlayalım ve tasarımın bağlı olduğu ViewController sınıfı içinde label ve buton için IBOutlet bağlantısı yapalım.

Buton için ayrıca IBAction bağlantısı yapmayı unutmayalım.

Bunlar için verdiğim isimler sırasıyla; titleLabel, micButton, micButtonPressed

 

 

 

Son olarak yapmamız gereken SpeechRecognitionModalDelegate protokolünü sınıfın içinde çağırmak ve gerekli yerlerde kullanmak.

Tüm bunları yaptığımızda kodun son hali aşağıdaki gibi olacaktır:

 

Her ne kadar SpeechRecognitionModal sınıfında biraz uğraşmış olsak da ViewController sınıfımız yeterince temiz oldu.

 

Şimdi projeyi çalıştırabiliriz 🔥

 

 

 

Projenin kaynak koduna buradan erişebilirsiniz.

Bu yazı ile ilgili görüş ve önerilerinizi yorum bölümünden iletebilirsiniz. Ayrıca e-mail adresimden bana her daim ulaşabilirsiniz.

İyi günler.

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir