import os import tempfile import json import time import gradio as gr import spacy import subprocess from preprocessing import clean_audio from asr import transcribe_file from diarization import diarize_segments from privacy import MedicalPrivacyProcessor from config import settings from typing import Tuple, Dict from pydub import AudioSegment # HuggingFace token'ını ayarla HF_TOKEN = os.getenv("HF_TOKEN", "") if not HF_TOKEN: print("Warning: HF_TOKEN not set!") def load_spacy_model(): """Load SpaCy model with graceful fallback to blank model""" import spacy from config import settings try: # Önce tam modeli yüklemeyi dene return spacy.load(settings.SPACY_MODEL) except OSError: # Model yüklenemezse blank model kullan print(f"[warning] SpaCy model '{settings.SPACY_MODEL}' yüklenemedi; fallback olarak blank('tr') kullanılıyor.") return spacy.blank("tr") # SpaCy modelini yükle nlp = load_spacy_model() # Yardım metni usage_tips = """ ## Kullanım İpuçları 1. **Dosya formatı**: WAV formatında ses dosyaları en iyi sonuçları verir. 2. **Ses kalitesi**: Gürültüsüz ortamlarda kaydedilen sesler daha iyi sonuç verir. 3. **Konuşmacı ayrımı**: Konuşmacı sayısı arttıkça tanıma doğruluğu düşebilir. 4. **Hata durumlarında**: Sistem hata verirse, ses dosyasının formatını ve boyutunu kontrol edin. ## Pediatrik Uzmanlar İçin Sistem, çocuk hastalıkları, aşılar, ilaçlar ve muayene terimleri içeren geniş bir tıbbi terim sözlüğü kullanır. Bu sayede pediatri vizitelerindeki terminolojinin doğru transkribe edilmesini sağlar. """ # CSS stilleri css = """ .container {padding: 20px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);} .result-text {margin-top: 10px; padding: 15px; background: #f8f9fa; border-radius: 5px; white-space: pre-wrap;} .speaker {font-weight: bold; color: #1a5fb4;} .timestamp {color: #666; font-size: 0.9em;} .success {color: green; font-weight: bold;} .error {color: red; font-weight: bold;} .footer {margin-top: 50px; text-align: center; color: #666; font-size: 0.9em;} .tips {background: #e7f5ff; padding: 15px; border-radius: 5px; margin-top: 20px;} """ def enhance_audio(audio: AudioSegment) -> AudioSegment: """Ses kalitesini iyileştir""" # Basit ses iyileştirme: normalize et return audio.normalize() def diarize_speakers(audio_path: str) -> list: """Konuşmacıları ayır""" # TODO: Gerçek diarization implementasyonu return [] def transcribe_audio(audio_path: str, diarization: list = None) -> Dict: """Ses dosyasını metne çevir""" # TODO: Gerçek transkripsiyon implementasyonu return { "text": "Örnek transkripsiyon metni", "segments": [] } def anonymize_personal_info(result: Dict) -> Dict: """Kişisel bilgileri anonimleştir""" # TODO: Gerçek anonimleştirme implementasyonu return result def process_audio( audio_path: str, diarize: bool = True, enhance: bool = True, anonymize: bool = True ) -> str: """ Ses dosyasını işleyip transkripsiyon yapar. Args: audio_path: Ses dosyasının yolu diarize: Konuşmacı ayrımı yapılsın mı? enhance: Ses iyileştirme yapılsın mı? anonymize: Kişisel veriler anonimleştirilsin mi? Returns: str: Transkripsiyon metni """ if not audio_path: return "Lütfen bir ses dosyası yükleyin." try: # Ses dosyasını WAV formatına çevir base, ext = os.path.splitext(audio_path) wav_path = base + ".wav" audio = AudioSegment.from_file(audio_path) # Ses iyileştirme if enhance: audio = enhance_audio(audio) audio.export(wav_path, format="wav") else: audio.export(wav_path, format="wav") # Konuşmacı ayrımı if diarize: diarization = diarize_speakers(wav_path) else: diarization = None # Transkripsiyon transcript = transcribe_file(wav_path) # Anonimleştirme if anonymize: transcript = anonymize_personal_info({"text": transcript})["text"] return transcript except Exception as e: error_msg = f"İşlem sırasında bir hata oluştu: {str(e)}" print(error_msg) return error_msg # Ana arayüz with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo", secondary_hue="blue"), css=css) as demo: gr.HTML(f"""
Çocuk doktorları için geliştirilmiş, pediatri alanına özel tıbbi terminoloji tanıma özellikli transkripsiyon sistemi
Bu demo uygulaması yalnızca eğitim amaçlıdır ve gerçek hasta verilerinin işlenmesi için tasarlanmamıştır. Lütfen hasta bilgisi içeren ses kayıtlarını yüklemeyin. Sistemde paylaşılan ses kayıtları üçüncü şahıslar tarafından erişilebilir ve gizlilik/güvenlik garantisi yoktur.
Bu aracı kullanarak, yüklediğiniz verilerin Hugging Face Kullanım Koşulları'na uygun olduğunu kabul etmiş olursunuz.