Seicas commited on
Commit
61812c0
·
verified ·
1 Parent(s): 030aeb4

Update diarization.py

Browse files
Files changed (1) hide show
  1. diarization.py +97 -7
diarization.py CHANGED
@@ -1,11 +1,101 @@
1
  from pyannote.audio import Pipeline
2
- from ..config import settings
3
 
4
  _diar_pipeline = Pipeline.from_pretrained(settings.DIAR_MODEL)
5
 
6
- def diarize_segments(file_path: str) -> list:
7
- diarization = _diar_pipeline(file_path)
8
- segments = []
9
- for turn, _, speaker in diarization.itertracks(yield_label=True):
10
- segments.append((turn.start, turn.end, speaker))
11
- return segments
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from pyannote.audio import Pipeline
2
+ from config import settings
3
 
4
  _diar_pipeline = Pipeline.from_pretrained(settings.DIAR_MODEL)
5
 
6
+ def diarize_segments(audio_path, segments):
7
+ """
8
+ Konuşma segmentlerini konuşmacılara göre ayırır
9
+
10
+ Parameters:
11
+ -----------
12
+ audio_path : str
13
+ Ses dosyasının tam yolu
14
+ segments : list
15
+ ASR tarafından oluşturulan zaman damgalı segmentler
16
+
17
+ Returns:
18
+ --------
19
+ list
20
+ Konuşmacı bilgisi eklenmiş segmentler
21
+ """
22
+ try:
23
+ # Pyannote modelini yükle
24
+ import os
25
+ import torch
26
+ from pyannote.audio import Pipeline
27
+
28
+ # HuggingFace token kontrolü
29
+ token = os.environ.get("HF_TOKEN")
30
+ if not token:
31
+ print("UYARI: HF_TOKEN bulunamadı, diyarizasyon atlanıyor.")
32
+ # Tüm segmentleri Konuşmacı 1 olarak işaretle
33
+ for seg in segments:
34
+ seg["speaker"] = "Konuşmacı 1"
35
+ return segments
36
+
37
+ # Pyannote pipeline'ını oluştur
38
+ pipeline = Pipeline.from_pretrained(
39
+ "pyannote/speaker-diarization-3.0",
40
+ use_auth_token=token
41
+ )
42
+
43
+ # GPU varsa kullan
44
+ if torch.cuda.is_available():
45
+ pipeline = pipeline.to(torch.device("cuda"))
46
+
47
+ # Diyarizasyon yap
48
+ diarization = pipeline(audio_path)
49
+
50
+ # Konuşmacı etiketlerini oluştur (Hekim, Asistan, vs.)
51
+ speaker_labels = {}
52
+
53
+ # Segmentlere konuşmacı bilgisi ekle
54
+ for seg in segments:
55
+ seg_start = seg["start"]
56
+ seg_end = seg["end"]
57
+
58
+ # Bu segment için en çok konuşan kişiyi bul
59
+ speaker_times = {}
60
+ for turn, _, speaker in diarization.itertracks(yield_label=True):
61
+ # Segment ve konuşma turu arasındaki çakışmayı hesapla
62
+ overlap_start = max(seg_start, turn.start)
63
+ overlap_end = min(seg_end, turn.end)
64
+
65
+ if overlap_end > overlap_start: # Çakışma varsa
66
+ duration = overlap_end - overlap_start
67
+ speaker_times[speaker] = speaker_times.get(speaker, 0) + duration
68
+
69
+ # En uzun konuşan kişiyi bul
70
+ if speaker_times:
71
+ max_speaker = max(speaker_times, key=speaker_times.get)
72
+
73
+ # Konuşmacıyı etiketle
74
+ if max_speaker not in speaker_labels:
75
+ # Yeni konuşmacı tespit edildi
76
+ # Pediatri bağlamında etiketler belirle (ilk konuşmacı genelde hekim)
77
+ idx = len(speaker_labels) + 1
78
+ if idx == 1:
79
+ label = "Hekim"
80
+ elif idx == 2:
81
+ label = "Asistan"
82
+ elif idx == 3:
83
+ label = "Ebeveyn"
84
+ else:
85
+ label = f"Konuşmacı {idx}"
86
+
87
+ speaker_labels[max_speaker] = label
88
+
89
+ seg["speaker"] = speaker_labels[max_speaker]
90
+ else:
91
+ # Diyarizasyon bilgisi yoksa
92
+ seg["speaker"] = "Bilinmeyen Konuşmacı"
93
+
94
+ return segments
95
+
96
+ except Exception as e:
97
+ # Hata durumunda basit etiketleme yap
98
+ print(f"Diyarizasyon hatası: {str(e)}")
99
+ for seg in segments:
100
+ seg["speaker"] = "Konuşmacı"
101
+ return segments