VoiceToWrite / diarization.py
Seicas's picture
Update diarization.py
61812c0 verified
raw
history blame
3.57 kB
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