Merhaba, bugün Python “speech recognition” (ses algılama) modülünü kullanmayı öğreneceğiz. Bu modül yardımı ve ses komutu ile led kontrolü sağlayacağımız bir Raspberry Pi projesi gerçekleştireceğiz.
[embedyt] https://www.youtube.com/watch?v=MEn8D1AeYJY[/embedyt]
Bu projemizde bize gereken malzemelerin listesi şöyle:
Malzeme Listesi
- Raspberry Pi ( Raspbian kurulu olsa daha iyi olur)
- Led
- Dişi-dişi jumper kablo
- USB mikrofon (Eğer jack çıkışlı mikrofon kullanacaksanız USB ses kartı edinmeyi unutmayın)
- İsteğe bağlı olarak da sesli geri bildirim almak isterseniz 3.5mm jack ya da USB çıkışlı hoparlör
Biraz malzemelerimizin özelliklerine değinelim.
Malzemelerin Özellikleri ve Projemizin Hedefi
Ben bu projede Raspberry Pi 4 2GB kullanıyor olacağım ama siz herhangi bir modeli kullanabilirsiniz. Fark ettiyseniz malzeme listesinde ledimizi yüksek voltajdan korumak için bir direncimiz yok çünkü Raspberry Pi, Arduino gibi lojik1 çıkış olarak 5V değil 3.3V vermektedir. Bu voltaj seviyesi ledlerimizi sürmemiz için oldukça uygun ama size isterseniz GND ile ledimizin katot bacağı (- bacağı) arasına 220ohm luk bir direnç koyabilirsiniz. Unutmayın ki koyacağınız direnç az da olsa ledin parlaklığını düşürecektir.
Dişi-dişi jumper kablolar sayesinde ledi Raspberry Pi’ ın GPIO pinlerinden uygun olanına bağlayacağız.
Mikrofonumuz ise USB portlardan herhangi birine takılabiliyor olmalı. Jack girişi olmasına rağmen neden USB portu kullanıyoruz dediğinizi duyar gibiyim. Nedeni ise şöyle: Raspberry Pi üzerindeki 3.5mm jack girişi sadece veri çıkışı yapmak için kullanılabiliyor yani jack girişine sadece hoparlör ya da kulaklık gibi ekipmanlar takabiliriz. Eğer mikrofonumuzu jack girişine takarsak sesimiz Raspberry Pi tarafından algılanmayacaktır. Bu yüzden mikrofon çıkışınız 3.5mm jack şeklinde ise aşağıdaki gibi bir “USB ses kartı” edinmelisiniz.
Projemizi gerçekleştirmekteki asıl hedefimiz “speech recognition” modülünün içinde yer alan Google Speech API servisinin kullanımını öğrenmek.
Kullanacağımız led aslında devremizde olabilecek herhangi bir yükü temsil ediyor. Bu yükü isteğinize göre bir röle olarak değiştirebilirsiniz ya da Raspberry Pi’ dan gelen güç miktarına göre analog okuma ile Arduino’ yu bir işlemi yapması için tetikleyebilirsiniz.
Öncelikle devremizi kuralım.
Ses Komutu ile Led Kontrolü Devresi
Devrede de gördüğünüz gibi ledin katotunu GND hattına, anotunu ise GPIO17 adlı 11. sıradaki pine bağladık. (NOT: Raspberry Pi üzerindeki GPIO pinleri ardışık değildir. Mesela GPIO13 33. sıradayken,GPIO21 40.sıradadır. Pinler hakkında daha fazla bilgi için tıklayın.)
Devredekilere ek olarak USB portlarımızdan bir tanesine USB mikrofonumuzu bağlıyoruz. Eğer siz sesli geri dönüt de almak istiyorsanız jack kısmına hoparlörünüzü bağlamalısınız.
Bu projede sesi algılamak için Google Speech API servisini kullanacağız. Bu servis internet üzerinden veri alışverişi yaptığı için Raspberry Pi ya Wi-Fi ya da ethernet kablosu ile internete bağlı olmalıdır.
Ses Komutu ile Led Kontrolü için Raspberry Pi Ayarları
Modülleri Yüklemek
Öncelikle Raspberry Pi açtığımızda ilk yapmamız gereken şu komutları teker teker konsol ekranında çalıştırmaktır.
sudo apt update
sudo apt full-upgrade
sudo reboot
Bu komutlar ile Raspberry Pi sistemimize gelmiş olan güncelleme var mı diye kontrol edilir. Daha sonra güncelleme var ise indirilir ve kurulumun tamamlanması için yeniden başlatılır.
Şimdi ise mikrofon kullanacağımız için “PyAudio” ve söylediğimiz kelimeleri yazıya çevirmek için “speech recognition” modülüne ihtiyacımız var. Ayrıca .mp3 dosyalarını çalmak için “mpg321” eklentisine, Raspberry Pi GPIO pinlerine erişmek için “RPi.GPiO“, zamanla ilgili komutlar kullanabilmek için “time” ve sistemin özelliklerini kullanıp ses çıkışı vermek için “os” modülüne ihtiyacımız var. “os” ,”time” ve “RPi.GPiO” modülleri zaten Python3 ile hazır olarak gelmektedir. Fakat diğerlerini manuel olarak indirmeniz gerekiyor.
Ben Raspbian işletim sistemi ile birlikte gelen “Thonny Python IDE” yi kullanacağım bu yüzden kütüphanelerimi oradan yüklemem gerek. Thonny Python IDE’ yi açıp Tools -> Manage Packages bölümünden “PyAudio” ve “SpeechRecognition” şeklinde iki ayrı arama yapıp modülleri indiriyorum. Ayrıca mpg321 eklentisi için de aşağıdaki kod bölümünden ilk satırı konsol ekranımda çalıştırıyorum.
Eğer siz kodlarınızı IDE üzerinden değil de konsol ekranı üzerinden yazıyorsanız modülleri hızlıca şu kodlarla teker teker indirip kurabilirsiniz.
sudo apt-get install mpg321
pip3 install SpeechRecognition
pip3 install PyAudio
pip3 install RPi.GPiO
Hoparlör ve Mikrofon Yapılandırması
Şimdi de hoparlör ve mikrofonumuzun yazılımsal olarak hangi porta bağlı olduğunu bulmamız gerekiyor. Bunu için aşağıdaki kodu, modüllerimizi yüklediğimiz platformda çalıştırıyoruz.
import speech_recognition as sr
for index, name in enumerate(sr.Microphone.list_microphone_names()):
print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))
Bu kod bize hoparlör ve mikrofonumuzun bağlı olduğu portların yazılımsal yerini söylüyor ve şuna benzer bir çıkış veriyor.
Görselde bizim için USB PnP Sound Device (ses kartımın ismi) ve Headphones kısmı önemli. Birazdan mikrofonumuzun yapılandırması için bu “hw” ve “index” değerleri gerekli olacak. Aynı şekilde hoparlör de kullanacaksanız yine bu değerleri not edin.
Ben mikrofonumu USB portuna taktığım için “USB PnP Sound Device” isminin mikrofonumu belirttiğini biliyorum. PnP Device’ ın karşısındaki “hw:1,0” ve “index=1” değerini not alıyorum. Aynı şekilde hoparlörümü de “Headphone” yani jack girişine taktığım için “Headphones” kısmı da hoparlörümünün yazılımsal yerini bana söylüyor. Hoparlörüm içinse “hw:2,0” değerini not alıyorum.
Ekipmanlarımızın yazılımsal yerini öğrendiğimize göre şimdi bu değerleri Raspberry Pi’ ya kaydedelim. Konsol ekranına şu kodu yazıp çalıştırıyoruz.
sudo nano /etc/asound.conf
Bu kod ise bize etc klasörü içinde asound.conf adında bir dosya açıyor. Eğer ilk defa bu yapılandırmayı yapacaksanız konsol ekranında siyah bir ekran görüyor olmalısınız. (“nano” komutu dosya açıp içine yazı yazmak için kullanılır). Önümüze gelen ekrana aşağıdaki yapılandırma kodunu yazıyoruz.
pcm.!default {
type asym
capture.pcm "mic"
playback.pcm "speaker"
}
pcm.mic {
type plug
slave {
pcm "hw:1,0"
}
}
pcm.speaker {
type plug
slave {
pcm "hw:2,0"
}
}
Bu bölümde mikrofon (mic) ve hoparlör (speaker) için daha önce not alığınız “hw” değerlerini doğru girmelisiniz. Aksi halde ekipmanlarınız doğru çalışmaz.
Eğer “hw” değerlerimizin doğruluğundan eminsek CTRL+X yapıp kaydedip çıkıyoruz.
Alsamixer
Yapılandırma ayarlarımız neredeyse bitti. Şimdi tek yapmamız gereken hoparlör ve mikrofonumuzun ses düzeyini ayarlamak. Bunun için konsol ekranına şu kodu yazmalıyız.
alsamixer
Alsamixer bizi direkt olarak ses yönetim merkezine götürüyor. Bu bölümde “master” bölümünü %100′ e çıkartalım ve F6 ya basalım. Karşımıza şöyle bir ekran gelecek.
Burada ilk olarak ses kartımızı seçiyoruz. Sonra da klavyeden iki kere TAB tuşuna basıp, ses kartımızın tüm ayarlarını görebileceğimiz ekrana geliyoruz.
Burada mikrofonumuzun algılama seviyesini artırıp azaltabiliriz. Ben şu ana kadar hiç azaltma gereği duymadım, sizin de %100 yapmanızı tavsiye ederim.
Şimdi de klavyeden ESC tuşu ile arayüzü kapatalım. Yine alsamixer ->F6 yapıp bu sefer “headphones” kısmına girelim. Bizi şöyle bir arayüz karşılayacak.
Bu kısımda da hoparlörümüzün sesi ayarlayalım ve tekrar klavyeden ESC komutu ile arayüzden çıkış yapalım.
Şimdi de şu kodla Raspberry Pi ayarları kısmına gidelim ve hoparlörümüzün de yapılandırmasını bitirelim.
sudo raspi-config
Bu kısımda System Options -> Audio -> Headphones (hoparlörleri jack kısmına bağladığım için “headphones” seçiyorum) seçip onaylıyoruz.
Hoparlör ve Mikrofonumuzu Test Edelim
Yapılandırma ayarlarımızı bitirdik. Şimdi şu kodları sırayla konsol ekranında çalıştırarak hoparlör ve mikrofonumuzu test edebiliriz.
speaker-test -t wav
arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw
aplay --format=S16_LE --rate=16000 out.raw
İlk satırdaki kodumuzu çalıştırdığımızda hoparlörümüzden “Front Left” sesi gelmelidir. Kodun çalışmasını “CTRL+C” yaparak durduralım.
İkinci satırdaki kod 5 saniyelik bir ses kaydı aldırıyor ve en alttaki kod ise aldığımız ses kaydının oynatılmasını sağlıyor.
Eğer her şey tamamsa şimdi kodlarımıza geçelim.
Ses Komutu ile Led Kontrolü Projesi Kodları
#!/usr/bin/python3
# - *- coding: utf- 8 - *-
import speech_recognition as sr #ses algılama kütüphanesi
import RPi.GPIO as GPIO #Raspberry Pi GPIO pinlerini dahil ettik
import os #sesli geri dönüş alabilmek için ihtiyacımız olacak
import time #zaman kütüphanesi
GPIO.setwarnings(False) #uyarıları kapattık
GPIO.setmode(GPIO.BOARD) #Raspberry Pi pinlerinin ismini değil sıralamasını kullandığımızı belirttik
GPIO.setup(11, GPIO.OUT) #11 numaralı GPIO17 pinini OUTPUT olarak ayarladık
r = sr.Recognizer() #fonksiyonu "r" ismiyle çağıracağımızı belirttik
speech = sr.Microphone(device_index=1) #mikrofonumuzun index değerini girdik
def mic_text_doc(): #söylediklerimizi yazıya çevirecek bir fonksiyon tanımladık
recog = "-" #İlk değer ataması yaptık ki "recog" fonksiyondan boş dönerse hata oluşmasın
with speech as source:
print("Dinliyorum")
r.adjust_for_ambient_noise(source) #ses kalibrasyonu
audio = r.listen(source) #sesimiz Google servisine gidiyor
try:
recog = r.recognize_google(audio, language = 'TR- tr') #dili Türkçe olarak ayarladık
except sr.UnknownValueError: #oluşabilecek hatalara karşı bilgilendirme
print("Anlaşılmadı")
except sr.RequestError as e:
print("Servis hatası; {0}".format(e))
print("Bunu dedin: " + recog) #sesimiz yazıya dönüştürülmüştü şimdi onu ekrana yazdırdık
return recog
def led_on(pin): #led açma fonksiyonumuzu tanımladık
os.system("mpg321 /home/pi/Downloads/led/led_on.mp3 &") #dosya yolunu düzenlemeyi unutmayın
time.sleep(0.5) #0.5 saniye bekleme
GPIO.output(pin,GPIO.HIGH) #pinimizi lojik1 olarak ayarladık
time.sleep(0.5)
def led_off(pin): #led kapama fonksiyonumuzu tanımladık
os.system("mpg321 /home/pi/Downloads/led/led_off.mp3 &") # * dosya yolunu düzenlemeyi unutmayın
time.sleep(0.5)
GPIO.output(pin,GPIO.LOW) #pinimizi lojik0 olarak ayarladık
time.sleep(0.5)
while True: #sonsuz döngü oluşturduk (Arduino'daki "void loop()" gibi)
recog = mic_text_doc().lower() #büyük küçük harf ayrımını ortadan kaldırmak için .lower() kullandık
text=recog
if "aç" in text: #eğer cümlemizde "aç" kelimesi geçtiyse...
led_on(11) #ledi açan fonksiyonumuzu çağırdık ve pin numarasını girdik.
if "kapat" in text:
led_off(11) #ledi kapatan fonksiyonumuzu çağırdık ve pin numarasını girdik.
* Hoparlörünüzden sesli dönüt almak istiyorsanız ilgili .mp3 dosyaları için tıklayınız. Eğer sesli geri dönüt almak istemiyorsanız ilgili satırları (os.system satırlarını) # ile kapatmayı ya da silmeyi unutmayın. Aksi halde sistem belirtilen dosya yolunu bulamadığı için hata verecektir.
Artık Python kodumuzu çalıştırdığımızda tek yapmanız gereken mikrofona doğru “Işığı Aç” ya da “Işığı Kapat” şeklinde konuşmak. Unutmayalım ki anahtar kelimemiz “AÇ” ve “KAPAT” olduğundan kodumuz sadece bu kelimelere duyarlıdır
Proje sırasında herhangi bir hata ile karşılaştıysanız aşağıdaki rehberi göz atmak isteyebilirsiniz.
Proje ile İlgili Karşılaşabileceğiniz Sorunlar
1.Test Aşamasında Ekipmanlarım Çalışmadı
- Bağlantıları doğru yaptığınızdan emin olun
- Ekipmanlarınızın “hw” ve “index” değerlerinin doğruluğunu teyit edin.
- Eğer ilk iki madde çözüm olmadıysa asound.conf dosyanızı manuel olarak silin ve tekrar ekleyin.
2. Ses Çok Az Geliyor
- alsamixer den “master” ve “hoparlör” sesini kontrol edin
- Hoparlörünüz için amfi tercih edebilirsiniz.
3.Mikrofon Sesi Yakalayamıyor ya da Çok Yakından Yakalıyor
- Eğer test aşamasını geçtiyseniz ve mikrofon sesini sadece çok yakından yakalıyor ise mikrofon amfisi (mic pre-amplifier) kullanabilirsiniz.
- Daha büyük bir mikrofon tercih edebilirsiniz.
- Elektret mikrofon kullanıyorsanız mikrofon amfisi kullanmanızı tavsiye ederim.
4.“no module named: ….” Hatası Alıyorum
- Belirtilen modülün kurulmasında bir sorun oluşmuş olabilir tekrar indirmeyi deneyin.
- Raspberry Pi’ ın güncel olduğundan emin olun
5.“servis hatası” Yazısı Çıkıyor
- Raspberry Pi’ ınızın internet bağlantısını kontrol edin.
6.“indentation error” Hatası Alıyorum
- Koddaki girinti ve çıkıntılara dikkat edin. Python dilinin girintilere duyarlı olduğunu unutmayalım.
7.Ledi Kontrol Edebiliyorum ama Sesli Cevap Gelmiyor
- Müzik dosyanızın konumunu tekrar kontrol edin.
- “mpg321” eklentisini yüklemeyi unutmayın.
- Uzantının .mp3 olduğundan emin olun.
Bir projemizin daha sonuna geldik. Ses komutu ile led kontrolü hakkında herhangi bir sorunuz olursa bu gönderiye yorum olarak yazabilir ya da mail adresimden bana ulaşabilirsiniz.
İyi çalışmalar dilerim…
#ProjeBaşlasın