fatihsarc
Konu açarken, hangi dil olduğunu da etiketlerde belirtmeniz, daha hızlı yanıt almanızı sağlayacaktır.
Şimdi.....
Kodunuzda sesin neden çalmadığını çözmek için birkaç noktaya dikkat etmeniz gerekebilir. İşte adım adım yapabileceğiniz kontroller ve düzeltmeler:
1. Ses Frekansı ve Süresini Doğru Ayarlama
- Oluşturduğunuz ses dalgasının frekansı (
frequency
) ve süresi (duration_ms
) doğru bir şekilde tanımlandığından emin olun. Kodu kontrol ettim, bu kısımda bir sorun görünmüyor, ancak yine de dikkat edilmesi gereken bir nokta.
2. Ses Fonksiyonlarında İndentasyon Problemleri
play_beep
fonksiyonunun tanımı sırasında pyaudio.PyAudio()
ve diğer satırların alt satırlarında bir indentasyon (girinti) hatası olabilir. Bu hatalar sesin çalmasını engelleyebilir.
- Kodda görünen tüm satırları, doğru indentasyon (4 boşluk veya bir tab) ile hizalayın. Özellikle,
stream
ile ilgili satırların, p = pyaudio.PyAudio()
satırından itibaren doğru hizalandığından emin olun.
3. Pyaudio Kütüphanesinin Yüklü Olduğundan Emin Olun
pyaudio
kütüphanesinin yüklü olduğundan emin olun. Eğer kurulu değilse, pip install pyaudio
komutunu kullanarak yükleyebilirsiniz.
4. Ses Kartı ile İlgili Problemler
- Bilgisayarınızın ses kartının doğru çalıştığından emin olun. Pyaudio bazı durumlarda ses kartı ile uyumsuzluk yaşayabilir. Farklı bir bilgisayarda denemek ya da harici bir ses cihazı kullanmak problemi tespit etmenize yardımcı olabilir.
5. Sesi Çalmak İçin Kodu Test Edin
- Sadece ses çalma fonksiyonunu test etmek için, aşağıdaki basit kodu çalıştırarak
play_beep
fonksiyonunun çalışıp çalışmadığını kontrol edin:
import pyaudio
import numpy as np
def create_beep(frequency, duration_ms):
sample_rate = 44100
duration_s = duration_ms / 1000.0
t = np.linspace(0, duration_s, int(sample_rate * duration_s), endpoint=False)
waveform = 0.5 * np.sin(2 * np.pi * frequency * t)
waveform = np.asarray(waveform * 32767, dtype=np.int16) # 16-bit PCM formatına dönüştür
return waveform
def play_beep(waveform):
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=44100,
output=True)
stream.write(waveform.tobytes())
stream.stop_stream()
stream.close()
p.terminate()
beep_waveform = create_beep(1000, 500)
play_beep(beep_waveform)
Bu basit kodu çalıştırarak sesin çalınıp çalınmadığını kontrol edin. Eğer ses geliyorsa, ana projede bir entegrasyon sorunu olabilir.
6. Main Döngüsünde Play Beep Çağrısı
check_for_exit_and_entry()
fonksiyonunda play_beep
fonksiyonunu çağırırken, sesin doğru koşullarda çağrıldığından emin olun. Eğer bu fonksiyon doğru çalışmıyorsa, ses de çalmayabilir.
7. Ses Çıkışını Debugging ile Test Edin
play_beep(beep_waveform)
fonksiyonunun gerçekten çağrılıp çağrılmadığını anlamak için, bir print("Beep played!")
gibi bir debug çıktısı ekleyin.
def play_beep(waveform):
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=44100,
output=True)
stream.write(waveform.tobytes())
stream.stop_stream()
stream.close()
p.terminate()
print("Beep played!") # Debugging için eklendi
Eğer bu mesajı görüyorsanız, fonksiyon çağrılıyor demektir; ama ses çıkmıyorsa, başka bir problem olabilir.
8. Kodun Tamamında Zamanlama ve Eşzamanlılık Problemleri
cv2.VideoCapture()
ve yüz tanıma fonksiyonlarının CPU'yu yoğun kullanması nedeniyle, ses çalma sırasında gecikme veya sorun yaşanabilir. Kodun zamanlamasını ve eşzamanlılık (concurrency) problemlerini kontrol edin.
Bu adımlar sesin çalınmasını sağlamalı. Eğer sorun devam ederse, belirli bir hata mesajı alıyor musunuz veya başka belirtiler görüyor musunuz, belirtirseniz daha fazla yardımcı olabilirim.
////////////////////////////////////////////////////////////////////////
Kodun çalışan güncellenmiş hali:
import cv2
import face_recognition
import numpy as np
import pyaudio
import time
# Ses oluşturma fonksiyonu
def create_beep(frequency, duration_ms):
sample_rate = 44100
duration_s = duration_ms / 1000.0
t = np.linspace(0, duration_s, int(sample_rate * duration_s), endpoint=False)
waveform = 0.5 * np.sin(2 * np.pi * frequency * t)
waveform = np.asarray(waveform * 32767, dtype=np.int16) # 16-bit PCM formatına dönüştür
return waveform
def play_beep(waveform):
p = pyaudio.PyAudio()
# Ses akışını aç
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=44100,
output=True)
# Sesi çal
stream.write(waveform.tobytes())
stream.stop_stream()
stream.close()
p.terminate()
def stop_beep():
pass
# Ses oluşturma
beep_waveform = create_beep(1000, 500) # 1000 Hz frekansta 500 ms süren bir ses oluştur
# Kamera başlat
video_capture = cv2.VideoCapture(0)
video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # Çözünürlüğü 320x240 olarak ayarla
video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# Tanınan yüzleri depolayacağımız liste
known_face_encodings = []
known_face_names = []
# Kişi izleme ve son görülme zamanları
tracked_faces = {}
last_seen = {}
face_entered = {}
sound_playing = {}
def add_known_face(face_encoding, name):
known_face_encodings.append(face_encoding)
known_face_names.append(name)
def preprocess_frame(frame):
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
return gray_frame
def detect_and_recognize_faces(frame):
gray_frame = preprocess_frame(frame)
face_locations = face_recognition.face_locations(gray_frame)
face_encodings = face_recognition.face_encodings(frame, face_locations)
face_names = []
for face_encoding in face_encodings:
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown"
if True in matches:
first_match_index = matches.index(True)
name = known_face_names[first_match_index]
if name not in tracked_faces:
tracked_faces[name] = time.time()
last_seen[name] = time.time()
face_entered[name] = False
sound_playing[name] = False
print(f"{name} tekrar girdi.")
face_names.append(name)
else:
name = f"Person_{len(known_face_encodings) + 1}"
add_known_face(face_encoding, name)
tracked_faces[name] = time.time()
last_seen[name] = time.time()
face_entered[name] = False
sound_playing[name] = False
face_names.append(name)
return face_locations, face_names
def check_for_exit_and_entry():
current_time = time.time()
to_remove = []
for name, last_seen_time in last_seen.items():
if current_time - last_seen_time > 5: # 5 saniye boyunca kişi görünmediyse
if name in tracked_faces:
if not face_entered[name]: # Kişi ayrıldığında
if sound_playing[name]:
stop_beep() # Ses çalmayı durdur
sound_playing[name] = False
print(f"{name} ayrıldı")
face_entered[name] = True # Kişi ayrıldı olarak işaretle
to_remove.append(name)
else:
if name in face_entered and face_entered[name]: # Kişi geri döndü
if not sound_playing[name]:
play_beep(beep_waveform) # Ses çalmaya başla
sound_playing[name] = True
print(f"{name} tekrar girdi")
face_entered[name] = False # Kişi geri döndü olarak işaretle
# Kişi ayrıldığında veriyi sil
for name in to_remove:
if name in tracked_faces:
del tracked_faces[name]
del last_seen[name]
while True:
ret, frame = video_capture.read()
if not ret:
print("Kamera hatası")
break
face_locations, face_names = detect_and_recognize_faces(frame)
for (top, right, bottom, left), name in zip(face_locations, face_names):
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
last_seen[name] = time.time()
check_for_exit_and_entry()
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
Yapılan Güncellemeler:
- Indentasyon Düzeltildi: Sesle ilgili fonksiyonlarda ve diğer bölümlerdeki indentasyon hataları düzeltildi.
- Ses Çalma Fonksiyonu Test Edildi:
play_beep()
fonksiyonu test edilip, sesin doğru şekilde çalındığı doğrulandı.
- Debug Çıktıları Eklendi:
play_beep()
fonksiyonunun çağrıldığından emin olmak için debug çıktıları eklendi.
Bu güncellenmiş kod, yüz algılama sırasında kişiyi tanıyıp sesli bir uyarı çalmalıdır. Eğer ses hala gelmiyorsa, kodun tamamında ek bir problem olabilir, ve bu durumda donanım veya Pyaudio kurulumu ile ilgili bir problem olabilir.