Spaces:
Running
Running
File size: 5,338 Bytes
41979e6 bbd2003 41979e6 918bb30 bbd2003 ca66853 bbd2003 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 0e902f8 41979e6 ca66853 |
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
import torch
import whisper
from config import settings
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
# Modeli globalde bir kez yükle
_model = whisper.load_model(settings.ASR_MODEL)
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)
def transcribe_file(audio_path: str) -> str:
"""
Verilen ses dosyasını Whisper ile yazıya dönüştürür.
Args:
audio_path: Ses dosyasının yolu
Returns:
str: Transkripsiyon metni
"""
try:
# Whisper ile transkripsiyon
result = _model.transcribe(
audio_path,
language=settings.LANGUAGE,
task="transcribe"
)
# Transkript metnini döndür
return result["text"]
except Exception as e:
print(f"Transkripsiyon hatası: {str(e)}")
return f"Transkripsiyon sırasında bir hata oluştu: {str(e)}"
|