import gradio as gr import os import random from pathlib import Path #################################### # Constants (static data version) #################################### SPACE_ID = os.getenv('SPACE_ID') MAX_SAMPLE_TXT_LENGTH = 300 MIN_SAMPLE_TXT_LENGTH = 10 #################################### # Datos estáticos del leaderboard #################################### leaderboard_data = [ {'name': 'Matxa-TTS', 'upvote': 150, 'downvote': 30}, {'name': 'VITS', 'upvote': 200, 'downvote': 50}, {'name': 'StableTTS', 'upvote': 180, 'downvote': 40}, {'name': 'StyleTTS 2', 'upvote': 100, 'downvote': 20}, {'name': 'XPhoneBert-Matcha-TTS', 'upvote': 90, 'downvote': 15}, {'name': 'Whisper', 'upvote': 170, 'downvote': 25}, {'name': 'Simul-S2ST', 'upvote': 160, 'downvote': 35}, {'name': ' SpeechT5', 'upvote': 140, 'downvote': 25}, ] #################################### # Functions (static version) #################################### def get_leaderboard(): """ Retorna el leaderboard en orden descendente por votos positivos. """ return sorted(leaderboard_data, key=lambda x: x['upvote'], reverse=True) def filter_preliminary(leaderboard, reveal=False): """ Si reveal es True, muestra todos los resultados. Si reveal es False, filtra los modelos con menos de 50 votos combinados. """ if reveal: return leaderboard return [model for model in leaderboard if model['upvote'] + model['downvote'] > 50] def add_random_scores(model): """ Agrega las columnas 'score', 'utmos', 'PESQ', y 'STOI' con valores aleatorios. """ model['score'] = random.randint(0, 100) # Puntuación entre 0 y 100 model['utmos'] = round(random.uniform(1.0, 5.0), 2) # Puntuación entre 1.0 y 5.0 model['PESQ'] = round(random.uniform(1.0, 4.5), 2) # Puntuación entre 1.0 y 4.5 model['STOI'] = round(random.uniform(0.0, 1.0), 2) # Puntuación entre 0.0 y 1.0 return model def update_leaderboard(reveal): """ Actualiza la tabla del leaderboard con base en si se deben mostrar resultados preliminares o no. """ filtered_leaderboard = filter_preliminary(get_leaderboard(), reveal) # Añadir las columnas de puntuaciones aleatorias updated_leaderboard = [add_random_scores(model) for model in filtered_leaderboard] # Ordenar por 'score' y asignar el rank dinámicamente sorted_leaderboard = sorted(updated_leaderboard, key=lambda x: x['score'], reverse=True) # Asignar el rank basado en el orden por score for rank, model in enumerate(sorted_leaderboard): model['rank'] = rank + 1 # rank es la posición en la lista (1-indexed) return [[model['rank'], model['name'], model['score'], model['utmos'], model['PESQ'], model['STOI']] for model in sorted_leaderboard] #################################### # Interfaz con Gradio #################################### theme = gr.themes.Base( font=[gr.themes.GoogleFont('Libre Franklin'), gr.themes.GoogleFont('Public Sans'), 'system-ui', 'sans-serif'], ) with gr.Blocks(theme=theme) as demo: gr.Markdown("# 🏆 Leaderboard\nVote to help the community determine the best Catalan TTS models.\n") reveal_checkbox = gr.Checkbox(label="Reveal preliminary results", value=False) # Inicializa la tabla sin datos, solo con encabezados leaderboard_table = gr.DataFrame(headers=["Rank", "Model", "Score", "UTMOS", "PESQ", "STOI"], datatype=["str", "str", "str", "str", "str", "str"], value=[]) # Al cambiar el valor del checkbox, actualizamos la tabla reveal_checkbox.change(fn=update_leaderboard, inputs=[reveal_checkbox], outputs=[leaderboard_table]) # Lanzar la aplicación demo.queue(api_open=False, default_concurrency_limit=40).launch(show_api=False)