ANAMARIAMAGALHAES's picture
Create app.py
c9ddb18 verified
import gradio as gr
import os
import subprocess
import librosa
from transformers import pipeline
import requests
import yt_dlp
MODEL_ID = "HamzaSidhu786/speech-accent-detection"
TEMP_VIDEO = "temp_video.mp4"
TEMP_AUDIO = "temp_audio.wav"
FFMPEG_PATH = "ffmpeg"
clf = pipeline("audio-classification", model=MODEL_ID)
def download_from_url(url):
if url.startswith("http"):
if "youtube.com" in url or "youtu.be" in url:
ydl_opts = {"format": "mp4", "outtmpl": TEMP_VIDEO, "quiet": True}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
else:
r = requests.get(url, stream=True)
with open(TEMP_VIDEO, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
elif os.path.exists(url):
return url
else:
raise Exception("Invalid path or URL.")
return TEMP_VIDEO
def extract_audio(video_path):
cmd = [FFMPEG_PATH, "-i", video_path, "-t", "40", "-ac", "1", "-ar", "16000", "-y", TEMP_AUDIO]
subprocess.run(cmd, check=True)
return TEMP_AUDIO
def predict_accent(audio_path):
audio, sr = librosa.load(audio_path, sr=16000)
clip = audio[:sr * 10]
results = clf(clip)
top = max(results, key=lambda x: x["score"])
return f"Accent: {top['label']} | Confidence: {top['score']*100:.2f}%"
def accent_from_upload(file):
try:
extract_audio(file)
return predict_accent(TEMP_AUDIO)
finally:
cleanup()
def accent_from_url(url):
try:
video_path = download_from_url(url)
extract_audio(video_path)
return predict_accent(TEMP_AUDIO)
finally:
cleanup()
def cleanup():
for f in (TEMP_VIDEO, TEMP_AUDIO):
if os.path.exists(f):
os.remove(f)
with gr.Blocks() as demo:
gr.Markdown("## English Accent Detection (Upload, Path or URL)")
with gr.Tab("Upload File"):
file_input = gr.File(type="filepath")
output1 = gr.Textbox(label="Detected Accent")
btn1 = gr.Button("Detect")
btn1.click(fn=accent_from_upload, inputs=file_input, outputs=output1)
with gr.Tab("From URL or Path"):
url_input = gr.Textbox(label="Enter a video URL or local path")
output2 = gr.Textbox(label="Detected Accent")
btn2 = gr.Button("Detect")
btn2.click(fn=accent_from_url, inputs=url_input, outputs=output2)
if __name__ == "__main__":
demo.launch()