VoiceToWrite / app.py
Seicas's picture
Update app.py
071b666 verified
raw
history blame
4.69 kB
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)