diff --git a/docs/GUI_EDIT_DESIGN.md b/docs/GUI_EDIT_DESIGN.md new file mode 100644 index 0000000..d83da49 --- /dev/null +++ b/docs/GUI_EDIT_DESIGN.md @@ -0,0 +1,112 @@ +# Piano Highlight Generator - GUI 修正功能设计 + +## 背景 + +现有 GUI 仅有"选文件+开始处理"的功能,跑完后用户无法对结果进行修正。本设计在跑完之后提供知识点编辑和字幕编辑能力,支持增删改,并自动判断如何应用修改。 + +## 名词定义 + +- **clip**:底层实现细节,表示一个视频片段(start/end/title_segments) +- **知识点**:用户感知的单位,即 clip 的 title +- **标题**:v1_title.srt,知识点名称的大字叠加层 +- **字幕**:v1_content.srt,实际转录文本的小字叠加层 + +## 用户流程 + +``` +PPT解析 → 跑流程 → GUI显示结果 + ↓ + ┌─────────┴─────────┐ + 编辑知识点 编辑字幕 + (改/删/增标题) (改/删文本) + ↓ ↓ + 系统自动判断如何重生成 直接应用用户修改 + (删json/重新匹配/处理重叠) (跳过LLM校正) + ↓ ↓ + └──────┬─────────────┘ + ↓ + 自动重烧 + ↓ + 用户用播放器查看 +``` + +## 知识点编辑 + +### 用户操作 + +- **改标题**:直接编辑文字 +- **删 clip**:删除该 clip +- **新增知识点**:输入新标题(PPT 里没有的也行) + +### 系统行为 + +| 操作 | 底层动作 | +|------|---------| +| 改 clip N 标题 | 删 `clipN.json` → 用新标题在 transcript 里重新匹配 start/end → 处理重叠 → 重烧 | +| 删 clip N | 从 generated_config.yaml 删掉该 clip → 删 `clipN.json` + `clipN.mp4` → 重烧 | +| 新增知识点 | 用新标题在 transcript 里匹配 start/end → 判断是否合并到相邻 clip(重叠处理)→ 重烧 | + +### 重叠处理 + +新增/修改后如果与现有 clip 重叠,系统自动: +1. 合并重叠片段 +2. 生成 title_segments(按 transcript 关键词首次出现时间切分) +3. 每个标题最多显示 title_duration 秒 + +## 字幕编辑 + +### 用户操作 + +直接编辑字幕文件中的文本(v1_content.srt)。 + +### 系统行为 + +- **改字幕文本**:以用户修改为准,跳过 LLM 校正,直接重烧 +- **删字幕条目**:用户删除某条,系统保留,其他正常重烧 +- **改时间轴**:不支持(时间轴由底层逻辑决定) + +## 底层原子化支撑 + +底层需要提供以下能力,供 GUI 调用: + +``` +reextract_clip_title(clip_index, new_title) + → 删 clipN.json → 重新匹配 → 更新 generated_config.yaml + +delete_clip(clip_index) + → 从 config 删 → 删 json/mp4 + +add_clip_by_title(new_title) + → 在 transcript 里匹配 → 判断合并/新增 → 更新 config + +reburn_titles() + → 只重烧标题轨(已有 json) + +reburn_subtitles(user_texts) + → 直接用用户文本烧录字幕,跳过 LLM 校正 +``` + +CLI 的 `burn_only.py` 已经部分支撑"直接重烧"的能力,需要增强以支持按原子操作重烧。 + +## 数据流 + +``` +generated_config.yaml ← 唯一的 clips 配置源(用户编辑后同步更新) +intermediates/clip*.json ← 转录缓存(按需删除重生成) +subs/v1_title.srt ← 标题轨(可手动编辑后重烧) +subs/v1_content.srt ← 字幕轨(用户直接改文本) +``` + +## 架构原则 + +1. **CLI/GUI 底层复用**:所有原子操作在 core/ 里,CLI 和 GUI 都调用同一套 +2. **config 是唯一真源**:`generated_config.yaml` 是 clips 事实,GUI 编辑后写回此文件 +3. **按需重生成**:只删除/重生成受影响的 clip,不动其他 +4. **字幕以用户为准**:字幕文本修改跳过 LLM 校正 + +## 实施步骤 + +1. 底层原子化:core/ 增加 `reextract_clip`, `delete_clip`, `add_clip_by_title` 函数 +2. CLI burn_only 支持部分重烧(支持只烧标题或只烧字幕) +3. GUI 增加编辑界面:clip 列表 + 字幕列表 +4. 集成测试