File size: 3,555 Bytes
41979e6
432e60e
41979e6
432e60e
41979e6
432e60e
1f694e8
432e60e
1f694e8
432e60e
 
 
 
 
 
1f694e8
 
432e60e
 
 
1f694e8
432e60e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61812c0
432e60e
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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(
            settings.DIAR_MODEL, 
            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