from fastapi import FastAPI, UploadFile, File from fastapi.responses import JSONResponse from fastapi.middleware.cors import CORSMiddleware from starlette.staticfiles import StaticFiles from pathlib import Path from .translate_pipeline import process_audio_file, AUDIO_DIR from .train_translate import train_from_local_dataset app = FastAPI(title="ML API - Speech-to-Speech") # CORS (peut être ajusté via env WEB_ORIGIN si nécessaire) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Fichiers statiques pour audio AUDIO_DIR.mkdir(parents=True, exist_ok=True) app.mount("/audio", StaticFiles(directory=str(AUDIO_DIR)), name="audio") @app.get("/health") def health(): return {"status": "ok"} @app.post("/translate") async def translate(file: UploadFile = File(...)): data = await file.read() result = process_audio_file(data, file.filename) return JSONResponse(result) @app.post("/train") def train(): out_dir = train_from_local_dataset() return {"status": "ok", "model_path": out_dir} @app.post("/predict") async def predict_compat(file: UploadFile = File(None)): """ Endoint de compatibilité: si on reçoit un fichier audio, traite comme /translate. Sinon, renvoie un message d’orientation. """ if file is not None: data = await file.read() result = process_audio_file(data, file.filename) return JSONResponse(result) return JSONResponse({"detail": "Utilisez /translate pour la traduction vocale."}, status_code=400)