Yaptığım döngü güzel çalışıyor fakat bazı özellikler eklediğimde problemler oluşuyor

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.

  1. 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.

  2. 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() 

Kodunuzu syntax hatası vermeyecek hale getirin, tamamlamadığınız yerlere pass veya ... yazabilirsiniz.

1 Beğeni

Sizin durumu görebilmeniz için mi? Olmadı sildim hepsini sildim çünkü tekrar yazıp gönderirim

Yani iyi olur. Bir de importlarınızı yazın istiyorsanız.

1 Beğeni

Kodunuzda threading kullanılamıyor şu anda.

Pardon bendeki eski kodu göndermişim zaten yenileyip yaptığımda gönderirim onu çözmüştük burada.

Bu arada bir daha çalıstırdım mikrofon kesinlikle dinler konumda kendi söylediğini dinlemis merhaba nasılsın cüneyt yazdı duyduğu kelimeye :slight_smile:
Bir sekilde dinlemeyi durdurmalı dinle() fonksiyonunu pasif yapmalıyım. kendi komutla dinle() fonksiyonundan geçip yönlendiğinde bu sekilde hata vermiyor öyle döngüde olsa dinlemeyi durduruyor.

Ne kadar doğru bilmiyorum ama hata verdiğinde geçmesini söyledim. dinlemeyi de bıraktı. normal isliyor hersey. Birde bu islemi yaparken kamera da donuyor kameraya yönlendirdim tekrar çalıstı.

        except (IOError, SyntaxError) as e:
        cam(panServo,tiltServo)
        pass

https://docs.python.org/3/library/threading.html#lock-objects
https://python-istihza.yazbel.com/standart_moduller/threading.html#lock-kilit-nesneleri

1 Beğeni

Örnekleri inceliyorum ama koduma nasıl uyarlayacağımı çözemedim henüz.