from fastapi import APIRouter, UploadFile, File, Depends, HTTPException, Query from fastapi.responses import JSONResponse from preprocessing import clean_audio from asr import transcribe_file, MedicalASR from diarization import diarize_segments from privacy import MedicalPrivacyProcessor from config import settings from typing import Optional import tempfile, os, uuid from fastapi.concurrency import run_in_threadpool router = APIRouter() # Gizlilik işlemcisi privacy_processor = MedicalPrivacyProcessor() def get_asr_model(): """ASR modelini oluşturur ve döndürür""" config = { "language": "tr", "model": settings.ASR_MODEL, "domain": "medical" } return MedicalASR(config) @router.post("/transcribe") async def transcribe_audio( file: UploadFile = File(...), diarize: bool = True, enhance_audio: bool = True, anonymize: Optional[bool] = Query(None, description="Kişisel verileri anonimleştir"), asr_model: MedicalASR = Depends(get_asr_model) ): """Ses dosyasını transkribe eder""" 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 # CPU/GPU yoğun işlemi thread pool'da çalıştır result = await run_in_threadpool( asr_model.transcribe, temp_file_path, speaker_diarization=diarize, enhance_audio=enhance_audio ) # Geçici dosyayı temizle os.unlink(temp_file_path) # Kişisel veri anonimleştirme # Eğer açıkça belirtilmediyse uygulama konfigürasyonuna göre davran should_anonymize = anonymize if anonymize is not None else app.state.asr_config.get("anonymize_data", True) identified_data = {} if should_anonymize: # Ana metni anonimleştir anonymized_text, main_data = privacy_processor.anonymize_text(result["text"]) result["text"] = anonymized_text identified_data.update(main_data) # Diyarizasyon segmentlerini anonimleştir if "diarization" in result: for segment in result["diarization"]: if segment["text"]: anonymized_segment, segment_data = privacy_processor.anonymize_text(segment["text"]) segment["text"] = anonymized_segment # Her segment için tespit edilen verileri güncelle for key, values in segment_data.items(): identified_data.setdefault(key, []).extend(values) # Tespit edilen verileri güvenli şekilde sakla # NOT: Gerçek uygulamada bu verileri şifreli bir veritabanında saklayın session_id = str(uuid.uuid4()) # Burada verileri güvenli bir şekilde saklama kodunuz olacak # Yanıtta tespit edilen veri tipleri hakkında bilgi ver result["anonymized"] = True result["identified_data_types"] = {k: len(v) for k, v in identified_data.items() if v} result["session_id"] = session_id return JSONResponse(content=result) except Exception as e: raise HTTPException(status_code=500, detail=f"Transkripsiyon hatası: {str(e)}")