from fastapi import FastAPI, Depends, HTTPException, Security, status, UploadFile, File from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from fastapi.middleware.cors import CORSMiddleware import gradio as gr import os import tempfile import json from typing import Optional from preprocessing import clean_audio from asr import transcribe_file, MedicalASR from diarization import diarize_segments from privacy import MedicalPrivacyProcessor from config import settings # 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 ASR API") # CORS ayarları app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # ASR modeli için bağımlılık def get_asr_model(): config = { "language": "tr", "model": settings.ASR_MODEL, "domain": "medical" } return MedicalASR(config) # API endpoint'i @app.post("/api/v1/transcribe") async def transcribe_audio_api( file: UploadFile = File(...), diarize: bool = True, enhance_audio: bool = True, anonymize: Optional[bool] = None, asr_model: MedicalASR = Depends(get_asr_model) ): try: # Geçici dosya oluştur with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_file: temp_file.write(await file.read()) temp_file_path = temp_file.name # Transkripsiyon yap result = asr_model.transcribe( temp_file_path, speaker_diarization=diarize, enhance_audio=enhance_audio ) # Geçici dosyayı temizle os.unlink(temp_file_path) return result except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # Gradio arayüzü def transcribe_audio(audio_file, diarize=True, enhance_audio=True, anonymize=True): """Ses dosyasını transkribe eder""" try: if audio_file is None: return "Lütfen bir ses dosyası yükleyin." # ASR modelini oluştur asr_model = get_asr_model() # Transkripsiyon yap result = asr_model.transcribe( audio_file, speaker_diarization=diarize, enhance_audio=enhance_audio ) # Sonuçları formatla output = "📝 Transkripsiyon:\n\n" if "diarization" in result: # Konuşmacı bazlı transkripsiyon for segment in result["diarization"]: output += f"🗣️ {segment['speaker']} ({segment['start']:.1f}s - {segment['end']:.1f}s):\n" output += f"{segment['text']}\n\n" else: # Düz transkripsiyon output += result["text"] if result.get("anonymized"): output += "\n🔒 Kişisel veriler anonimleştirildi." return output except Exception as e: return f"Bir hata oluştu: {str(e)}" # Gradio arayüzünü oluştur with gr.Blocks(title="Tıbbi Konuşma Transkripsiyon Servisi") as demo: gr.Markdown(""" # 🏥 Tıbbi Konuşma Transkripsiyon Servisi Bu servis, doktor vizitelerindeki konuşmaları yazıya döker ve konuşmacıları ayırt eder. """) with gr.Row(): with gr.Column(): audio_input = gr.Audio( label="Ses Dosyası", type="filepath", source="upload" ) with gr.Row(): diarize = gr.Checkbox(label="Konuşmacı Ayrımı", value=True) enhance = gr.Checkbox(label="Ses İyileştirme", value=True) anonymize = gr.Checkbox(label="Kişisel Verileri Anonimleştir", value=True) submit_btn = gr.Button("Transkribe Et", variant="primary") with gr.Column(): output_text = gr.Textbox( label="Transkripsiyon Sonucu", lines=10 ) # Buton tıklama olayı submit_btn.click( fn=transcribe_audio, inputs=[audio_input, diarize, enhance, anonymize], outputs=output_text ) # Uygulamayı başlat if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)