Aşağıdaki kod ile dinleyip ben kimim dediğimde yüzü tanıyıp cevap veriyor ve sonra dinle’ye geri dönüp mikrofondan dinleme yapıyor. Sürekli komut yönlendirmeleriyle bu döngü güzel çalışıyor fakat ;
2 özellik eklemek istiyorum.
-
senaryo:
program ilk açıldığında, ilk kamera açıldığında yüzü gördüyse bir kere Merhaba x kişi, selam y diyecek.
(problem : kameranın penceresi açılmadan, daha aktif olmadan yüzü görmeye çalışıyor o yüzden yüzü göremiyor.
Çözüm : Kameraya while döngüsü yerine range ile loop yapıp range 50’ye gelince fonksiyona gitsin dedim.
Çözüm 2 :
opencv’de ilk görüntü alındıysa işlem yap diye bi kod bulmalıyım.
Problem : 1 kere bunu yapsın.
Çözüm : 1 kere bunu yapsın diye en başa karsilama=0 ekledim yüz gördüyse karsilama=1 ekledim. karsilama=1 ise çalıştırsın sonra işlem bittiğinde 0’a çevirdim ama nedense 2 kez üst üste fonksiyona gitti. Aynı anda sesler üstüste bindi. pygame hata verdi. -
senaryo kendi soru yöneltsin, konuşsun.
konuştuk - cevapladı - konuştuk - cevapladı buraya kadar güzel.
Kamerada birşey gördüğünde konuşması yada kendi belli bir anda soru sorsun vb. mantığı bu döngümde nasıl yapılabilir ? dinle() fonksiyonu sürekli döngüde olduğundan zaman ve an belirlesem bile mikrofon hatası verecek yada çıkan sesi kendi dinleyecek. bir tek dinle() fonksiyonundan başka dış fonksiyona çıkıldığında mikrofon dinlemeyi bırakıyor. mesela konus() fonksiyonuna gidince mikrofon dinlemiyor. bundan yararlanıp bir çözüm bulunabilir.
Bu konuda ufakta olsa çözüm önerileriniz varsa yardımcı olursanız sevinirim.
def yuztani():
# burada komuttan aldığı fonksiyon ile bu fonksiyona geliyor ve yüzü tanıdıktan sonra name adlı bir değeri okuyor yada yüzün ismini başka fonksiyon tts ile söylüyor.
name="Cüneyt"
def konus(response):
tts = gTTS(text=""+str(response), lang='tr')
tts.save("response.mp3")
windowSize = screen_width, screen_height = 100, 100
pygame.display.set_mode(windowSize)
pygame.mixer.init(16000, -16, 1, 1024)
SONG_END = pygame.USEREVENT + 1
pygame.mixer.music.set_endevent(SONG_END)
pygame.mixer.music.load('response.mp3')
pygame.mixer.music.play()
while mixer.music.get_busy() == True:
continue
while mixer.music.get_busy() == False:
dinle()
def cam(panServo,tiltServo):
while True:
ret, img = video_capture.read()
img = cv2.flip(img, +1)
cv2.imwrite('sonyeniyuz.jpg', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
img,
scaleFactor=1.1,
minNeighbors=30,
minSize=(10, 30)
)
for (x, y, w, h) in faces:
if (len(faces)>1):
#1. senaryoda bir yüz gördüyse buraya ne yazacağımı bulamadım.
cv2.rectangle(img, (x, y), (x+w, y+h), (225, 0, 0), 1)
if x>=1 and x<=71:
if tiltServo!=220:
panServo=panServo-1
pwm.set_pwm(pan, 0, panServo)
elif x>=200 and x<=350:
if tiltServo!=320:
panServo=panServo+1
pwm.set_pwm(pan, 0, panServo)
if y>=1 and y<=80:
if tiltServo!=255:
tiltServo = tiltServo+1
pwm.set_pwm(tilt, 0, tiltServo)
elif y>=120 and y<=350:
if tiltServo!=150:
tiltServo = tiltServo-1
pwm.set_pwm(tilt, 0, tiltServo)
cv2.imshow('frame',img)
def dinle(sorgu):
r = sr.Recognizer()
r.energy_threshold = 1000
r.pause_threshold = 1
m = sr.Microphone(sample_rate = 16000,chunk_size = 19000)
with m as source:
r.adjust_for_ambient_noise(source, duration = 1)
print("Dinliyorum...")
if (sorgu =="komut"):
mixer.music.load('beeplow.mp3')
mixer.music.play()
audio = r.listen(source)
try:
response = str(r.recognize_google(audio, language="tr"))
print("Sen dedin ki : '" + response + "'")
if sorgu =="komut":
komut(response)
elif sorgu =="kaydet":
rsx = sqlite3.connect('hafiza.db')
rsx_cursorekle = rsx.cursor()
rsx_sorgu = rsx_cursorekle.execute('SELECT id FROM taninankisiler ORDER BY id desc')
veri = rsx_cursorekle.fetchall()
for rsx in veri[0]:
sonid = int(rsx)+1
resimyoluson= str(sonid)
db = sqlite3.connect("hafiza.db")
cs = db.cursor()
cs.execute("INSERT INTO taninankisiler(taninankisiadi,resimyolu) VALUES (?,?)",(response,resimyoluson))
db.commit()
facecrop("yeniyuz.jpg")
except sr.UnknownValueError:
print("Seni duyamadım")
if sorgu =="komut":
dinle("komut")
elif sorgu =="kaydet":
response="Duyamadım, ismini tekrar söylermisin"
return konus(response,"1")
except sr.RequestError as e:
response="İnternet bağlantımı kontrol et"
konus(response)
if __name__ == "__main__":
t1 = threading.Thread(target=cam(panServo,tiltServo))
t2 = threading.Thread(target=dinle("komut"))
t1.start()
t2.start()