# Piano Highlight Generator App - 需求提案 > 提案日期:2026-05-02 > 提案人:AI Dev Team > 状态:Draft --- ## 1. 问题描述 ### 1.1 现状 当前钢琴课精华视频生成器是 Python CLI 脚本集合: - `generate_highlights.py` - 命令行程序,一次性执行完整流程 - 无图形界面,需要手动编辑 YAML 配置文件 - 无状态保持,程序中断只能从头开始 - 无人工介入点,无法在处理过程中修改标题 ### 1.2 用户需求 用户希望将其重构为**可分发的桌面应用**,具备: | 需求 | 说明 | |------|------| | **配置界面** | 图形化配置 API 大模型参数,无需编辑 YAML | | **全过程监控** | 实时显示每个处理步骤的状态 | | **状态保持** | 可在任意步骤暂停,然后继续往下进行 | | **人工介入** | 暂停时可手动修改标题,然后再最后烧制 | --- ## 2. 用户故事 ### 2.1 作为用户,我想要... **Story 1: 配置管理** - 打开应用后,能看到清晰的配置界面 - 可以选择/切换不同的 LLM API(当前是火山方舟,可扩展) - 可以选择 Whisper 模型(用于音频转录) - 配置可以保存和加载 **Story 2: 全过程监控** - 启动处理后,能看到每个步骤的实时状态 - 看到当前正在处理哪个片段(Clip 3/14) - 看到预估剩余时间 - 能看到每个步骤的日志输出 **Story 3: 暂停与恢复** - 点击"暂停"按钮,处理立即停止 - 关闭应用后,下次打开能从暂停点继续 - 恢复后从最近的检查点继续,不丢失进度 **Story 4: 人工介入** - 在标题纠正步骤,可以预览每个片段的标题 - 可以手动修改标题 - 可以跳过某些片段 - 所有修改会被保存 **Story 5: 打包分发** - 生成一个 .exe 文件,双击即可运行 - 无需安装 Python 环境 - 可以在其他电脑上使用 --- ## 3. 验收标准 ### 3.1 配置界面 - [ ] 应用启动后显示配置面板 - [ ] 可以输入/编辑 API Key 和 API Host - [ ] 可以选择 Whisper 模型(base/small/medium/large) - [ ] 可以选择输入视频文件(文件选择对话框) - [ ] 可以选择输出目录 - [ ] 配置可以保存到文件(JSON/YAML) - [ ] 配置可以从文件加载 ### 3.2 全过程监控 - [ ] 显示当前步骤:准备 → 提取片段 → 转录 → 标题纠正 → 合并 → 烧录 - [ ] 每一步显示进度条(百分比) - [ ] 显示当前片段序号(如 "Clip 3/14") - [ ] 实时显示处理日志 - [ ] 处理完成后显示最终视频路径 ### 3.3 暂停与恢复 - [ ] 有"暂停"按钮,点击后处理停止 - [ ] 暂停时状态持久化到文件 - [ ] 重新打开应用后,自动检测到未完成的任务 - [ ] 可以选择"继续"从暂停点恢复 - [ ] 也可以选择"重新开始" ### 3.4 人工介入 - [ ] 在标题纠正步骤,显示所有片段的标题列表 - [ ] 每个标题可以点击编辑 - [ ] 编辑后自动保存 - [ ] 可以预览修改后的字幕效果 - [ ] 确认后继续后续步骤 ### 3.5 打包分发 - [ ] 生成 Windows 可执行文件(.exe) - [ ] 双击运行,无须安装 Python - [ ] 界面美观,与现代桌面应用一致 --- ## 4. 技术选型 ### 4.1 GUI 框架 **选择:PySide6 (Qt for Python)** | 因素 | 结论 | |------|------| | 许可证 | LGPL - 可闭源商用,无需购买 | | 功能 | 成熟完备,适合复杂桌面应用 | | 状态管理 | 传统保留模式,天然支持暂停/恢复 | | 多线程 | 信号槽机制完善,支持多线程安全更新 UI | | 社区 | 文档丰富,社区活跃 | | 打包 | Nuitka 打包体积小(~10MB),启动快 | ### 4.2 打包方案 **开发阶段**:PyInstaller(调试方便) **正式发布**:Nuitka(体积小,性能好) ### 4.3 状态持久化 - 使用 JSON 文件存储处理进度 - 每个项目独立的状态文件 - 包含:当前步骤、已完成片段、用户修改的标题等 --- ## 5. 架构设计(预览) ``` ┌─────────────────────────────────────────────────────────────┐ │ GUI Layer (PySide6) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │ │ ConfigPanel │ │ ProgressView│ │ TitleEditor │ │ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Business Logic Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │ │ ConfigManager│ │PipelineCtrl │ │ StateManager │ │ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Core Modules (Legacy) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ video.py│ │subtitle │ │ llm.py │ │correction│ │ │ │ │ │ .py │ │ │ │s.py │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 模块职责 | 模块 | 职责 | |------|------| | ConfigPanel | 配置界面(API、视频路径、模型选择) | | ProgressView | 进度监控(步骤、百分比、日志) | | TitleEditor | 标题编辑器(预览、编辑用户修改) | | ConfigManager | 配置加载/保存 | | PipelineController | 流水线控制(启动/暂停/恢复/停止) | | StateManager | 状态持久化(保存/恢复进度) | --- ## 6. 流水线步骤 与应用UI对应的处理步骤: ``` Step 0: 准备 (Ready) └─ 检查配置、初始化环境 Step 1: 提取片段 (Extracting) └─ 从视频提取 clips -> intermediates/clip{N}_fade.mp4 Step 2: 转录 (Transcribing) └─ Whisper 转录 -> intermediates/clip{N}.json Step 3: 标题纠正 (Title Correcting) └─ LLM 分析 + 用户修改 -> intermediates/corrected_titles.json [人工介入点] 用户可在此步骤暂停并修改标题 Step 4: 生成字幕 (Generating Subtitles) └─ 生成双轨字幕 -> subs/v{N}_title.srt, v{N}_content.srt Step 5: 合并视频 (Merging) └─ FFmpeg concat -> concat_merged.mp4 Step 6: 烧录字幕 (Burning) └─ FFmpeg burn -> v{N}_final.mp4 Step 7: 完成 (Completed) └─ 显示结果,清理临时文件(可选) ``` ### 暂停点 用户可以在以下步骤暂停: - Step 1 完成后(片段已提取) - Step 2 完成后(转录已完成) - Step 3 完成后(标题已确认)- **推荐暂停点** - Step 4 完成后(字幕已生成) - Step 5 完成后(视频已合并) --- ## 7. 状态数据结构 ```json { "version": 1, "project_name": "福田夜校-03月18日", "config": { "video_src": "D:/path/to/video.mp4", "output_dir": "D:/path/to/output", "api_key": "xxx", "api_host": "https://...", "whisper_model": "large" }, "current_step": 3, "clips": [ { "index": 1, "title_original": "弹奏", "title_corrected": "弹奏", "title_user_modified": null, "start": 412, "end": 442, "status": "completed", "clip_path": "intermediates/clip1_fade.mp4", "json_path": "intermediates/clip1.json" } ], "step_status": { "extracting": "completed", "transcribing": "completed", "title_correcting": "in_progress", "generating_subtitles": "pending", "merging": "pending", "burning": "pending" }, "created_at": "2026-05-02T10:00:00", "updated_at": "2026-05-02T10:30:00" } ``` --- ## 8. 边界情况 | 情况 | 处理方式 | |------|----------| | API Key 无效 | 显示错误提示,不开始处理 | | 视频文件不存在 | 配置检查时发现,提示用户 | | 处理到一半崩溃 | 状态已持久化,重启后可恢复 | | 用户取消处理 | 保存当前进度,可选择重新开始或继续 | | Whisper 模型未下载 | 显示下载链接,或使用默认模型 | | 输出目录磁盘空间不足 | 处理前检查,提示用户 | --- ## 9. 非功能性需求 | 需求 | 标准 | |------|------| | 启动时间 | < 3 秒(使用 Nuitka 打包后) | | UI 响应性 | 所有操作在 100ms 内响应 | | 内存占用 | < 500MB(不含视频处理) | | 打包后体积 | < 50MB | | 兼容性 | Windows 10/11 64-bit | --- ## 10. 后续步骤 1. **Phase 2**: 技术设计 - 详细架构设计、数据库选型、接口定义 2. **Phase 3**: 任务编排 - 拆分并行任务、创建 git worktree 3. **Phase 4**: 并行开发 - 各模块实现 4. **Phase 5**: 质量交付 - 审查、测试、打包