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) }