| import json |
| import os |
| import tempfile |
|
|
| import gradio as gr |
| import gradio_client.utils as gc_utils |
| import pandas as pd |
|
|
| from src import batch |
|
|
| _orig_json_schema_to_python_type = gc_utils._json_schema_to_python_type |
|
|
|
|
| def _safe_json_schema_to_python_type(schema, defs): |
| if isinstance(schema, bool): |
| return "Any" |
| return _orig_json_schema_to_python_type(schema, defs) |
|
|
|
|
| gc_utils._json_schema_to_python_type = _safe_json_schema_to_python_type |
|
|
| RESULT_COLUMNS = [ |
| "name", |
| "emotional_tone", |
| "emotional_intensity", |
| "background_noise_present", |
| "background_noise_type", |
| "background_noise_severity", |
| "audio_quality", |
| "speaker_overlap_present", |
| "long_silence_present", |
| "confidence", |
| ] |
|
|
|
|
| def run_batch(file, progress=gr.Progress()): |
| if file is None: |
| return pd.DataFrame(columns=RESULT_COLUMNS), pd.DataFrame(columns=["file", "error"]), None, None |
|
|
| def on_progress(done, total, name): |
| progress(done / max(total, 1), desc=f"Analyzing {name} ({done}/{total})") |
|
|
| results_df, errors = batch.process_batch(file.name, on_progress=on_progress) |
| if results_df.empty: |
| results_df = pd.DataFrame(columns=RESULT_COLUMNS) |
| errors_df = pd.DataFrame(errors) if errors else pd.DataFrame(columns=["file", "error"]) |
|
|
| out_dir = tempfile.mkdtemp() |
| csv_path = os.path.join(out_dir, "results.csv") |
| json_path = os.path.join(out_dir, "results.json") |
| results_df.to_csv(csv_path, index=False) |
| with open(json_path, "w") as f: |
| json.dump(results_df.to_dict(orient="records"), f, indent=2) |
|
|
| return results_df, errors_df, csv_path, json_path |
|
|
|
|
| with gr.Blocks(title="AutoAce Voice Tone & Background Noise") as demo: |
| gr.Markdown( |
| "# AutoAce Voice Tone & Background Noise Dashboard\n" |
| "Upload a `.zip` containing the audio files and a `labels.csv` / manifest " |
| "at the root (manifest is optional for unlabeled batches). " |
| "Supported audio: wav, mp3, ogg, flac, m4a." |
| ) |
| upload = gr.File(label="Evaluation batch (.zip)", file_types=[".zip"]) |
| run_btn = gr.Button("Run analysis", variant="primary") |
|
|
| results_table = gr.Dataframe(label="Results", headers=RESULT_COLUMNS, wrap=True) |
| errors_table = gr.Dataframe(label="Errors / skipped files", headers=["file", "error"], wrap=True) |
|
|
| with gr.Row(): |
| csv_out = gr.File(label="Download results.csv") |
| json_out = gr.File(label="Download results.json") |
|
|
| run_btn.click(run_batch, inputs=[upload], outputs=[results_table, errors_table, csv_out, json_out]) |
|
|
|
|
| if __name__ == "__main__": |
| user = os.environ.get("AUTOACE_USER", "autoace") |
| password = os.environ.get("AUTOACE_PASSWORD") |
| auth = (user, password) if password else None |
| demo.queue().launch(auth=auth, server_name="0.0.0.0", show_api=False) |
|
|