File size: 4,869 Bytes
41979e6
 
 
 
918bb30
 
 
 
 
41979e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e902f8
 
 
 
 
41979e6
 
 
 
 
 
 
 
 
 
 
0e902f8
41979e6
 
 
 
 
 
0e902f8
41979e6
 
 
 
0e902f8
 
 
 
 
 
 
41979e6
 
 
0e902f8
 
 
 
41979e6
 
0e902f8
41979e6
0e902f8
41979e6
 
 
0e902f8
41979e6
0e902f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41979e6
 
 
 
0e902f8
 
 
41979e6
0e902f8
41979e6
0e902f8
 
41979e6
0e902f8
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import torch
import whisper
from typing import Dict, Any, Optional
import os
from preprocessing import clean_audio
from diarization import diarize_segments
from medical_terms import load_turkish_medical_terms
from advanced_term_correction import MedicalTermCorrector
from config import settings

class MedicalASR:
    def __init__(self, config: Dict[str, Any]):
        """
        Tıbbi konuşma tanıma için ASR modülü
        
        Args:
            config: Yapılandırma parametreleri
                - language: Dil kodu (örn. "tr")
                - model: Kullanılacak model adı
                - domain: Alan adı (tıp için "medical")
        """
        self.config = config
        self.language = config.get("language", "tr")
        self.model_name = config.get("model", "whisper-large-v3")
        
        # CUDA kullanılabilirse tercih et
        self.device = "cuda" if torch.cuda.is_available() else "cpu"
        
        # Modeli yükle
        self.model = whisper.load_model(self.model_name, device=self.device)
        
        # Türkçe tıbbi terim sözlüğü
        self.medical_terms = load_turkish_medical_terms()
        
        # Gelişmiş terim düzeltici
        self.term_corrector = MedicalTermCorrector(self.medical_terms)
    
    def _load_medical_terms(self) -> Dict[str, str]:
        """Türkçe tıbbi terim sözlüğünü yükler"""
        # Örnek: Bu fonksiyon bir dosyadan ya da veritabanından tıbbi terimleri yükleyebilir
        return {
            "ateş": "ateş",
            "hipertansiyon": "hipertansiyon",
            "miyokard infarktüsü": "miyokard infarktüsü",
            # ... daha fazla tıbbi terim
        }
    
    def transcribe(self, audio_file: str, speaker_diarization: bool = True, enhance_audio: bool = True) -> Dict[str, Any]:
        """
        Ses dosyasını transkribe eder
        
        Args:
            audio_file: Ses dosyasının yolu
            speaker_diarization: Konuşmacı diyarizasyonu yapılsın mı
            enhance_audio: Ses iyileştirme yapılsın mı
            
        Returns:
            Transkripsiyon sonuçları
        """
        # 1. Ses iyileştirme (optional)
        if enhance_audio:
            processed_file = clean_audio(audio_file)
        else:
            processed_file = audio_file
        
        # 2. Transkripsiyon
        transcribe_options = {
            "language": self.language,
            "task": "transcribe",
            "beam_size": 5,  # Daha geniş arama ile alternatif kelimeleri değerlendir
            "best_of": 5,    # En iyi sonucu seç
            "temperature": 0, # Deterministik sonuçlar için
            "initial_prompt": "Çocuk doktoru vizitesi, pediatri uzmanı, çocuk hastalıkları, yenidoğan"  # Modele ipucu ver
        }
        
        result = self.model.transcribe(processed_file, **transcribe_options)
        
        # 3. Tıbbi terimleri düzelt
        corrected_text = self._correct_medical_terms(result["text"])
        result["text"] = corrected_text
        
        # 4. Diyarizasyon isteniyorsa ekle
        if speaker_diarization:
            segments = diarize_segments(processed_file)
            
            # Basit bir yaklaşım: Segmentlerin zaman etiketlerini kullanarak 
            # Whisper'ın döndürdüğü segmentleri konuşmacılara atayabiliriz
            if "segments" in result:
                whisper_segments = result["segments"]
                
                # Her bir diyarizasyon segmenti için
                for diar_seg in segments:
                    # Whisper segmentlerinden hangilerinin bu diyarizasyon segmentinde 
                    # olduğunu bulalım
                    for whisper_seg in whisper_segments:
                        w_start = whisper_seg["start"]
                        w_end = whisper_seg["end"]
                        
                        # Zaman aralıkları çakışıyorsa
                        if (diar_seg["start"] <= w_end and diar_seg["end"] >= w_start):
                            if not diar_seg["text"]:
                                diar_seg["text"] = whisper_seg["text"]
                            else:
                                diar_seg["text"] += " " + whisper_seg["text"]
            
            result["diarization"] = segments
        
        return result
    
    def _correct_medical_terms(self, text: str) -> str:
        """Transkribe edilmiş metindeki tıbbi terimleri düzeltir"""
        # Gelişmiş düzelticiyi kullan
        return self.term_corrector.correct_text(text)

# Basit dosya transkripsiyon fonksiyonu
def transcribe_file(file_path: str) -> str:
    # Bu fonksiyon eski API için burada bırakıldı
    _model = whisper.load_model(settings.ASR_MODEL)
    result = _model.transcribe(file_path)
    return result.get('text', '').strip()