Spaces:
Runtime error
Runtime error
File size: 5,239 Bytes
81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 81658c0 17b313f 74ebe0c 81658c0 17b313f 81658c0 a99121d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
import gradio as gr
from data_processing import load_tasks
from annotation import save_annotations
tasks = load_tasks()
current_task = 0
def get_current_task_with_annotations(annotation_results):
"""获取当前任务信息,应用已有标注的样式(用于初始加载)"""
task = tasks[current_task]
current_choice = annotation_results.get(current_task) if annotation_results else None
# 基础音频数据
audioA_data = (task["audioA"][1], task["audioA"][0]) # (rate, data)
audioB_data = (task["audioB"][1], task["audioB"][0]) # (rate, data)
# 应用选择样式
if current_choice == "A":
audioA_styled = gr.update(value=audioA_data, elem_classes="selected")
audioB_styled = gr.update(value=audioB_data, elem_classes="")
elif current_choice == "B":
audioA_styled = gr.update(value=audioA_data, elem_classes="")
audioB_styled = gr.update(value=audioB_data, elem_classes="selected")
else:
audioA_styled = gr.update(value=audioA_data, elem_classes="")
audioB_styled = gr.update(value=audioB_data, elem_classes="")
return (
task["instruction"],
task["text"],
audioA_styled,
audioB_styled,
current_task == 0,
current_task == len(tasks) - 1,
current_task + 1
)
def get_current_task(annotation_results=None, styled=False):
"""获取当前任务信息,可选择是否应用样式"""
task = tasks[current_task]
if styled and annotation_results is not None:
# 返回带样式的版本(用于更新已有界面)
current_choice = annotation_results.get(current_task)
audioA_data = (task["audioA"][1], task["audioA"][0]) # (rate, data)
audioB_data = (task["audioB"][1], task["audioB"][0]) # (rate, data)
if current_choice == "A":
audioA_styled = gr.update(value=audioA_data, elem_classes="selected")
audioB_styled = gr.update(value=audioB_data, elem_classes="")
elif current_choice == "B":
audioA_styled = gr.update(value=audioA_data, elem_classes="")
audioB_styled = gr.update(value=audioB_data, elem_classes="selected")
else:
audioA_styled = gr.update(value=audioA_data, elem_classes="")
audioB_styled = gr.update(value=audioB_data, elem_classes="")
return (
task["instruction"],
task["text"],
audioA_styled,
audioB_styled,
current_task == 0,
current_task == len(tasks) - 1,
current_task + 1
)
else:
# 返回原始格式(用于初始化界面)
return (
task["instruction"],
task["text"],
task["audioA"][0], # audioA_data
task["audioA"][1], # audioA_rate
task["audioB"][0], # audioB_data
task["audioB"][1], # audioB_rate
current_task == 0,
current_task == len(tasks) - 1,
current_task + 1
)
def apply_selection_style(audioA, audioB, choice):
"""根据选择结果应用样式"""
if choice == "A":
return (
gr.update(value=audioA, elem_classes="selected"),
gr.update(value=audioB, elem_classes="")
)
elif choice == "B":
return (
gr.update(value=audioA, elem_classes=""),
gr.update(value=audioB, elem_classes="selected")
)
else:
return (
gr.update(value=audioA, elem_classes=""),
gr.update(value=audioB, elem_classes="")
)
def select_audio(choice, audioA, audioB, annotation_results, username):
"""记录选择并更新UI高亮,自动保存标注结果"""
annotation_results[current_task] = choice
print(f"任务 {current_task}: 选择 {choice}")
# 自动保存标注结果
save_result = save_annotations(username, annotation_results, tasks)
print(f"自动保存结果: {save_result}")
audioA_update, audioB_update = apply_selection_style(audioA, audioB, choice)
return audioA_update, audioB_update, annotation_results
def change_task(direction, annotation_results, username):
"""切换任务"""
global current_task
if direction == "prev" and current_task > 0:
current_task -= 1
elif direction == "next" and current_task < len(tasks) - 1:
current_task += 1
# 使用带样式的版本
inst, text, audioA_update, audioB_update, prev_disabled, next_disabled, task_num = get_current_task(
annotation_results, styled=True)
total_tasks = get_total_tasks()
# 生成合并的用户信息和任务编号HTML
combined_task_info = f'<div class="user-task-info"><span>👤 当前用户: {username}</span><span><strong>任务编号: {task_num} / {total_tasks}</strong></span></div>'
return (
inst, text,
audioA_update,
audioB_update,
gr.update(interactive=not prev_disabled),
gr.update(interactive=not next_disabled),
gr.update(value=combined_task_info), # 更新任务编号位置的合并信息
annotation_results
)
def get_total_tasks():
"""返回总任务数"""
return len(tasks) |