3.9 KiB
3.9 KiB
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 重叠,系统自动:
- 合并重叠片段
- 生成 title_segments(按 transcript 关键词首次出现时间切分)
- 每个标题最多显示 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 ← 字幕轨(用户直接改文本)
架构原则
- CLI/GUI 底层复用:所有原子操作在 core/ 里,CLI 和 GUI 都调用同一套
- config 是唯一真源:
generated_config.yaml是 clips 事实,GUI 编辑后写回此文件 - 按需重生成:只删除/重生成受影响的 clip,不动其他
- 字幕以用户为准:字幕文本修改跳过 LLM 校正
实施步骤
- 底层原子化:core/ 增加
reextract_clip,delete_clip,add_clip_by_title函数 - CLI burn_only 支持部分重烧(支持只烧标题或只烧字幕)
- GUI 增加编辑界面:clip 列表 + 字幕列表
- 集成测试