import gradio as gr import pandas as pd import requests from pathlib import Path from datetime import datetime, timezone import time import logging import os logging.basicConfig(level=logging.INFO) # Update URL format for HuggingFace Spaces QUEUE_SPACE_URL = os.getenv( 'QUEUE_SPACE_URL', 'https://koellabs-ipa-transcription-en-queue.hf.space' ).rstrip('/') LAST_UPDATED = "Dec 4th 2024" def load_leaderboard_data(): try: response = requests.get(f"{QUEUE_SPACE_URL}/api/leaderboard") logging.info(f"Leaderboard request URL: {QUEUE_SPACE_URL}/api/leaderboard") response.raise_for_status() return pd.DataFrame(response.json()) except requests.RequestException as e: logging.error(f"Error loading leaderboard: {e}") # Fallback to static leaderboard if available try: return pd.read_json(Path("fake_queue/leaderboard.json")) except: return pd.DataFrame() def format_leaderboard_df(df): if df.empty: return df display_df = pd.DataFrame({ "Model": df["model"], "Average PER ⬇️": df["average_per"].apply(lambda x: f"{x:.4f}"), "Average PWED ⬇️": df["average_pwed"].apply(lambda x: f"{x:.4f}"), "GitHub": df["github_url"].apply(lambda x: f'Repository' if x else "N/A"), "Submission Date": pd.to_datetime(df["submission_date"]).dt.strftime("%Y-%m-%d") }) return display_df.sort_values("Average PER ⬇️") def submit_evaluation(model_name, submission_name, github_url): if not model_name or not submission_name: return "⚠️ Please provide both model name and submission name." request_data = { "transcription_model": model_name, "subset": "test", "submission_name": submission_name, "github_url": github_url if github_url else None } try: response = requests.post(f"{QUEUE_SPACE_URL}/api/evaluate", json=request_data) logging.info(f"Submit request URL: {QUEUE_SPACE_URL}/api/evaluate") response.raise_for_status() task_id = response.json()["task_id"] return f"✅ Evaluation submitted successfully! Task ID: {task_id}" except requests.RequestException as e: return f"❌ Error: {str(e)}" def check_task_status(task_id): if not task_id: return "Please enter a task ID" try: response = requests.get(f"{QUEUE_SPACE_URL}/api/tasks/{task_id}") logging.info(f"Status check URL: {QUEUE_SPACE_URL}/api/tasks/{task_id}") response.raise_for_status() return response.json() except requests.RequestException as e: return f"Error checking status: {str(e)}" def create_html_table(df): return df.to_html(escape=False, index=False, classes="styled-table") with gr.Blocks(css=""" .styled-table { width: 100%; border-collapse: collapse; margin: 25px 0; font-size: 0.9em; font-family: sans-serif; box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); } .styled-table thead tr { background-color: #009879; color: #ffffff; text-align: left; } .styled-table th, .styled-table td { padding: 12px 15px; } .styled-table tbody tr { border-bottom: 1px solid #dddddd; } """) as demo: gr.Markdown("# 🎯 Phonemic Transcription Model Evaluation Leaderboard") with gr.Tabs(): with gr.TabItem("🏆 Leaderboard"): leaderboard_html = gr.HTML(create_html_table(format_leaderboard_df(load_leaderboard_data()))) refresh_btn = gr.Button("🔄 Refresh") refresh_btn.click( lambda: create_html_table(format_leaderboard_df(load_leaderboard_data())), outputs=leaderboard_html ) with gr.TabItem("📝 Submit Model"): model_name = gr.Textbox(label="Model Name", placeholder="facebook/wav2vec2-lv-60-espeak-cv-ft") submission_name = gr.Textbox(label="Submission Name", placeholder="My Model v1.0") github_url = gr.Textbox(label="GitHub URL (optional)", placeholder="https://github.com/username/repo") submit_btn = gr.Button("Submit") result = gr.Textbox(label="Submission Status") submit_btn.click( submit_evaluation, inputs=[model_name, submission_name, github_url], outputs=result ) with gr.TabItem("📊 Task Status"): task_id = gr.Textbox(label="Task ID") status_btn = gr.Button("Check Status") status_output = gr.JSON(label="Status") status_btn.click( check_task_status, inputs=task_id, outputs=status_output ) if __name__ == "__main__": demo.launch()