| 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] |
|
|
| |
| |
| |
|
|
| 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} |
|
|
| |
| |
| |
|
|
| with gr.Blocks() as demo: |
|
|
| gr.Markdown("# Audio MOS Annotation Tool") |
|
|
| |
| |
| |
|
|
| 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" |
| ) |
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| generate_btn = gr.Button("Generate 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) |
|
|
|
|
| |
| audio_A.play( |
| mark_audio_played, |
| None, |
| audio_played |
| ) |
|
|
| audio_B.play( |
| mark_audio_played, |
| None, |
| audio_played |
| ) |
|
|
| |
| 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 |
| ) |
|
|
| |
| 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 |
| ) |
|
|
| |
| |
| |
|
|
| 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] |
| ) |
|
|
| |
| |
| |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|