voicecheck-dam / app.py
aaronshtein's picture
Add app.py with DAM model inference
e6f6d69 verified
Raw
History Blame Contribute Delete
1.92 kB
"""VoiceCheck DAM Inference Server
Wraps KintsugiHealth/dam model in a Gradio app with a REST-friendly API.
"""
import io
import json
import tempfile
import os
import gradio as gr
import torch
# ---- Load model at startup ------------------------------------------------
print("Loading KintsugiHealth/dam pipeline...")
from huggingface_hub import snapshot_download
model_dir = snapshot_download("KintsugiHealth/dam")
# Add model dir to path so we can import its modules
import sys
sys.path.insert(0, model_dir)
from pipeline import Pipeline
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
pipe = Pipeline(
checkpoint=os.path.join(model_dir, "dam3.1.ckpt"),
device=device,
)
print("Model loaded successfully!")
# ---- Inference function ----------------------------------------------------
def predict(audio_filepath):
"""Run DAM inference on an audio file."""
if audio_filepath is None:
return json.dumps({"error": "No audio provided"})
try:
result = pipe.run_on_file(audio_filepath, quantize=True)
return json.dumps({
"depression": result["depression"],
"anxiety": result["anxiety"],
})
except Exception as e:
return json.dumps({"error": str(e)})
# ---- Gradio UI ------------------------------------------------------------
with gr.Blocks(title="VoiceCheck DAM Inference") as demo:
gr.Markdown("## VoiceCheck DAM Inference")
gr.Markdown("Upload or record audio (30+ seconds recommended).")
audio_input = gr.Audio(
label="Upload audio or record (30+ seconds recommended)",
type="filepath",
sources=["upload", "microphone"],
)
output = gr.Textbox(label="Analysis Result (JSON)", lines=4)
btn = gr.Button("Analyze", variant="primary")
btn.click(fn=predict, inputs=audio_input, outputs=output)
demo.launch()