from pyannote.audio import Pipeline from config import settings _diar_pipeline = Pipeline.from_pretrained(settings.DIAR_MODEL) def diarize_segments(audio_path, segments): """ Konuşma segmentlerini konuşmacılara göre ayırır Parameters: ----------- audio_path : str Ses dosyasının tam yolu segments : list ASR tarafından oluşturulan zaman damgalı segmentler Returns: -------- list Konuşmacı bilgisi eklenmiş segmentler """ try: # Pyannote modelini yükle import os import torch from pyannote.audio import Pipeline # HuggingFace token kontrolü token = os.environ.get("HF_TOKEN") if not token: print("UYARI: HF_TOKEN bulunamadı, diyarizasyon atlanıyor.") # Tüm segmentleri Konuşmacı 1 olarak işaretle for seg in segments: seg["speaker"] = "Konuşmacı 1" return segments # Pyannote pipeline'ını oluştur pipeline = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.0", use_auth_token=token ) # GPU varsa kullan if torch.cuda.is_available(): pipeline = pipeline.to(torch.device("cuda")) # Diyarizasyon yap diarization = pipeline(audio_path) # Konuşmacı etiketlerini oluştur (Hekim, Asistan, vs.) speaker_labels = {} # Segmentlere konuşmacı bilgisi ekle for seg in segments: seg_start = seg["start"] seg_end = seg["end"] # Bu segment için en çok konuşan kişiyi bul speaker_times = {} for turn, _, speaker in diarization.itertracks(yield_label=True): # Segment ve konuşma turu arasındaki çakışmayı hesapla overlap_start = max(seg_start, turn.start) overlap_end = min(seg_end, turn.end) if overlap_end > overlap_start: # Çakışma varsa duration = overlap_end - overlap_start speaker_times[speaker] = speaker_times.get(speaker, 0) + duration # En uzun konuşan kişiyi bul if speaker_times: max_speaker = max(speaker_times, key=speaker_times.get) # Konuşmacıyı etiketle if max_speaker not in speaker_labels: # Yeni konuşmacı tespit edildi # Pediatri bağlamında etiketler belirle (ilk konuşmacı genelde hekim) idx = len(speaker_labels) + 1 if idx == 1: label = "Hekim" elif idx == 2: label = "Asistan" elif idx == 3: label = "Ebeveyn" else: label = f"Konuşmacı {idx}" speaker_labels[max_speaker] = label seg["speaker"] = speaker_labels[max_speaker] else: # Diyarizasyon bilgisi yoksa seg["speaker"] = "Bilinmeyen Konuşmacı" return segments except Exception as e: # Hata durumunda basit etiketleme yap print(f"Diyarizasyon hatası: {str(e)}") for seg in segments: seg["speaker"] = "Konuşmacı" return segments