import gradio as gr
from task_manager import get_current_task, select_result, change_task, tasks, get_total_tasks
from annotation import save_annotations
def calculate_completion_stats(annotation_results):
"""计算任务完成统计信息"""
if not annotation_results:
return 0, 0, 0.0
total_tasks = get_total_tasks()
completed_tasks = len(annotation_results)
completion_rate = (completed_tasks / total_tasks * 100) if total_tasks > 0 else 0.0
return completed_tasks, total_tasks, completion_rate
def create_task_info_html(username, annotation_results, current_task_num):
"""创建包含用户信息和完成度的HTML"""
completed_tasks, total_tasks, completion_rate = calculate_completion_stats(annotation_results)
# 使用更简洁的HTML结构
task_info_html = f"""
👤 用户: {username}
完成度: {completed_tasks}/{total_tasks} ({completion_rate:.1f}%)
当前任务: {current_task_num}
"""
return task_info_html
def create_ui(init_task, username, annotation_results):
"""创建 Gradio 界面组件"""
init_inst, init_text, init_audioA_data, init_audioA_rate, init_audioB_data, init_audioB_rate, init_prev_dis, init_next_dis, init_task_num = init_task
gr.Markdown('🎵 音频对比标注平台
')
user_display = gr.Markdown()
instruction = gr.Textbox(label="🎯Instruction", value=init_inst, interactive=False)
text_box = gr.Textbox(label="📋Transcription", value=init_text, interactive=False)
# 初始化时创建完成度显示 - 使用HTML组件而不是Markdown
initial_task_info = create_task_info_html("unknown", {}, init_task_num)
task_number = gr.HTML(value=initial_task_info, elem_classes="center")
with gr.Row():
with gr.Column(elem_classes="audio-container"):
audioA = gr.Audio(
label="🔊 音频 A",
value=(init_audioA_rate, init_audioA_data),
interactive=False,
type="numpy"
)
with gr.Column(elem_classes="audio-container"):
audioB = gr.Audio(
label="🔊 音频 B",
value=(init_audioB_rate, init_audioB_data),
interactive=False,
type="numpy"
)
with gr.Row():
btn_win = gr.Button("🏆 Win", variant="primary")
btn_tie = gr.Button("🤝 Tie", variant="secondary")
btn_lose = gr.Button("❌ Lose", variant="stop")
with gr.Row():
btn_prev = gr.Button("⬅️ 上一题", interactive=not init_prev_dis)
btn_next = gr.Button("➡️ 下一题", interactive=not init_next_dis)
def wrapped_select_result(choice, audioA, audioB, annotation_results, username, user_current_task):
"""包装 select_result 函数以适配新的参数签名"""
result_audioA, result_audioB, updated_annotation_results = select_result(choice, audioA, audioB,
annotation_results, username,
user_current_task)
# 更新完成度显示 - 保持当前任务编号不变,因为还在同一个任务上
current_task_display = user_current_task + 1 # 假设任务编号从1开始显示
updated_task_info = create_task_info_html(username, updated_annotation_results, current_task_display)
return result_audioA, result_audioB, updated_annotation_results, gr.update(value=updated_task_info)
def wrapped_change_task(direction, annotation_results, username, user_current_task):
"""包装 change_task 函数以适配新的参数签名"""
result = change_task(direction, annotation_results, username, user_current_task)
if len(result) >= 9: # 确保返回值包含所有必需的字段
inst, text, audioA, audioB, btn_prev, btn_next, original_task_display, updated_annotation_results, updated_current_task = result[
:9]
# 使用更新后的当前任务索引来计算显示编号
current_task_display = updated_current_task + 1 # 转换为1-based显示
# 创建新的完成度显示
updated_task_info = create_task_info_html(username, updated_annotation_results, current_task_display)
return inst, text, audioA, audioB, btn_prev, btn_next, gr.update(
value=updated_task_info), updated_annotation_results, updated_current_task
else:
return result
return {
"user_display": user_display,
"instruction": instruction,
"text_box": text_box,
"task_number": task_number,
"audioA": audioA,
"audioB": audioB,
"btn_win": btn_win,
"btn_tie": btn_tie,
"btn_lose": btn_lose,
"btn_prev": btn_prev,
"btn_next": btn_next,
"select_result": wrapped_select_result,
"change_task": wrapped_change_task,
"save_annotations": lambda u, a: save_annotations(u, a, tasks)
}