import asyncio import gradio as gr import tempfile from pathlib import Path from app.utils import download_video, extract_audio, trim_silence from app.accent_classifier import get_classifier clf = get_classifier() async def _url_pipeline(url: str): with tempfile.TemporaryDirectory() as td: tdir = Path(td) video = await download_video(url, tdir) wav = tdir / "aud.wav" await extract_audio(video, wav) wav = trim_silence(wav) return clf.classify(str(wav)) def analyze_url(url: str): return asyncio.run(_url_pipeline(url)) def analyze_file(file): path = Path(file.name) if path.suffix.lower() in {".mp4", ".mov", ".mkv"}: wav = path.with_suffix(".wav") asyncio.run(extract_audio(path, wav)) else: wav = path wav = trim_silence(wav) return clf.classify(str(wav)) def fmt(res): if not res: return "Analysis failed." return f"**Accent:** {res['accent']}\n\n**Confidence:** {res['confidence']}%" with gr.Blocks(title="English Accent Detector") as demo: gr.Markdown("## REM Waste – Accent Screening Tool") with gr.Tab("From URL"): url_in = gr.Text(label="Public video URL (Loom, MP4, YouTube, …)") btn = gr.Button("Analyze") out = gr.Markdown() btn.click(lambda u: fmt(analyze_url(u)), inputs=url_in, outputs=out) with gr.Tab("Upload File"): file_in = gr.File() btn2 = gr.Button("Analyze") out2 = gr.Markdown() btn2.click(lambda f: fmt(analyze_file(f)), inputs=file_in, outputs=out2) if __name__ == "__main__": demo.launch()