Spaces:
Running
Running
import gradio as gr | |
import pandas as pd | |
import os | |
import gradio as gr | |
from pathlib import Path | |
from huggingface_hub import login | |
from mutagen.mp3 import MP3 | |
from mutagen.wave import WAVE | |
import json | |
from text_explanations import * | |
from utils import * | |
from load_and_save import * | |
persistent_storage = Path('/data') | |
password_files = os.getenv("password_files") | |
def state_to_number(*state_obj_list): | |
list_numbers = [] | |
for state_obj in state_obj_list: | |
number_obj = gr.Number(state_obj, visible = False) | |
list_numbers.append(number_obj) | |
return list_numbers | |
# =================== | |
# Gradio Interface | |
# =================== | |
with (gr.Blocks(theme=gr.themes.Soft(), css = css) as demo): | |
# List of all audio files to annotate | |
# Instructions for emotion annotation | |
with gr.Sidebar(open = True) as sidebar: | |
participant_id = gr.Textbox(label='What is your participant ID?', interactive = True) | |
lets_go = gr.Button("Let's go!") | |
cheat_sheet = gr.HTML(side_bar_html, padding = False) | |
with gr.Tab("Instructions", elem_id = 'instructions'): | |
instructions = gr.HTML(intro_html, padding = False) | |
with gr.Blocks(): | |
description = gr.HTML(examples_explanation, padding = False) | |
with gr.Accordion(label = "Neutral", open= False): | |
neutral_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/neutral.wav', label = "Neutral") | |
with gr.Accordion(label = "Happy", open = False): | |
happy_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/happy_low.wav', label = "Happy (Low Intensity)") | |
happy_int_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/happy_intense.wav', label = "Happy (High Intensity)") | |
with gr.Accordion(label = "Sad", open = False): | |
sad_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/sad_low.wav', label = "Sad (Low Intensity)") | |
sad_int_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/sad_intense.wav', label = "Sad (High Intensity)") | |
with gr.Accordion(label = "Anger", open = False): | |
angry_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/angry_low.wav', label = "Anger (Low Intensity)") | |
angry_int_audio = gr.Audio(value=f'{persistent_storage}/emotion_examples/angry_intense.wav', label = "Anger (High Intensity)") | |
instructions = gr.HTML(start_annotating, padding = False) | |
image = gr.Image(label = "Annotation Interface", value = f"{persistent_storage}/instructions_annotation.png", container = False, type = "filepath", show_label = False, show_download_button = False, show_fullscreen_button = False,show_share_button = False) | |
with gr.Tab("Annotation Interface"): | |
ann_completed = gr.State(0) | |
ann_completed_temp = gr.Number(0, visible = False) | |
total = gr.State(0) | |
total_temp = gr.Number(0, visible = False) | |
current_index = gr.State(0) | |
current_index_temp = gr.Number(0, visible = False) | |
start = gr.State(0.0) | |
start_temp = gr.Number(0, visible = False) | |
end = gr.State(0.0) | |
end_temp = gr.Number(0, visible = False) | |
duration = gr.State(0.0) | |
duration_temp = gr.Number(0, visible = False) | |
n_clicks = gr.State(0) | |
part_id = gr.State('') | |
annotations = gr.State(pd.DataFrame()) | |
file_list = gr.State(pd.DataFrame()) | |
# Row with progress bar | |
gr.HTML(""" | |
<div id="myProgress"> | |
<div id="myBar"> | |
<span id="progressText">Press "Let's go!" to start</span> | |
</div> | |
</div> | |
""", padding = False) | |
# Row with audio player | |
with gr.Row(): | |
audio_player = gr.Audio(value= 'blank.mp3', label="Audio", type="filepath", interactive=False, show_download_button = False, show_share_button = False, elem_id = "audio_to_annotate") | |
# Hidden row with corresponding sentence | |
with gr.Row(): | |
accordion = gr.Accordion(label="Click to see the sentence", open=False) | |
with accordion: | |
sentence_text = gr.Textbox(label="Transcription", interactive=False, value = 'This is a sentence.') | |
# Row for emotion annotation and confidence | |
with gr.Row(): | |
emotions = gr.Radio(["Blank", "Joy", "Sad", "Angry", "Neutral"], label="Predominant Emotion", value = "Blank", visible = False) | |
with gr.Row(): | |
confidence = gr.Radio(["Blank","Very Uncertain", "Somewhat Uncertain", "Neutral", "Somewhat confident", "Very confident"], label="How confident are you that the annotated emotion is present in the recording?", visible = False) | |
with gr.Row(): | |
# Comment section | |
comments = gr.Textbox(label="Comments", visible =False) | |
# Next and Previous Buttons | |
with gr.Row(): | |
previous_button = gr.Button("Previous Example", visible = False) | |
next_button = gr.Button("Next Example", visible = False) | |
# Go back | |
previous_button.click( | |
previous_example, | |
inputs=[annotations, file_list, emotions, confidence, comments, n_clicks, participant_id, ann_completed , current_index], | |
outputs=[annotations, sentence_text, audio_player, emotions, confidence, comments, n_clicks, start, end, duration, | |
ann_completed, current_index],).then(state_to_number, [start, end, duration, current_index, ann_completed, total], | |
[start_temp, end_temp, duration_temp, current_index_temp, ann_completed_temp, total_temp]).then(None, [], | |
[start_temp, end_temp, duration_temp, current_index_temp, | |
ann_completed_temp, total_temp], js = js_progress_bar) | |
# Go to the next example | |
next_button.click( | |
next_example, | |
inputs=[annotations, file_list,emotions, confidence, comments, n_clicks, participant_id, start, end, duration, ann_completed, current_index], | |
outputs=[annotations,sentence_text, audio_player, emotions, confidence, comments, n_clicks, start, end, duration, ann_completed, | |
current_index],).then(state_to_number, [start, end, duration, current_index, ann_completed, total], | |
[start_temp, end_temp, duration_temp, current_index_temp, ann_completed_temp, total_temp]).then(None, [], | |
[start_temp, end_temp, duration_temp, current_index_temp, | |
ann_completed_temp, total_temp], js = js_progress_bar) | |
buttons = [previous_button, next_button] | |
data = [sentence_text, audio_player, emotions, confidence, comments] | |
lets_go.click(deactivate_participant_id, [annotations, file_list, total, participant_id, | |
lets_go, *buttons, *data, n_clicks, ann_completed, current_index], | |
[annotations, file_list, participant_id, part_id, lets_go, total, *buttons, | |
*data, n_clicks, start, end, duration, ann_completed, current_index]).then(state_to_number, [start, end, duration, current_index, ann_completed, total], | |
[start_temp, end_temp, duration_temp, current_index_temp, ann_completed_temp, total_temp]).then(None, [], | |
[start_temp, end_temp, duration_temp, current_index_temp, | |
ann_completed_temp, total_temp], js = js_progress_bar) | |
audio_player.play(count_clicks, [n_clicks], [n_clicks]) | |
sidebar.collapse(None, [], [start, end, duration, current_index, ann_completed, total], js = js_progress_bar) | |
sidebar.expand(None, [], [start, end, duration, current_index,ann_completed, total], js = js_progress_bar) | |
with gr.Tab("Access Files"): | |
with gr.Row(): | |
password = gr.Textbox(label="Enter Password", type="password") | |
get_files_button = gr.Button("Get Files") | |
with gr.Column(): | |
files = gr.File(label="Download Files", file_count="multiple", interactive=True) | |
storage = gr.Text(label="Total Usage") | |
get_files_button.click(fn=get_storage, inputs=[password], outputs=[files, storage]) | |
demo.launch(allowed_paths = ['/data']) | |