import gradio as gr import os import tempfile import json import time from fastapi import FastAPI, UploadFile, Depends, HTTPException, Security, status from fastapi.security import OAuth2PasswordBearer import uvicorn from fastapi.middleware.cors import CORSMiddleware from routes import transcribe_audio as transcribe_endpoint # HuggingFace token'ını ayarla (kullanıcının kendi token'ını eklemesini sağla) os.environ["HF_TOKEN"] = os.environ.get("HF_TOKEN", "") os.environ["ENVIRONMENT"] = "production" # Arayüz konfigürasyonu THEME = gr.themes.Soft( primary_hue="indigo", secondary_hue="blue", ) LOGO = "assets/pediatric_logo.png" # Logo ekleyin (opsiyonel) # FastAPI uygulaması app = FastAPI(title="Pediatrik Transkripsiyon API") # Gradio arayüzü için fonksiyon async def process_audio(audio_file, diarize, enhance, anonymize, progress=gr.Progress()): if not audio_file: return {"error": "Lütfen bir ses dosyası yükleyin."}, None progress(0, desc="Ses dosyası hazırlanıyor...") # Geçici dosya oluştur with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio: temp_audio.write(audio_file) temp_path = temp_audio.name # FastAPI'nin beklediği UploadFile oluştur try: upload_file = UploadFile(filename="audio.wav", file=open(temp_path, "rb")) except Exception as e: os.unlink(temp_path) return {"error": f"Dosya açılamadı: {str(e)}"}, None # Endpoint'i çağır try: progress(0.1, desc="Ses iyileştiriliyor...") result = await transcribe_endpoint( file=upload_file, diarize=diarize, enhance_audio=enhance, anonymize=anonymize ) # JSON'a dönüştür progress(0.9, desc="Sonuçlar hazırlanıyor...") result_dict = json.loads(result.body) # Dosyayı temizle os.unlink(temp_path) # Metin sonucunu ayıkla full_text = result_dict.get("text", "") # Diyarizasyon sonuçlarını formatlı metne dönüştür formatted_text = "" if diarize and "diarization" in result_dict: for segment in result_dict["diarization"]: speaker = segment["speaker"] text = segment["text"] start = segment["start"] end = segment["end"] formatted_text += f"[{speaker}] ({start:.1f}s - {end:.1f}s): {text}\n\n" progress(1.0, desc="Tamamlandı!") return result_dict, formatted_text or full_text except Exception as e: os.unlink(temp_path) return {"error": f"İşlem sırasında hata: {str(e)}"}, None # Onay kontrolü fonksiyonu def check_agreement(agreement, *args): if not agreement: return {"error": "Devam etmek için gizlilik koşullarını kabul etmelisiniz."}, "Lütfen gizlilik koşullarını kabul edin." return process_audio(*args) # 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 Konuşma İçin Öneriler - Muayene sırasında arka planda gürültü olmamasına dikkat edin - Mikrofonu doğru konumlandırın - Konuşmaların üst üste binmemesine özen gösterin - 10 dakikadan uzun kayıtlarda sistem performansı düşebilir """ # Gradio arayüzünü oluştur with gr.Blocks(theme=THEME) as demo: gr.HTML("""

🩺 Türkçe Pediatrik Konuşma Tanıma

Çocuk doktorları için geliştirilmiş, pediatri alanına özel tıbbi terminoloji tanıma özellikli transkripsiyon sistemi

""") with gr.Row(): with gr.Column(scale=1): audio_input = gr.Audio( label="Ses Dosyası Yükleyin veya Kaydedin", type="filepath", elem_classes="container" ) with gr.Group(): with gr.Row(): diarize = gr.Checkbox(value=True, label="Konuşmacı Ayrımı") enhance = gr.Checkbox(value=True, label="Ses İyileştirme") with gr.Row(): anonymize = gr.Checkbox(value=True, label="Kişisel Verileri Anonimleştir") clear_btn = gr.Button("Temizle", variant="secondary") process_btn = gr.Button("Transkribe Et", variant="primary") gr.HTML('
💡 İpucu: En iyi sonuçlar için gürültüsüz ortamlarda kayıt yapın.
') with gr.Column(scale=2, elem_classes="container"): with gr.Tabs(): with gr.TabItem("Konuşma Metni"): result_text = gr.Markdown(label="Transkripsiyon Sonucu", elem_classes="result-text") with gr.TabItem("JSON Sonucu"): json_output = gr.JSON(label="API Yanıtı") with gr.TabItem("Kullanım Kılavuzu"): gr.Markdown(usage_tips) status = gr.Markdown("Sistem hazır.") # Uyarı mesajı ekleyin (HTML içine) gr.HTML("""

⚠️ Önemli Gizlilik Uyarısı

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.

""") # İzin onayı ekleyin with gr.Group(): privacy_agreement = gr.Checkbox(label="Gizlilik koşullarını okudum ve kabul ediyorum", value=False) # Olayları bağla process_btn.click( fn=check_agreement, inputs=[privacy_agreement, audio_input, diarize, enhance, anonymize], outputs=[json_output, result_text] ) clear_btn.click( lambda: (None, None, "Sistem hazır."), outputs=[audio_input, result_text, status] ) gr.HTML(""" """) # FastAPI'yi Gradio ile bağla app = gr.mount_gradio_app(app, demo, path="/") # Hem FastAPI hem de Gradio'yu başlat if __name__ == "__main__": # Token var mı kontrol et if not os.environ.get("HF_TOKEN"): print("⚠️ UYARI: HF_TOKEN çevresel değişkeni ayarlanmamış! Diyarizasyon çalışmayabilir.") try: uvicorn.run(app, host="0.0.0.0", port=7860) except Exception as e: print(f"Başlatma hatası: {str(e)}")