Steveeeeeeen's picture
Steveeeeeeen HF staff
Update app.py
7c8dfad verified
import gradio as gr
import pandas as pd
import json
import os
from constants import LEADERBOARD_CSS, EXPLANATION, EXPLANATION_EDACC, EXPLANATION_AFRI
from init import is_model_on_hub, upload_file, load_all_info_from_dataset_hub
from utils_display import AutoEvalColumn, fields, make_clickable_model, styled_error, styled_message
from datetime import datetime, timezone
from huggingface_hub import HfApi, upload_file
LAST_UPDATED = "Nov 22th 2024"
column_names = {
"model": "Model",
"Average WER ⬇️": "Average WER ⬇️",
"Average Female WER ⬇️": "Average Female WER ⬇️",
"Average Male WER ⬇️": "Average Male WER ⬇️",
"RTFx": "RTFx ⬆️️",
"Bulgarian_female": "Bulgarian female",
"Bulgarian_male": "Bulgarian male",
"Catalan_female": "Catalan female",
"Chinese_female": "Chinese female",
"Chinese_male": "Chinese male",
"Eastern_European_male": "Eastern European male",
"European_male": "European male",
"French_female": "French female",
"Ghanain_English_female": "Ghanain English female",
"Indian_English_female": "Indian English female",
"Indian_English_male": "Indian English male",
"Indonesian_female": "Indonesian female",
"Irish_English_female": "Irish English female",
"Irish_English_male": "Irish English male",
"Israeli_male": "Israeli male",
"Italian_female": "Italian female",
"Jamaican_English_female": "Jamaican English female",
"Jamaican_English_male": "Jamaican English male",
"Kenyan_English_female": "Kenyan English female",
"Kenyan_English_male": "Kenyan English male",
"Latin_American_female": "Latin American female",
"Latin_American_male": "Latin American male",
"Lithuanian_male": "Lithuanian male",
"Mainstream_US_English_female": "Mainstream US English female",
"Mainstream_US_English_male": "Mainstream US English male",
"Nigerian_English_female": "Nigerian English female",
"Nigerian_English_male": "Nigerian English male",
"Romanian_female": "Romanian female",
"Scottish_English_male": "Scottish English male",
"Southern_British_English_male": "Southern British English male",
"Spanish_female": "Spanish female",
"Spanish_male": "Spanish male",
"Vietnamese_female": "Vietnamese female",
"Vietnamese_male": "Vietnamese male",
"agatu_test": "Agatu",
"angas_test": "Angas",
"bajju_test": "Bajju",
"bini_test": "Bini",
"brass_test": "Brass",
"delta_test": "Delta",
"eggon_test": "Eggon",
"ekene_test": "Ekene",
"ekpeye_test": "Ekpeye",
"gbagyi_test": "Gbagyi",
"igarra_test": "Igarra",
"ijaw-nembe_test": "Ijaw-Nembe",
"ikulu_test": "Ikulu",
"jaba_test": "Jaba",
"jukun_test": "Jukun",
"khana_test": "Khana",
"mada_test": "Mada",
"mwaghavul_test": "Mwaghavul",
"ukwuani_test": "Ukwuani",
"yoruba-hausa_test": "Yoruba-Hausa",
}
african_cols = ["Ghanain English female", "Kenyan English female", "Kenyan English male", "Nigerian English female", "Nigerian English male"]
north_american_cols = ["Mainstream US English female", "Mainstream US English male"]
caribbean_cols = ["Jamaican English female", "Jamaican English male"]
latin_american_cols = ["Latin American female", "Latin American male"]
british_cols = ["Irish English female", "Irish English male", "Scottish English male", "Southern British English male"]
european_cols = ["Eastern European male", "European male", "French female", "Italian female", "Spanish female", "Spanish male", "Catalan female", "Bulgarian female", "Bulgarian male", "Lithuanian male", "Romanian female"]
asian_cols = ["Chinese female", "Chinese male", "Indonesian female", "Vietnamese female", "Vietnamese male", "Indian English female", "Indian English male"]
eval_queue_repo_edacc, requested_models, csv_results_edacc, csv_results_afrispeech = load_all_info_from_dataset_hub()
if not csv_results_edacc.exists():
raise Exception(f"CSV file {csv_results_edacc} does not exist locally")
# Get csv with data and parse columns
original_df = pd.read_csv(csv_results_edacc)
afrispeech_df = pd.read_csv(csv_results_afrispeech)
# Formats the columns
def formatter(x):
if type(x) is str:
x = x
else:
x = round(x, 2)
return x
for col in original_df.columns:
if col == "model":
original_df[col] = original_df[col].apply(lambda x: x.replace(x, make_clickable_model(x)))
else:
original_df[col] = original_df[col].apply(formatter) # For numerical values
for col in afrispeech_df.columns:
if col == "model":
afrispeech_df[col] = afrispeech_df[col].apply(lambda x: x.replace(x, make_clickable_model(x)))
else:
afrispeech_df[col] = afrispeech_df[col].apply(formatter) # For numerical values
original_df.rename(columns=column_names, inplace=True)
original_df.sort_values(by='Average WER ⬇️', inplace=True)
afrispeech_df.rename(columns=column_names, inplace=True)
afrispeech_df.sort_values(by='Average WER ⬇️', inplace=True)
female_cols = [col for col in original_df.columns if 'female' == col.split(' ')[-1]]
male_cols = [col for col in original_df.columns if 'male' == col.split(' ')[-1]]
# Create male DataFrame properly
male_df = original_df[['Model'] + male_cols].copy() # Create explicit copy with model column
male_df.loc[:, 'Average Male WER ⬇️'] = male_df[male_cols].mean(axis=1)
male_df.loc[:, 'Average Male WER ⬇️'] = male_df['Average Male WER ⬇️'].apply(formatter)
male_df = male_df[['Model', 'Average Male WER ⬇️'] + male_cols]
# Create female DataFrame properly
female_df = original_df[['Model'] + female_cols].copy() # Create explicit copy with model column
female_df.loc[:, 'Average Female WER ⬇️'] = female_df[female_cols].mean(axis=1)
female_df.loc[:, 'Average Female WER ⬇️'] = female_df['Average Female WER ⬇️'].apply(formatter)
female_df = female_df[['Model', 'Average Female WER ⬇️'] + female_cols]
african_df = original_df[['Model'] + african_cols].copy()
african_df.loc[:, 'Average African WER ⬇️'] = african_df[african_cols].mean(axis=1)
african_df.loc[:, 'Average African WER ⬇️'] = african_df['Average African WER ⬇️'].apply(formatter)
african_df = african_df[['Model', 'Average African WER ⬇️'] + african_cols]
north_american_df = original_df[['Model'] + north_american_cols].copy()
north_american_df.loc[:, 'Average North American WER ⬇️'] = north_american_df[north_american_cols].mean(axis=1)
north_american_df.loc[:, 'Average North American WER ⬇️'] = north_american_df['Average North American WER ⬇️'].apply(formatter)
north_american_df = north_american_df[['Model', 'Average North American WER ⬇️'] + north_american_cols]
caribbean_df = original_df[['Model'] + caribbean_cols].copy()
caribbean_df.loc[:, 'Average Caribbean WER ⬇️'] = caribbean_df[caribbean_cols].mean(axis=1)
caribbean_df.loc[:, 'Average Caribbean WER ⬇️'] = caribbean_df['Average Caribbean WER ⬇️'].apply(formatter)
caribbean_df = caribbean_df[['Model', 'Average Caribbean WER ⬇️'] + caribbean_cols]
latin_american_df = original_df[['Model'] + latin_american_cols].copy()
latin_american_df.loc[:, 'Average Latin American WER ⬇️'] = latin_american_df[latin_american_cols].mean(axis=1)
latin_american_df.loc[:, 'Average Latin American WER ⬇️'] = latin_american_df['Average Latin American WER ⬇️'].apply(formatter)
latin_american_df = latin_american_df[['Model', 'Average Latin American WER ⬇️'] + latin_american_cols]
british_df = original_df[['Model'] + british_cols].copy()
british_df.loc[:, 'Average British WER ⬇️'] = british_df[british_cols].mean(axis=1)
british_df.loc[:, 'Average British WER ⬇️'] = british_df['Average British WER ⬇️'].apply(formatter)
british_df = british_df[['Model', 'Average British WER ⬇️'] + british_cols]
european_df = original_df[['Model'] + european_cols].copy()
european_df.loc[:, 'Average European WER ⬇️'] = european_df[european_cols].mean(axis=1)
european_df.loc[:, 'Average European WER ⬇️'] = european_df['Average European WER ⬇️'].apply(formatter)
european_df = european_df[['Model', 'Average European WER ⬇️'] + european_cols]
asian_df = original_df[['Model'] + asian_cols].copy()
asian_df.loc[:, 'Average Asian WER ⬇️'] = asian_df[asian_cols].mean(axis=1)
asian_df.loc[:, 'Average Asian WER ⬇️'] = asian_df['Average Asian WER ⬇️'].apply(formatter)
asian_df = asian_df[['Model', 'Average Asian WER ⬇️'] + asian_cols]
# add average female and mal to original df and place it after average wer
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average African WER ⬇️', african_df['Average African WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average North American WER ⬇️', north_american_df['Average North American WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average Caribbean WER ⬇️', caribbean_df['Average Caribbean WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average Latin American WER ⬇️', latin_american_df['Average Latin American WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average British WER ⬇️', british_df['Average British WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average European WER ⬇️', european_df['Average European WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average Asian WER ⬇️', asian_df['Average Asian WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average Female WER ⬇️', female_df['Average Female WER ⬇️'])
original_df.insert(original_df.columns.get_loc('Average WER ⬇️') + 1, 'Average Male WER ⬇️', male_df['Average Male WER ⬇️'])
# Save the updated DataFrame to a temporary CSV file
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S") # Generate a timestamp
temp_csv_filename = f"updated_leaderboard_{timestamp}.csv" # Create a unique filename
original_df.to_csv(temp_csv_filename, index=False) # Save the DataFrame to a temporary CSV file
# Upload the CSV file to Hugging Face
hf_api = HfApi()
repo_id = "Steveeeeeeen/whisper-leaderboard-evals" # Replace with your Hugging Face repo ID
TOKEN_HUB = os.environ.get("TOKEN_HUB", None)
upload_file(
path_or_fileobj=temp_csv_filename,
path_in_repo=f"data/{temp_csv_filename}", # Path in the Hugging Face repo
repo_id=repo_id,
token=TOKEN_HUB,
repo_type="dataset"
)
print(f"Updated leaderboard uploaded to Hugging Face: {repo_id}/data/{temp_csv_filename}")
COLS = [c.name for c in fields(AutoEvalColumn)]
TYPES = [c.type for c in fields(AutoEvalColumn)]
with gr.Blocks(css=LEADERBOARD_CSS) as demo:
# gr.HTML(BANNER, elem_id="banner")
# Write a header with the title
gr.Markdown("<h1>🤫 How Biased is Whisper?</h1>", elem_classes="markdown-text")
gr.Markdown(EXPLANATION, elem_classes="markdown-text")
with gr.Tabs(elem_classes="tab-buttons") as tabs:
with gr.TabItem("🏅 Edacc Results", elem_id="od-benchmark-tab-table", id=0):
gr.Markdown(EXPLANATION_EDACC, elem_classes="markdown-text")
# Add column filter dropdown
column_filter = gr.Dropdown(
choices=["All", "Female", "Male", "African", "North American", "Caribbean", "Latin American", "British", "European", "Asian"] + [v for k,v in column_names.items() if k != "model"],
label="Filter by column",
multiselect=True,
value=["All"],
elem_id="column-filter"
)
leaderboard_table = gr.components.Dataframe(
value=original_df,
datatype=TYPES,
elem_id="leaderboard-table",
interactive=False,
visible=True,
)
# Update table columns when filter changes
def update_table(cols):
# Dictionary mapping view names to their corresponding dataframes
view_mapping = {
"All": original_df,
"Female": female_df,
"Male": male_df,
"African": african_df,
"North American": north_american_df,
"Caribbean": caribbean_df,
"Latin American": latin_american_df,
"British": british_df,
"European": european_df,
"Asian": asian_df
}
# Handle special views
selected_special_views = [view for view in view_mapping.keys() if view in cols]
if selected_special_views:
# Start with the first selected view's columns
result_cols = set(view_mapping[selected_special_views[0]].columns)
# Take union of columns from all selected views
for view in selected_special_views[1:]:
result_cols.update(view_mapping[view].columns)
# Convert to list and ensure "Model" is first
result_cols = ["Model"] + sorted(list(result_cols - {"Model"}))
# Merge all relevant columns from original_df
return gr.Dataframe(value=original_df[result_cols])
# If no special view is selected, return filtered columns from original df
selected_cols = ["Model"] + cols # Always include the Model column
return gr.Dataframe(value=original_df[selected_cols])
column_filter.change(
fn=update_table,
inputs=[column_filter],
outputs=[leaderboard_table]
)
with gr.TabItem("🏅 Afrispeech Results", elem_id="od-benchmark-tab-table", id=1):
gr.Markdown(EXPLANATION_AFRI, elem_classes="markdown-text")
# Add column filter dropdown
afrispeech_column_filter = gr.Dropdown(
choices=["All"] + [v for k,v in column_names.items() if k != "model" and v in afrispeech_df.columns],
label="Filter by column",
multiselect=True,
value=["All"],
elem_id="afrispeech-column-filter"
)
leaderboard_table = gr.components.Dataframe(
value=afrispeech_df,
datatype=TYPES,
elem_id="leaderboard-table",
interactive=False,
visible=True,
)
# Update table columns when filter changes
def update_afrispeech_table(cols):
if "All" in cols:
return gr.Dataframe(value=afrispeech_df)
selected_cols = ["Model"] + cols # Always include the Model column
return gr.Dataframe(value=afrispeech_df[selected_cols])
afrispeech_column_filter.change(
fn=update_afrispeech_table,
inputs=[afrispeech_column_filter],
outputs=[leaderboard_table]
)
demo.launch(ssr_mode=False)