PaulineDV's picture
naturalness intelligibility context mos
a0d78cf
Raw
History Blame Contribute Delete
7.4 kB
import gradio as gr
from config.settings import *
from data.contexts import CONTEXTS
from data.dataset_manager import load_hf_dataset
from services.annotation_service import submit_pair_annotation
from admin.admin_service import admin_login
from services.audio_service import generate_audio_pair
def update_sentence(context):
return CONTEXTS[context]
# ============================
# SUBMIT BUTTON CONTROL
# ============================
def check_submit_ready(
user_id,
audio_played,
mos_A,
mos_B
):
ready = (
len(user_id.strip()) > 1
and audio_played['played'] == 1
and mos_A != "None"
and mos_B != "None"
)
return gr.update(interactive=ready)
def mark_audio_played():
return {"played": 1}
# ============================
# GRADIO UI
# ============================
with gr.Blocks() as demo:
gr.Markdown("# Audio MOS Annotation Tool")
# --------------------------
# USER SECTION
# --------------------------
audio_played = gr.State({"played": 0})
hidden_models = gr.State()
with gr.Row():
user_id = gr.Textbox(label="User ID")
gender = gr.Dropdown(["Male", "Female", "Other"], label="Gender", value="Other")
with gr.Row():
age_group = gr.Dropdown(
choices=[
"10-19",
"20-29",
"30-39",
"40-49",
"50-59",
"60-69",
"70+"
],
label="Age Group"
)
native_language = gr.Textbox(
label="Native Language"
)
tts_experience = gr.Dropdown(
choices=[
"Never",
"Rarely",
"Occasionally",
"Frequently",
"Expert"
],
label="Experience with speech synthesis"
)
device_type = gr.Dropdown(
choices=[
"Headphones",
"Earbuds",
"Computer Speakers",
"Smartphone Speaker"
],
label="Listening Device"
)
with gr.Row():
context_selector = gr.Dropdown(
choices=list(CONTEXTS.keys()),
value="Voice assistant",
label="Context"
)
#sentence_display = gr.Textbox(
# value = CONTEXTS["Voice assistant"],
# label = "Sentence",
# interactive = False
#)
#model_selector = gr.Dropdown(
# choices = MODEL_OPTIONS,
# value = "OmniVoice",
# label = "Model"
#)
#context_selector.change(
# update_sentence,
# inputs=context_selector,
# outputs=sentence_display
#)
generate_btn = gr.Button("Generate Audio")
#audio_player = gr.Audio(label="Generated audio")
audio_A = gr.Audio(
label = "Audio A"
)
audio_B = gr.Audio(
label = "Audio B"
)
generate_btn.click(
generate_audio_pair,
inputs=context_selector,
outputs = [
audio_A,
audio_B,
audio_played,
hidden_models
]
)
with gr.Row():
naturalness_A = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Naturalness A"
)
intelligibility_A = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Intelligibility A"
)
context_A = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Context Adequacy A"
)
mos_A = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="MOS Audio A"
)
with gr.Row():
naturalness_B = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Naturalness B"
)
intelligibility_B = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Intelligibility B"
)
context_B = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="Context Adequacy for audio B"
)
mos_B = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label="MOS Audio B"
)
with gr.Row():
preferred_audio = gr.Radio(
choices=[
"Audio A",
"Audio B",
"No preference"
],
label="Preferred Audio"
)
submit_btn = gr.Button("Submit Score", interactive=False)
status = gr.Textbox(label="Status", interactive=False)
# Mark audio as played
audio_A.play(
mark_audio_played,
None,
audio_played
)
audio_B.play(
mark_audio_played,
None,
audio_played
)
# Enable submit button only when conditions are met
user_id.change(
check_submit_ready,
inputs=[user_id, audio_played, mos_A, mos_B],
outputs=submit_btn
)
audio_played.change(
check_submit_ready,
inputs=[user_id, audio_played, mos_A, mos_B],
outputs=submit_btn
)
mos_A.change(
check_submit_ready,
inputs=[user_id, audio_played, mos_A, mos_B],
outputs=submit_btn
)
mos_B.change(
check_submit_ready,
inputs=[user_id, audio_played, mos_A, mos_B],
outputs=submit_btn
)
# Save annotation
submit_btn.click(
submit_pair_annotation,
inputs=[
user_id,
age_group,
gender,
native_language,
tts_experience,
device_type,
hidden_models,
context_selector,
naturalness_A,
intelligibility_A,
context_A,
mos_A,
naturalness_B,
intelligibility_B,
context_B,
mos_B,
preferred_audio
],
outputs=status
)
# ============================
# ADMIN DASHBOARD
# ============================
gr.Markdown("## Admin Dashboard (Restricted Access)")
with gr.Row():
admin_password = gr.Textbox(label="Admin Password", type="password")
admin_login_btn = gr.Button("Login")
login_status = gr.Textbox(label="Login Status:", interactive=False)
with gr.Column(visible=False) as admin_panel:
gr.Markdown("### Annotation Results")
pd_loaded=load_hf_dataset().to_pandas()
results_table = gr.DataFrame(interactive=False, value=pd_loaded)
pd_loaded.to_csv("annotations_export.csv", index=False)
download_admin = gr.File(label="Download annotations.csv", value="annotations_export.csv")
admin_login_btn.click(
admin_login,
inputs=admin_password,
outputs=[admin_panel, results_table, download_admin, login_status]
)
# ============================
# APP LAUNCH
# ============================
if __name__ == "__main__":
demo.launch()