Spaces:
Running
Running
Update asr.py
Browse files
asr.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
import torch
|
2 |
import whisper
|
3 |
-
from ..config import settings
|
4 |
from typing import Dict, Any, Optional
|
5 |
import os
|
6 |
-
|
7 |
-
|
|
|
|
|
8 |
|
9 |
class MedicalASR:
|
10 |
def __init__(self, config: Dict[str, Any]):
|
@@ -27,8 +28,11 @@ class MedicalASR:
|
|
27 |
# Modeli yükle
|
28 |
self.model = whisper.load_model(self.model_name, device=self.device)
|
29 |
|
30 |
-
# Türkçe tıbbi terim sözlüğü
|
31 |
-
self.medical_terms =
|
|
|
|
|
|
|
32 |
|
33 |
def _load_medical_terms(self) -> Dict[str, str]:
|
34 |
"""Türkçe tıbbi terim sözlüğünü yükler"""
|
@@ -40,54 +44,77 @@ class MedicalASR:
|
|
40 |
# ... daha fazla tıbbi terim
|
41 |
}
|
42 |
|
43 |
-
def transcribe(self, audio_file: str, speaker_diarization: bool = True) -> Dict[str, Any]:
|
44 |
"""
|
45 |
Ses dosyasını transkribe eder
|
46 |
|
47 |
Args:
|
48 |
audio_file: Ses dosyasının yolu
|
49 |
speaker_diarization: Konuşmacı diyarizasyonu yapılsın mı
|
|
|
50 |
|
51 |
Returns:
|
52 |
Transkripsiyon sonuçları
|
53 |
"""
|
54 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
transcribe_options = {
|
56 |
"language": self.language,
|
57 |
"task": "transcribe",
|
|
|
|
|
|
|
|
|
58 |
}
|
59 |
|
60 |
-
result = self.model.transcribe(
|
61 |
|
62 |
-
# Tıbbi terimleri düzelt
|
63 |
corrected_text = self._correct_medical_terms(result["text"])
|
64 |
result["text"] = corrected_text
|
65 |
|
66 |
-
# Diyarizasyon isteniyorsa ekle
|
67 |
if speaker_diarization:
|
68 |
-
|
69 |
-
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
|
72 |
return result
|
73 |
|
74 |
def _correct_medical_terms(self, text: str) -> str:
|
75 |
-
"""
|
76 |
-
|
77 |
-
|
78 |
-
Args:
|
79 |
-
text: Düzeltilecek metin
|
80 |
-
|
81 |
-
Returns:
|
82 |
-
Düzeltilmiş metin
|
83 |
-
"""
|
84 |
-
# Bu basit bir örnek - daha gelişmiş NLP teknikleri kullanılabilir
|
85 |
-
for term, correct_form in self.medical_terms.items():
|
86 |
-
# Basit string değiştirme - gerçek uygulamada daha sofistike olmalı
|
87 |
-
text = text.replace(term, correct_form)
|
88 |
-
|
89 |
-
return text
|
90 |
|
|
|
91 |
def transcribe_file(file_path: str) -> str:
|
|
|
|
|
|
|
92 |
result = _model.transcribe(file_path)
|
93 |
-
return result.get('text', '').strip()
|
|
|
1 |
import torch
|
2 |
import whisper
|
|
|
3 |
from typing import Dict, Any, Optional
|
4 |
import os
|
5 |
+
from .preprocessing import clean_audio
|
6 |
+
from .diarization import diarize_segments
|
7 |
+
from .medical_terms import load_turkish_medical_terms
|
8 |
+
from .advanced_term_correction import MedicalTermCorrector
|
9 |
|
10 |
class MedicalASR:
|
11 |
def __init__(self, config: Dict[str, Any]):
|
|
|
28 |
# Modeli yükle
|
29 |
self.model = whisper.load_model(self.model_name, device=self.device)
|
30 |
|
31 |
+
# Türkçe tıbbi terim sözlüğü
|
32 |
+
self.medical_terms = load_turkish_medical_terms()
|
33 |
+
|
34 |
+
# Gelişmiş terim düzeltici
|
35 |
+
self.term_corrector = MedicalTermCorrector(self.medical_terms)
|
36 |
|
37 |
def _load_medical_terms(self) -> Dict[str, str]:
|
38 |
"""Türkçe tıbbi terim sözlüğünü yükler"""
|
|
|
44 |
# ... daha fazla tıbbi terim
|
45 |
}
|
46 |
|
47 |
+
def transcribe(self, audio_file: str, speaker_diarization: bool = True, enhance_audio: bool = True) -> Dict[str, Any]:
|
48 |
"""
|
49 |
Ses dosyasını transkribe eder
|
50 |
|
51 |
Args:
|
52 |
audio_file: Ses dosyasının yolu
|
53 |
speaker_diarization: Konuşmacı diyarizasyonu yapılsın mı
|
54 |
+
enhance_audio: Ses iyileştirme yapılsın mı
|
55 |
|
56 |
Returns:
|
57 |
Transkripsiyon sonuçları
|
58 |
"""
|
59 |
+
# 1. Ses iyileştirme (optional)
|
60 |
+
if enhance_audio:
|
61 |
+
processed_file = clean_audio(audio_file)
|
62 |
+
else:
|
63 |
+
processed_file = audio_file
|
64 |
+
|
65 |
+
# 2. Transkripsiyon
|
66 |
transcribe_options = {
|
67 |
"language": self.language,
|
68 |
"task": "transcribe",
|
69 |
+
"beam_size": 5, # Daha geniş arama ile alternatif kelimeleri değerlendir
|
70 |
+
"best_of": 5, # En iyi sonucu seç
|
71 |
+
"temperature": 0, # Deterministik sonuçlar için
|
72 |
+
"initial_prompt": "Çocuk doktoru vizitesi, pediatri uzmanı, çocuk hastalıkları, yenidoğan" # Modele ipucu ver
|
73 |
}
|
74 |
|
75 |
+
result = self.model.transcribe(processed_file, **transcribe_options)
|
76 |
|
77 |
+
# 3. Tıbbi terimleri düzelt
|
78 |
corrected_text = self._correct_medical_terms(result["text"])
|
79 |
result["text"] = corrected_text
|
80 |
|
81 |
+
# 4. Diyarizasyon isteniyorsa ekle
|
82 |
if speaker_diarization:
|
83 |
+
segments = diarize_segments(processed_file)
|
84 |
+
|
85 |
+
# Basit bir yaklaşım: Segmentlerin zaman etiketlerini kullanarak
|
86 |
+
# Whisper'ın döndürdüğü segmentleri konuşmacılara atayabiliriz
|
87 |
+
if "segments" in result:
|
88 |
+
whisper_segments = result["segments"]
|
89 |
+
|
90 |
+
# Her bir diyarizasyon segmenti için
|
91 |
+
for diar_seg in segments:
|
92 |
+
# Whisper segmentlerinden hangilerinin bu diyarizasyon segmentinde
|
93 |
+
# olduğunu bulalım
|
94 |
+
for whisper_seg in whisper_segments:
|
95 |
+
w_start = whisper_seg["start"]
|
96 |
+
w_end = whisper_seg["end"]
|
97 |
+
|
98 |
+
# Zaman aralıkları çakışıyorsa
|
99 |
+
if (diar_seg["start"] <= w_end and diar_seg["end"] >= w_start):
|
100 |
+
if not diar_seg["text"]:
|
101 |
+
diar_seg["text"] = whisper_seg["text"]
|
102 |
+
else:
|
103 |
+
diar_seg["text"] += " " + whisper_seg["text"]
|
104 |
+
|
105 |
+
result["diarization"] = segments
|
106 |
|
107 |
return result
|
108 |
|
109 |
def _correct_medical_terms(self, text: str) -> str:
|
110 |
+
"""Transkribe edilmiş metindeki tıbbi terimleri düzeltir"""
|
111 |
+
# Gelişmiş düzelticiyi kullan
|
112 |
+
return self.term_corrector.correct_text(text)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
|
114 |
+
# Basit dosya transkripsiyon fonksiyonu
|
115 |
def transcribe_file(file_path: str) -> str:
|
116 |
+
# Bu fonksiyon eski API için burada bırakıldı
|
117 |
+
from config import settings
|
118 |
+
_model = whisper.load_model(settings.ASR_MODEL)
|
119 |
result = _model.transcribe(file_path)
|
120 |
+
return result.get('text', '').strip()
|