Files

289 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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**: 质量交付 - 审查、测试、打包