Challenge_Task / app /main.py
abdullah0101's picture
Add full application code and deps
3859913
from fastapi import FastAPI, UploadFile, File, HTTPException
from pydantic import BaseModel
from pathlib import Path
import tempfile
import asyncio
from .utils import download_video, extract_audio, trim_silence
from .accent_classifier import get_classifier
api = FastAPI()
class URLBody(BaseModel):
url: str
@api.post("/analyze/url")
async def analyze_url(body: URLBody):
with tempfile.TemporaryDirectory() as td:
tdir = Path(td)
video = await download_video(body.url, tdir)
wav = tdir / "aud.wav"
await extract_audio(video, wav)
wav = trim_silence(wav)
return get_classifier().classify(str(wav))
@api.post("/analyze/upload")
async def analyze_upload(file: UploadFile = File(...)):
if not file.content_type.startswith(("audio", "video")):
raise HTTPException(400, "Unsupported file type")
with tempfile.NamedTemporaryFile(delete=False, suffix=file.filename) as tmp:
tmp.write(await file.read())
tmp.flush()
path = Path(tmp.name)
if file.content_type.startswith("video"):
wav = path.with_suffix(".wav")
await extract_audio(path, wav)
else:
wav = path
wav = trim_silence(wav)
return get_classifier().classify(str(wav))
@api.get("/healthz")
async def health():
return {"status": "ok"}