TelmaG's picture
Add Gradio Audio Inference w/ clean messages
0a6a835
import gradio as gr
import os
import subprocess
import tempfile
from pathlib import Path
from inference import AudioClassifier, Config
# Load classifier config
config = Config(
yamnet_model_path="yamnet/yamnet.h5",
yamnet_classes_path="yamnet/yamnet_class_map.csv",
model_path="model/model.h5",
custom_classes_path="model/model.npy",
output_dir="results",
output_file="classification.txt"
)
classifier = AudioClassifier(config)
NON_WAV_FORMATS = {".mp3", ".m4a", ".aac", ".flac", ".ogg", ".wma", ".aiff", ".ape", ".opus"}
def convert_to_wav(input_path: str) -> str:
output_path = tempfile.NamedTemporaryFile(delete=False, suffix=".wav").name
cmd = ["ffmpeg", "-y", "-i", input_path, "-acodec", "pcm_s16le", "-ar", "44100", "-ac", "1", output_path]
subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
return output_path
def classify_audio(audio_path):
messages = []
ext = Path(audio_path).suffix.lower()
if ext != ".wav":
messages.append(f"🔁 Converting `{ext}` file to WAV format...")
try:
audio_path = convert_to_wav(audio_path)
messages.append("✅ Conversion successful.")
except Exception as e:
return f"❌ Failed to convert file to WAV.\n\n**Error:** {str(e)}"
messages.append("🔎 Running inference using YAMNet + fine-tuned model...")
try:
result = classifier.classify_file(audio_path)
except Exception as e:
return f"❌ Inference failed.\n\n**Error:** {str(e)}"
label = result["dominant_label"]
score = result["dominant_score_percentage"]
messages.append(f"🎧 **Detected:** `{label}` with **{score}%** confidence.")
return "\n\n".join(messages)
def upload_message(file):
return (
"📥 **Audio uploaded successfully!**\n\n"
"▶️ You can now listen to the uploaded audio.\n"
"🧠 Click **Submit** and Inference will run shortly."
)
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("## 🐝 AI-Belha Classifier\nClassify Queen Bee Status in beehives using YAMNet + Fine-Tuned Model.")
with gr.Row():
audio_input = gr.Audio(type="filepath", label="Upload audio file")
output_box = gr.Markdown()
audio_input.upload(fn=upload_message, inputs=audio_input, outputs=output_box)
with gr.Row():
submit_btn = gr.Button("🚀 Submit for Inference")
submit_btn.click(fn=classify_audio, inputs=audio_input, outputs=output_box)
demo.launch()