VoiceToWrite / app.py
Seicas's picture
Update app.py
bb27d06 verified
raw
history blame
5.1 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
import spacy
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)
# SpaCy modelini yükle
def load_tr_spacy():
try:
return spacy.load("tr_core_news_md")
except OSError:
# Model yoksa indir
import subprocess, sys
subprocess.check_call([sys.executable, "-m", "spacy", "download", "tr_core_news_md"])
return spacy.load("tr_core_news_md")
# SpaCy modelini başlangıçta yükle
nlp = load_tr_spacy()
# 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():
# Eski gr.Audio yerine gr.inputs.Audio kullan
from gradio.inputs import Audio as AudioInput
audio_input = AudioInput(type="filepath")
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)