faster-whisper / app.py
cabanemaths's picture
Update app.py
8f4fdca verified
from fastapi import FastAPI, UploadFile, File, Form
from faster_whisper import WhisperModel
import tempfile
import shutil
import os
import torch
from fastapi.middleware.cors import CORSMiddleware
import time
device = "cuda" if torch.cuda.is_available() else "cpu"
compute_type = "float16" if device=="cuda" else "int8"
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://www.cabane-data.fr", "https://www.cabane-data.fr"], # à restreindre à ton domaine
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
AVAILABLE_MODELS = ["tiny", "base", "small", "medium", "large-v2"]
def load_model(model_name: str):
return WhisperModel(model_name, device=device, compute_type=compute_type)
@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...), model_name: str = Form("base")):
if model_name not in AVAILABLE_MODELS:
return {"error": f"Modèle non reconnu. Choisissez parmi {AVAILABLE_MODELS}"}
start = time.time()
model = load_model(model_name)
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp:
shutil.copyfileobj(file.file, tmp)
tmp_path = tmp.name
segments, info = model.transcribe(tmp_path, beam_size=5)
text_result = " ".join([s.text for s in segments])
os.remove(tmp_path)
end = time.time()
duration = round(end - start, 2)
return {
"text": text_result,
"duration": duration,
"model_used": model_name
}