Spaces:
Running
Running
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 | |
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) |