适用场景:老师提供 PPT,学员在课堂现场拍摄了大量投影、板书和演示照片,已有基于语音文字稿生成的讲稿或笔记。目标是把三部分内容合并成一份准确、可追溯、可继续编辑的课程资料。
本版说明:v2 在 v1(2026-09-24 初版)基础上做了 8 处改造,全部围绕一条原则——把"依赖模型能力"的环节,换成"在现有环境下真能跑起来、且可审计"的环节。改造原因与利弊见附录 A,环境能力实测见附录 B。
一、结论
最稳妥的做法不是把 PPT、全部照片和文字稿一次性交给大模型,而是建立一条四阶段流水线:
素材归一化 → 页面级对齐 → 分片融合 → 人工审校与导出
核心分工:
| 素材 | 在最终结果中的作用 |
|---|---|
| 老师 PPT | 页面结构、标题、正文、图表和原始版式 |
| 课堂照片 | 证明老师现场实际展示了什么,以及临时修改、圈画、板书 |
| 语音文字稿 | 老师真正的讲解、举例、补充和口头强调 |
| 已有草稿 | 语言组织、章节结构和已完成的初步整理 |
| 模型推测 | 只能作为待确认信息,且必须显式标注为推测 |
需要遵守的基本原则:
- PPT 是页面骨架,但不能代替老师现场讲解。
- 课堂照片是现场证据,但不能默认与老师提供的 PPT 完全一致。
- 文字稿是讲解内容的主要来源,但可能存在错别字、同音字和断句错误。
- 已有草稿是二次加工结果,不能让草稿覆盖 PPT、照片或文字稿中的原始事实。
- 每一个重要结论都必须能追溯到具体页面、照片或文字稿时间点(v2 强化:落成字段,不只是要求)。
二、为什么不建议直接"全量喂给模型"
直接把几百张照片和完整 PPT、文字稿一次性输入,会遇到:
- 模型上下文和图片数量有限,内容越多,早期页面越容易被忽略。
- 手机照片存在倾斜、透视变形、反光、摩尔纹和遮挡,视觉识别不稳定。
- 老师实际播放的 PPT 可能与文件版本不同,模型很难自行判断应相信哪一份。
- 文字稿没有天然页码,无法自动对应到正确 PPT 页面。
- 一整份输出很难核对错误来自 PPT、照片、转写还是模型改写。
- 一旦模型判断错误,后续融合内容会连续错误,且难以定位。
v2 补充第 7 条:还要先确认"计划使用的能力是否真的存在"。v1 默认可用的"视觉向量/embedding"与"高质量中文 OCR",在本次实施环境里都不具备(见附录 B)。方案必须先落到环境能力上,否则流程设计得再漂亮也跑不起来。
因此应先把素材拆成"页面级小任务",每个任务只处理一页或少量页面。
三、建议的素材目录
course/
├─ ppt/
│ ├─ teacher.pptx
│ └─ slide-png/
│ ├─ 001.png
│ ├─ 002.png
│ └─ ...
├─ photos/
│ ├─ IMG_0001.jpg
│ ├─ IMG_0002.jpg
│ └─ ...
├─ transcript/
│ ├─ transcript.srt
│ └─ transcript.txt
├─ draft/
│ └─ openclaw-version.md
├─ work/ ← 中间产物(可重跑、可审计)
└─ out/ ← 最终交付
素材要求
1. 老师 PPT
优先准备三种形式:
- 原始
.pptx:提取标题、正文、表格、讲者备注。 - PDF:用于逐页阅读和页面渲染。
- 逐页 PNG:最方便进行页面级视觉比较。
如果暂时不能导出 PNG,至少提供 PPTX + PDF。
v2 注意:python-pptx 只能抽文本,抽不出版式与图表关系;页面骨架必须靠渲染(libreoffice → PDF → pdftoppm),会有字体/版本漂移,渲染后需抽查几页版式。
2. 现场照片
- 尽量保留原图,不要先压缩、改名或截屏转发。
- 保留文件名和 EXIF 拍摄时间(v2:EXIF 只用于排序,不用于绝对时间对齐,见阶段二)。
- 同一页面拍了多张时全部保留,后续去重和选优。
- 不要只挑"看起来清楚"的照片——模糊照片有时仍能证明老师做了某个修改。
3. 语音文字稿
优先使用带时间戳的 SRT / VTT / JSON:
00:18:32,000 --> 00:18:47,000
这里我们不是直接把参数代入,而是先用它判断约束条件。
若无时间戳,也可用纯文本,但页面与讲解的自动对应准确率会下降。 v2 注意:如果连音频都还没转写,需要先跑 ASR(本机已装 whisper / faster-whisper,无 GPU,纯 CPU,2 小时录音需按小时级预算安排)。
4. 已有草稿
以 Markdown 或纯文本提供,保留原有章节标题,不要提前改成最终格式。
四、总体实现流程
┌────────────────────┐
│ PPTX / PDF / 页面图 │
└─────────┬──────────┘
│ 抽文本、讲者备注;渲染逐页 PNG
▼
┌────────────────────┐
│ 课件页面索引 + pHash │
└─────────┬──────────┘
│
┌─────────┴──────────┐ ┌──────────────────┐
│ 现场照片 │ │ 文字稿 │
│ EXIF 排序 / pHash │ │ 分段 / 时间戳 │
│ 去重 / 清晰度分 │ │ 轻量纠错(留原文) │
└─────────┬──────────┘ └────────┬─────────┘
└───────────┬─────────────┘
▼
┌──────────────────────────┐
│ 三路单调序列对齐 │ ← v2 核心改造
│ 照片↔页 / 文字稿↔页 │
│ 低置信 → VLM 复核 / 人工 │
└─────────┬────────────────┘
▼
┌──────────────────────────┐
│ 人工审 alignment-review │ ← 硬门,不确认不融合
└─────────┬────────────────┘
▼
┌──────────────────────────┐
│ 分片融合(每批 1–3 页) │
│ 输出带 evidence 的结构化 │
└─────────┬────────────────┘
▼
┌──────────────────────────────────┐
│ out/:JSON / Markdown / 增强PPT / 网站 │
└──────────────────────────────────┘
五、阶段一:素材归一化
0. 先做素材体检(v2 新增,第一步)
只清点、不改写。输出一份体检表:课件页数、照片张数与拍摄时间范围、文字稿时长、缺什么。缺料直接阻断,不要带着残缺素材往下跑。
1. PPT 归一化
从 PPTX 提取:页码、标题、各文本框内容、表格、图片图表、讲者备注;再用 libreoffice → PDF → pdftoppm 渲染逐页 PNG。
{
"slide_id": "S012",
"page": 12,
"title": "约束条件下的最优解",
"text": ["目标函数", "约束条件", "可行域"],
"speaker_notes": "此处补充课堂例题",
"slide_image": "ppt/slide-png/012.png",
"phash": "af2f68e0e09f9494"
}
2. 照片归一化
对每张照片:
- 读取拍摄时间和原始尺寸。
- 按 EXIF 方向自动旋转(保持原图不动)。
- 计算 pHash(感知哈希)——v2 用它替代 v1 的"视觉向量"。
- 计算清晰度分(拉普拉斯方差归一化)。
- 生成 512px 缩略图。
- 按 pHash 距离去重(≤6 视为同画面),保留清晰度更高的一张,被丢弃的标
dup_of,不删文件。
{
"photo_id": "IMG_0037",
"path": "photos/IMG_0037.jpg",
"captured_at": "2026-09-20T14:32:18+08:00",
"time_source": "exif",
"phash": "af2d60e0e01f9f92",
"quality_score": 0.86,
"dup_of": null
}
v2 去掉了 v1 的"判断是否包含投影屏幕/白板/纸张/人物"和"透视校正"两项——它们需要目标检测模型或至少较重的 CV 流程,当前环境下性价比低。透视校正确认需要时再补。
3. 文字稿归一化
切分为带时间范围的语义片段,并做轻量纠错、同时保留原文:
{
"segment_id": "T0184",
"start": "00:18:32",
"end": "00:20:11",
"text": "这里的重点不是计算,而是先判断可行域。",
"text_raw": "这里的可行欲先判断",
"text_normalized": "这里的可行域要先判断",
"keywords": ["可行域", "约束条件"]
}
六、阶段二:页面级对齐(v2 改造最大的地方)
这是整个方案最关键的一步,也是 v1 最脆弱的一步。
1. v1 的问题
- v1 用 OCR 文字相似度做主判据,但环境里只有 tesseract
chi_sim,对反光/倾斜/摩尔纹的投影照片识别率会明显掉——主判据建在弱 OCR 上,会系统性错配。 - v1 用照片 EXIF「拍摄时间」对齐页序,但照片时间是墙钟时间、文字稿是相对秒数,两者之间缺一个时间基准。结果是前段对得上、后段整体漂移,而且错得很隐蔽。
2. v2 的判据组合
| 信号 | 作用 | v2 变化 |
|---|---|---|
| pHash 相似度 | 主判据:同一页面的重拍/压缩/亮度变化都能匹配 | ✅ 替代"视觉向量" |
| 拍摄顺序 | 约束:课堂按顺序拍,页码只增不减 | ✅ 替代 EXIF 绝对时间 |
| OCR 文字相似度 | 可选补证:版式极像的连续公式页用它二次确认 | ⬇️ 从主判据降级 |
| 文字稿关键词重叠(字符 bigram) | 文字稿归页、补足照片模糊的页 | ✅ 保留并强化 |
| VLM 复核 | 低置信度页人工前的一道机器复核 | ✅ 新增 |
3. 单调序列对齐(v2 核心机制)
不再计算绝对时间,而是求解一个非降序最优指派:把"按拍摄顺序排列的照片序列"映射到"按页码排列的页面序列",要求页码单调不减。
- 收益:彻底绕开时间基准问题——不需要找锚点、不需要处理时区。
- 前提:课堂确实是按顺序拍的。若学员乱翻相册、跨节课混拍或补拍前面的页,单调性被破坏,会连锁错配。
- 兜底:
status != confirmed的页一律进人工复核;不强迫每张照片都匹配页面。
4. 阈值与低置信处理
confirmed(自动确认)/review(人工复核)/weak(弱)/no_photo(无对应照片)。- 低于
photo_floor的照片-页指派直接作废,照片转入"未被指派照片",不污染页面。
务必注意:这些阈值是经验起点值,不是标定值。必须先跑 20–30 页人工标注集校准,把合格线定成"人工只需复核 ≤20% 的页面",而不是死卡 90%(手机拍投影达不到 90%,硬卡会永远过不了)。
5. 对齐结果表(人工审核用)
slide_id,slide_title,photo_ids,transcript_range,confidence,status,notes
S011,目标函数,IMG_0033;IMG_0034,00:16:10-00:18:31,0.94,confirmed,
S012,约束条件,IMG_0037,00:18:32-00:20:11,0.72,review,照片有遮挡
S013,可行域,,00:20:12-00:22:05,0.45,no_photo,未找到对应照片
审核重点:
status != confirmed的页;- 没有匹配照片的 PPT 页(不代表该页不重要);
- 一张照片对应多页的情况;
- 文字稿跨页;
- 老师现场跳过、增加或修改的页面;
- 未被指派照片清单——里面往往藏着板书和临时演示。
七、阶段三:分片融合
1. 每批只处理少量页面
每批包含:1–3 页 PPT(含文字、页码、讲者备注)+ 3–5 张候选照片 + 对应时间段的文字稿 + 草稿中对应段落。不要整份喂模型。
2. 强制 evidence 字段(v2 核心机制)
v1 把"不要编造"写在提示词里——提示词里的约束不可审计。v2 把它落成数据结构:每一条结论都必须挂证据。
{
"slide_id": "S012",
"pptx_page": 12,
"title": "约束条件",
"ppt_content": [
{ "text": "目标函数与约束条件共同决定可行域", "evidence": ["S012"] }
],
"teacher_explanation": [
{ "text": "老师强调先判断约束是否可行,再计算最优解。", "evidence": ["T0184"] }
],
"photo_observations": [
{ "text": "老师在图上圈出了第二个约束条件。", "evidence": ["IMG_0037"], "confidence": 0.88 }
],
"differences": [
{ "type": "live_annotation",
"description": "现场 PPT 比原始文件多了第二个约束条件的圈注。",
"evidence": ["S012", "IMG_0037"] }
],
"merged_notes": [
{ "text": "先判断约束条件,再讨论目标函数的最优解。", "evidence": ["S012", "T0184"] }
],
"confidence": 0.91,
"requires_review": false
}
evidence 取值约定:S### = 课件页、T#### = 文字稿片段、IMG_#### = 课堂照片。
3. 融合顺序
- 确定 PPT 原始内容。
- 确定老师现场实际展示的内容。
- 加入老师的口头解释和例子。
- 对比已有草稿是否遗漏、误解或扩展。
- 标记冲突与不确定信息。
- 生成适合目标读者的讲解文本。
4. 防编造硬规则(写进提示词,逐条对应到上面的字段)
- 只能使用输入材料中出现的事实。
- 图片看不清时写"无法确认",不要根据上下文补全。
- 数字、公式、专有名词必须回到原图和文字稿核对。
- 模型推测必须标记为推测。
- 不能因为某页没有照片就删掉老师 PPT 的内容。
- 不能因为文字稿没讲某页就认为该页不重要。
- 无 evidence 的结论一律标
[未核实]。 - 冲突双写并标注来源,不得静默裁决。
八、阶段四:审校与导出
1. 审核清单
- PPT 页面是否全部被处理。
- 每页是否至少检查了对应照片。
- 未匹配照片是否已经人工查看。
- 时间戳是否存在明显跳跃或错位。
- 公式、数字、人名、专有名词是否正确。
- PPT、照片和文字稿冲突处是否保留说明。
- 草稿中的新增内容是否有来源。
- 最终文章是否混淆了"老师原话"和"整理者解释"。
- 是否所有结论都带 evidence;
[未核实]项是否已清零或保留说明。
2. 建议导出格式
course_fusion.json 完整结构化数据(含 evidence)
alignment-review.csv 页面与照片对齐审核表
unmatched-photos/ 未被指派的照片
conflicts.md 冲突和低置信度问题
final-notes.md 最终课堂笔记
enhanced.pptx 原 PPT + 讲者备注(不覆盖原文件)
index.html 可检索的课程网站
九、执行方式
适合承担:调度、文件读取、图片理解、结构化整理。不建议依赖单次长对话完成全部工作。
推荐执行步骤
- 把整个课程目录交出去,而不是逐张发照片。
- 第一步只做素材体检,不改写内容。
- 第二阶段做归一化与对齐,产出
alignment-review.csv。 - 暂停,人工审核对齐表。
- 第三阶段按页或按 3 页一批融合,逐页输出带 evidence 的 JSON。
- 最后做全局去重、章节合并与语言润色。
- 导出
out/下的全部交付物。
推荐提示词框架
请处理 course/ 目录中的课程素材。
第一步只做体检和索引,不要直接生成最终讲稿:
1. 清点 PPT、PPT 页面图、现场照片、文字稿和现有草稿,输出缺料清单。
2. 提取每页 PPT 的标题、正文和讲者备注。
3. 对照片做排序、pHash、清晰度评分与去重。
4. 用「单调序列对齐」把照片和文字稿匹配到 PPT 页面,给出置信度与证据。
5. 输出 alignment-review.csv 和 unmatched-photos 清单。
严格要求:
- 不修改原始文件。
- 不确定的信息进入待审核列表。
- 不根据上下文补全看不清的公式和数字。
- 每个匹配结果都必须给出证据。
- 对齐表完成后暂停,等待人工确认,再进入融合阶段。
融合阶段要求:
- 每批 1–3 页;每条结论必须带 evidence(S###/T####/IMG_####)。
- 无证据的结论标 [未核实];冲突双写并标注来源。
十、小样验证
不要一开始处理全部材料。先选:10 页 PPT + 20–30 张照片 + 5–10 分钟文字稿 + 一段现有草稿。
| 指标 | 合格标准(v2 修订) |
|---|---|
| 页面与照片对齐 | 自动确认(confirmed)占比达标,人工只需复核 ≤20% 的页面 |
| 内容可追溯 | 100% 的重要结论带 evidence,能定位到 PPT、照片或时间戳 |
| 冲突可见 | 未匹配、低置信度和冲突内容不被隐藏,全部出现在审核表与 conflicts.md |
| 阈值有效性 | 用 20–30 页人工标注集校准后,confirmed 的误配率 < 5% |
v1 的"高置信匹配达到 90% 以上"取消:没有标注口径、也无法在手机拍投影的素材上稳定达成,改成上面可测量、可校准的版本。
小样通过后,再扩充到完整课程。
十一、实施优先级
第一优先级:必须做
- 素材体检(缺料阻断);
- 导出 PPT 页面图片;
- 保留照片原图和拍摄时间;
- 生成带时间戳的转写;
- 先对齐、后融合;
- 人工审核门;
- evidence 字段机制。
第二优先级:显著提升效果
- pHash 去重与清晰度优选;
- 低置信页的 VLM 复核;
- 页面级结构化 JSON;
- 自动生成审核表。
第三优先级:后续扩展
- 照片透视校正(侧拍严重时);
- 时间锚点机制(需要按分钟切片讲稿时);
- 自动生成增强版 PPT;
- 课程网站与检索问答;
- 多门课程的统一知识库。
十二、最终交付建议
第一版先交付:
- 一份完整的融合方案(本文档);
- 一套固定目录规范;
- 一个 10 页小样(含
alignment-review.csv与conflicts.md); - 小样通过后,再批量处理全部照片和 PPT。
附录 A|改造原因与利弊(逐条)
| # | v1 做法 | v2 改造 | 原因 | 利 | 弊 |
|---|---|---|---|---|---|
| 1 | 视觉向量 / embedding | pHash(DCT 8×8) | 环境无 embedding/CLIP 模型与 GPU | 零模型依赖、纯 CPU、单张 <10ms;同页重拍/压缩/亮度变化极稳 | 对倾斜 >30°、透视、大遮挡不鲁棒 |
| 2 | OCR 作主判据 | OCR 降级为可选补证 | 仅有 tesseract chi_sim,投影照片中文识别不可靠 |
避免"错配还很自信";耗时大幅下降 | 失去文字级证据,连续相似版式页区分力下降 |
| 3 | EXIF 时间对齐页序 | 单调序列对齐(DP) | 墙钟时间 vs 相对秒数缺少基准,后段整体漂移 | 彻底绕开时间基准、时区问题 | 依赖"按顺序拍"的前提;乱序/混拍会连锁错配 |
| 4 | 提示词要求"别编造" | 强制 evidence 字段 |
提示词约束不可审计 | 可审计、可抽检、可定位错误环节 | 输出变长,token 消耗上升 |
| 5 | 未定义未匹配照片 | 单列未指派照片 + photo_floor |
板书/噪声照片不应被硬塞进页面 | 不丢板书,不污染页面 | 人工要看的东西变多 |
| 6 | 硬性 90% 合格线 | 可校准阈值 + "人工复核 ≤20%" | 90% 无标注口径,手机拍投影达不到 | 可测量、可按课调参 | 默认阈值是经验值,未标定前不可当结论 |
| 7 | 融合自由发挥 | 结构化任务包(schema + 硬规则 + 提示词) | 输出同构才能批量核验与回滚 | 可批量校验、可断点续跑 | 灵活性下降,特殊版式需人工改写 |
| 8 | 未提合规 | 明确课件著作权 + 学员肖像权须书面授权 | 不解决就不能对外交付 | 避免白做 | 增加一个非技术卡点,交付范围可能受限 |
保留不变的(v1 本来是对的):四阶段流水线、先对齐后融合、每批 1–3 页、保留原文与归一化文本双份、先跑小样、不覆盖原 PPT。
附录 B|环境能力实测(2026-09-24)
| 能力 | 状态 |
|---|---|
| python-pptx 1.0.3 | ✅ 可抽 pptx 文本与讲者备注 |
| OpenCV 4.13 / Pillow 12 / numpy | ✅ pHash、旋转、清晰度、缩略图 |
| tesseract + chi_sim / eng | ⚠️ 可用,但仅通用 OCR,不作主判据 |
| libreoffice / pdftoppm | ✅ pptx→pdf→逐页 PNG |
| ImageMagick / ffmpeg | ✅ |
| whisper / faster-whisper | ✅ 已装,无 GPU,纯 CPU |
| VLM(看图理解) | ✅ 可用(已实测) |
| 视觉向量 / CLIP | ❌ 未安装,且无 GPU |
| 硬件 | 4 vCPU / 7GB 内存(可用约 3GB)/ 无 GPU;同机还跑着生产服务 |
结论:批量 OCR / ASR / VLM 必须限并发、走隔离进程或独立时段,避免与生产争抢资源。
附录 C|待办与风险
- 阈值标定:需要 20–30 页人工标注集才能定课程级阈值。
- 时间锚点机制:若需按分钟切片讲稿,仍需一张"能同时读到页码"的照片作为锚点。
- 透视校正:侧拍严重的课程需要补 cv2 四点变换。
- VLM 复核自动化:目前低置信页的机器复核仍是人工触发步骤。
- 增强版 PPT:讲者备注与照片引用的回写尚未实现。
- 合规:需要一份"课件使用 + 肖像使用"授权书模板;在拿到书面授权前,成果限定为内部学习用途,不对外发布。
- 资源隔离:整套批处理不得占用对话主会话,避免长任务把在线服务拖死。
版本:v2(改造版) 日期:2026-09-24
配套:一键审稿 式的"先对齐、后融合"脚本与技能见 projects/course-fusion/