|  |  | 
					
						
						|  | """ | 
					
						
						|  | 简单的反馈收集工具 | 
					
						
						|  | 在MeanAudio生成音频后,运行此脚本收集用户偏好 | 
					
						
						|  | """ | 
					
						
						|  |  | 
					
						
						|  | import json | 
					
						
						|  | import os | 
					
						
						|  | import sys | 
					
						
						|  | from datetime import datetime | 
					
						
						|  | from pathlib import Path | 
					
						
						|  | import gradio as gr | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | FEEDBACK_DIR = Path("./rlhf_feedback") | 
					
						
						|  | FEEDBACK_DIR.mkdir(exist_ok=True) | 
					
						
						|  | FEEDBACK_FILE = FEEDBACK_DIR / "user_preferences.jsonl" | 
					
						
						|  |  | 
					
						
						|  | def save_feedback(audio1_path, audio2_path, prompt, preference, comment=""): | 
					
						
						|  | """保存反馈数据""" | 
					
						
						|  | feedback_data = { | 
					
						
						|  | "timestamp": datetime.now().isoformat(), | 
					
						
						|  | "prompt": prompt, | 
					
						
						|  | "audio1_path": audio1_path, | 
					
						
						|  | "audio2_path": audio2_path, | 
					
						
						|  | "preference": preference, | 
					
						
						|  | "additional_comment": comment | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | with open(FEEDBACK_FILE, "a", encoding="utf-8") as f: | 
					
						
						|  | f.write(json.dumps(feedback_data, ensure_ascii=False) + "\n") | 
					
						
						|  |  | 
					
						
						|  | return f"✅ 反馈已保存!偏好: {preference}" | 
					
						
						|  |  | 
					
						
						|  | def create_feedback_interface(): | 
					
						
						|  | """创建反馈收集界面""" | 
					
						
						|  |  | 
					
						
						|  | with gr.Blocks(title="MeanAudio 反馈收集器") as demo: | 
					
						
						|  | gr.Markdown("# MeanAudio 反馈收集器") | 
					
						
						|  | gr.Markdown("*请输入生成的音频文件路径和提示词,然后选择您的偏好*") | 
					
						
						|  |  | 
					
						
						|  | with gr.Row(): | 
					
						
						|  | with gr.Column(): | 
					
						
						|  | prompt_input = gr.Textbox( | 
					
						
						|  | label="提示词", | 
					
						
						|  | placeholder="输入用于生成音频的提示词..." | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | audio1_path = gr.Textbox( | 
					
						
						|  | label="音频文件1路径", | 
					
						
						|  | placeholder="./output/gradio/prompt_timestamp_0.flac" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | audio2_path = gr.Textbox( | 
					
						
						|  | label="音频文件2路径", | 
					
						
						|  | placeholder="./output/gradio/prompt_timestamp_1.flac" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | with gr.Column(): | 
					
						
						|  |  | 
					
						
						|  | audio1_player = gr.Audio(label="音频1") | 
					
						
						|  | audio2_player = gr.Audio(label="音频2") | 
					
						
						|  |  | 
					
						
						|  | load_btn = gr.Button("🔄 加载音频文件") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | gr.Markdown("---") | 
					
						
						|  | gr.Markdown("### 请选择您的偏好") | 
					
						
						|  |  | 
					
						
						|  | preference = gr.Radio( | 
					
						
						|  | choices=[ | 
					
						
						|  | ("音频1更好", "audio1"), | 
					
						
						|  | ("音频2更好", "audio2"), | 
					
						
						|  | ("两者质量相等", "equal"), | 
					
						
						|  | ("两者都不好", "both_bad") | 
					
						
						|  | ], | 
					
						
						|  | label="哪个音频更好?" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | comment = gr.Textbox( | 
					
						
						|  | label="额外评论 (可选)", | 
					
						
						|  | placeholder="关于音频质量的具体反馈...", | 
					
						
						|  | lines=3 | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | submit_btn = gr.Button("📝 提交反馈", variant="primary") | 
					
						
						|  |  | 
					
						
						|  | result = gr.Textbox(label="结果", interactive=False) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def load_audio_files(path1, path2): | 
					
						
						|  | """加载音频文件用于播放""" | 
					
						
						|  | audio1 = path1 if os.path.exists(path1) else None | 
					
						
						|  | audio2 = path2 if os.path.exists(path2) else None | 
					
						
						|  | return audio1, audio2 | 
					
						
						|  |  | 
					
						
						|  | load_btn.click( | 
					
						
						|  | fn=load_audio_files, | 
					
						
						|  | inputs=[audio1_path, audio2_path], | 
					
						
						|  | outputs=[audio1_player, audio2_player] | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | submit_btn.click( | 
					
						
						|  | fn=save_feedback, | 
					
						
						|  | inputs=[audio1_path, audio2_path, prompt_input, preference, comment], | 
					
						
						|  | outputs=[result] | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | gr.Markdown("---") | 
					
						
						|  | gr.Markdown(""" | 
					
						
						|  | ### 使用说明 | 
					
						
						|  | 1. 先运行 MeanAudio 生成两个音频文件 | 
					
						
						|  | 2. 将生成的音频文件路径复制到上面的输入框中 | 
					
						
						|  | 3. 点击"加载音频文件"来播放音频 | 
					
						
						|  | 4. 选择您的偏好并提交反馈 | 
					
						
						|  | 5. 反馈数据将保存到 `./rlhf_feedback/user_preferences.jsonl` | 
					
						
						|  | 6. 使用 `python analyze_feedback.py` 分析收集的反馈数据 | 
					
						
						|  | """) | 
					
						
						|  |  | 
					
						
						|  | return demo | 
					
						
						|  |  | 
					
						
						|  | if __name__ == "__main__": | 
					
						
						|  | demo = create_feedback_interface() | 
					
						
						|  | print("启动反馈收集界面...") | 
					
						
						|  | print(f"反馈数据将保存到: {FEEDBACK_FILE}") | 
					
						
						|  | demo.launch(server_name="127.0.0.1", server_port=7861) | 
					
						
						|  |  |