| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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)
|