fpessanha's picture
Feat: Deal with csv files; remove interaction when no participant ID"
d9b07cf
raw
history blame
7.44 kB
import gradio as gr
import pandas as pd
import os
import gradio as gr
css = """#myProgress {
width: 100%;
background-color: gray;
border-radius: 2px;
}
#myBar {
width: 0%;
height: 30px;
background-color: blue;
border-radius: 2px;
}
#myHideBlock {
width: 110%;
height: 110%;
background-color: blue;
}
#progressText {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
font-weight: bold;
font-size: 14px;
"""
js_progress_bar = """
function move(n_ann, total_ann) {
var elem = document.getElementById("myBar");
elem.style.width = n_ann/total_ann * 100 + "%";
progressText.innerText = 'Completed: ' + n_ann + '/' + total_ann
}
"""
# List of all audio files to annotate
file_list = pd.read_excel(os.path.join('combined_annotations.xlsx'))
total_annotations = len(file_list)
# Initialize an empty DataFrame to store annotations
annotations = pd.DataFrame(columns=['sample_id', 'sentence', 'emotion', 'confidence', 'comments'])
current_index = {"index": 0} # Dictionary to allow modifying inside functions
def load_example(index):
"""Loads the example in row #index from dataframe file_list.
If there are any annotations it will give those values to the annotation dataframe"""
row = file_list.iloc[index]
audio_path = os.path.join('files_to_annotate_padded_smaller_emotion_set', row["SAMPLE ID"].split('-')[0], row["SAMPLE ID"] + '.wav')
print(f"Audio path: {audio_path}, Exists: {os.path.exists(audio_path)}")
sentence = row["SENTENCE"]
# If the user already made an annotation for this example, gradio will return said annotation
previous_annotation = (
annotations.iloc[index].to_dict() if index < len(annotations) else {"sample_id": row["SAMPLE ID"], "emotion": 'Blank', "confidence": 0,
"comments": ''}
)
return (sentence, audio_path, previous_annotation['emotion'], previous_annotation['confidence'], current_index['index'] + 1, previous_annotation["comments"])
def save_annotation(emotions, confidence, comments, participant_id):
"""Save the annotation for the current example."""
idx = current_index["index"]
row = file_list.iloc[idx]
sample_id = row["SAMPLE ID"]
sentence = row["SENTENCE"]
# Update or append annotation
if sample_id in annotations["sample_id"].values:
annotations.loc[annotations["sample_id"] == sample_id, ["emotion", "confidence", "comments"]] = \
[emotions, confidence, comments]
else:
annotations.loc[len(annotations)] = [sample_id, sentence, emotions, confidence, comments]
ann_completed.value += 1
annotations.to_csv(f"{participant_id}_annotations.csv", index=False) # Save to a CSV file
def next_example(emotions, confidence, comments, participant_id):
"""Move to the next example."""
if emotions == "Blank":
gr.Warning("Please fill out the emotion section")
else:
save_annotation(emotions, confidence, comments, participant_id)
if current_index["index"] < len(file_list) - 1:
current_index["index"] += 1
return load_example(current_index["index"])
def previous_example(emotion, confidence, comments, participant_id):
"""Move to the previous example."""
if emotion.value != "Blank":
save_annotation(emotion, confidence, comments, participant_id)
if current_index["index"] > 0:
current_index["index"] -= 1
return load_example(current_index["index"])
return load_example(current_index["index"])
def deactivate_participant_id(participant_id, lets_go):
participant_id = gr.Textbox(label='What is your participant ID?', value = participant_id, interactive = False)
lets_go = gr.Button("Participant selected!", interactive = False)
return participant_id, lets_go
def activate_elements(emotions, confidence, comments, next_button, previous_button):
emotions = gr.Radio(["Blank", "Joy", "Sad", "Angry", "Neutral"], label="Predominant Emotion", value = "Blank", interactive = True)
confidence = gr.Slider(label="Confidence (%)", minimum=0, maximum=100, step=10, interactive = True)
comments = gr.Textbox(label="Comments", interactive=True)
previous_button = gr.Button("Previous Example", interactive = True)
next_button = gr.Button("Next Example", interactive = True)
return emotions, confidence, comments, next_button, previous_button
# ===================
# Gradio Interface
# ===================
with (gr.Blocks(theme=gr.themes.Soft(), css = css) as demo):
ann_completed = gr.Number(1, visible=False)
total = gr.Number(total_annotations, visible=False)
# Row with progress bar
gr.HTML("""
<div id="myProgress">
<div id="myBar">
<span id="progressText">Press "Let's go!" to start</span>
</div>
</div>""")
# Row with audio player
with gr.Row():
audio_player = gr.Audio(value= 'test.mp3', label="Audio", type="filepath", interactive=False)
# 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", interactive = False)
with gr.Row():
confidence = gr.Slider(label="Confidence (%)", minimum=0, maximum=100, step=10, interactive = False)
# Instructions for emotion annotation
with gr.Sidebar():
participant_id = gr.Textbox(label='What is your participant ID?', interactive = True)
lets_go = gr.Button("Let's go!")
#happy_words = gr.Textbox(label = "Happy")
with gr.Row():
# Comment section
comments = gr.Textbox(label="Comments", interactive=False)
# Next and Previous Buttons
with gr.Row():
previous_button = gr.Button("Previous Example", interactive = False)
next_button = gr.Button("Next Example", interactive = False)
# Go back
previous_button.click(
previous_example,
inputs=[emotions, confidence, comments, participant_id],
outputs=[sentence_text, audio_player, emotions, confidence, ann_completed, comments],
)
# Go to the next example
next_button.click(
next_example,
inputs=[emotions, confidence, comments, participant_id],
outputs=[sentence_text, audio_player, emotions, confidence, ann_completed, comments],
)
#Update progress bar
next_button.click(None, [], [ann_completed, total], js = js_progress_bar)
lets_go.click(None, [], [ann_completed, total], js = js_progress_bar)
lets_go.click(deactivate_participant_id, [participant_id, lets_go], [participant_id, lets_go])
lets_go.click(activate_elements, [emotions, confidence, comments, next_button, previous_button], [emotions, confidence, comments, next_button, previous_button])
lets_go.click(load_example, inputs = [gr.Number(current_index["index"], visible = False)], outputs = [sentence_text, audio_player, emotions, confidence, ann_completed, comments])
demo.launch()