PPT to Video (Keynote) v2.0
将演示文稿 + 背景材料 → 风格化播报视频
核心流程:
输入评估 → 内容理解 → 风格确定 → 讲稿生成 → 方案确认 → 技术合成 → 质量验证
(LLM) (LLM) (LLM) (LLM) (LLM) (脚本) (脚本)
Phase 0 Phase 1 Phase 1 Phase 1 Phase 2 Phase 3 Phase 4
🚨 执行纪律(最高优先级)
- PHASE 分隔 — Phase 0-2 由 LLM 驱动(认知决策),Phase 3-4 由脚本驱动(技术合成)
- BLOCKING 步骤 — Phase 0(输入不足时)和 Phase 2(方案确认)⛔ 必须等待用户响应
- 禁止跳过确认 — 未经 Phase 2 用户确认,不得调用 generate.js
- 脚本做技术,LLM 做内容 — 脚本不判断风格、不改写讲稿、不做内容决策
- 串行执行 — Phase 必须按顺序执行,不得跳跃
- 讲稿必须是纯文本 — 不含 markdown 标记,直接喂给 edge-tts
Phase 0: 输入评估
🚧 GATE: 用户提供了输入目录或文件
0.1 扫描输入
# 扫描所有相关文件
find <input_dir> -type f \( -name "*.pptx" -o -name "*.ppt" -o -name "*.pdf" -o -name "*.md" -o -name "*.txt" -o -name "*.docx" \) 2>/dev/null | sort
# 统计
ls -la <input_dir>
0.2 完整性评分
| 材料 | 必需 | 权重 | 评分规则 |
|---|---|---|---|
| PPT 文件 | ✅ 必需 | - | 无则直接报错退出 |
| 讲稿 (notes/*.md) | ❌ 可选 | 40% | 按 PPT 页数比例 |
| 背景材料 | ❌ 可选 | 30% | 存在即满分 |
| 方案说明 | ❌ 可选 | 30% | 存在即满分 |
0.3 交互策略
≥80分 → 自动进入 Phase 1
50-79分 → 提示用户:
"当前输入评分 {score}/100,讲稿覆盖 {n}/{total} 页。
建议补充:{缺少项}
[1] 直接继续(LLM 将基于现有材料生成)
[2] 我稍后补充"
→ 确认后进入 Phase 1
<50分 → ⛔ BLOCKING,展示补充清单,等待用户
0.4 创建项目目录
在 project/ 目录下创建独立项目文件夹,将用户输入文件拷贝到项目目录中,确保在"笼子"里操作:
# 项目名:日期 + 简短描述
PROJECT_NAME="ppt-$(date +%Y%m%d)-<short-desc>"
PROJECT_DIR="<workspace>/project/${PROJECT_NAME}"
mkdir -p "${PROJECT_DIR}/scripts_rewritten/"
mkdir -p "${PROJECT_DIR}/input/"
# 拷贝用户输入文件到项目目录(保护原始文件)
cp <input_dir>/*.pptx "${PROJECT_DIR}/input/" 2>/dev/null
cp <input_dir>/*.ppt "${PROJECT_DIR}/input/" 2>/dev/null
cp <input_dir>/*.pdf "${PROJECT_DIR}/input/" 2>/dev/null
# 如果有 notes 或背景材料,也拷贝
find <input_dir> -name "*.md" -o -name "*.txt" | while read f; do
cp "$f" "${PROJECT_DIR}/input/"
done
规则:
- 所有操作在项目目录内进行
- 原始文件不被修改或删除
- 临时文件(截图、音频、视频片段)也放在项目目录的
.temp/子目录下 - 项目完成后,用户可选择保留或删除项目目录
Phase 1: 内容理解 & 讲稿生成
🚧 GATE: 输入评估通过,项目目录已创建
1.1 PPT 内容提取
python3 <SKILL_DIR>/scripts/extract_ppt_text.py "<PROJECT_DIR>/input/<pptx_file>" > "<PROJECT_DIR>/ppt_text.md"
1.2 风格确定
LLM 分析 PPT 内容后,向用户推荐风格(⛔ BLOCKING):
根据内容分析,推荐以下风格:
[1] 技术培训 (tech_training) — 适合教程/概念讲解
[2] 故事讲述 (story) — 适合案例/场景代入
请确认或自选。
6 种风格速查:
| ID | 名称 | 适用 | 音色 | 语速 |
|---|---|---|---|---|
news | 新闻播报 | 情报/资讯 | XiaoxiaoNeural | +30% |
tech_report | 技术汇报 | 方案/架构 | YunxiNeural | +20% |
tech_training | 技术培训 | 教程/入门 | YunxiNeural | +15% |
story | 故事讲述 | 案例/产品 | YunxiNeural | +10% |
business | 商业演讲 | BP/路演 | YunjianNeural | +25% |
casual | 轻松闲聊 | 团队分享 | XiaoyiNeural | +20% |
1.3 讲稿生成
LLM 读取:
ppt_text.md(PPT 文字)- 已有的 notes/*.md(如果有)
- 背景材料(如果有)
为每页生成演讲稿,遵循 通用规则 + 风格特定规则:
通用规则(所有风格):
- 纯文本输出,不含 markdown(**、#、|、` 等)
- 用标点控制节奏:逗号=短停,句号=正常停,破折号=强调
- 每 3-5 句换句号,给听众喘息
- 先重点后事实,每页开头一句话概括核心
- 特殊字符:数字转中文读法,缩写分开读,表格转叙述
- 每页标注预计时长(目标 10-30 秒)
风格特定规则(详见 DESIGN.md §1.3):
每种风格有独立的句式、开场、过渡、结尾、语气规范。生成讲稿时必须严格遵守当前风格的写作规范。
1.4 保存讲稿
每页保存为独立纯文本文件:
<PROJECT_DIR>/scripts_rewritten/
├── 01_xxx.txt
├── 02_xxx.txt
├── ...
└── 19_xxx.txt
文件内容格式:
{纯文本讲稿内容,直接可喂 TTS}
1.5 生成方案总览
生成 <PROJECT_DIR>/video_design_spec.md(用于 Phase 2 确认):
# 📹 {项目名} - 视频生成方案
## 基础信息
| 项目 | 值 |
| PPT 总页数 | {n} |
| 讲稿覆盖 | {n}/{n} (100%) |
| 预计总时长 | {t} 秒 |
## 全局风格
| 风格 | {style_name} |
| 主音色 | {voice} |
| 语速 | {rate} |
## 逐页预览
| 页码 | 标题 | 内容类型 | 时长 | 讲稿预览 |
| 1 | ... | ... | ...s | "前25字..." |
...
同时生成脚本可读的 JSON:
# LLM 手动创建或生成 <PROJECT_DIR>/video_design_spec.json
JSON 结构:
{
"global": { "style": "tech_training", "styleName": "技术培训", "defaultVoice": "zh-CN-YunxiNeural", "rate": "+15%" },
"pages": [
{ "num": 1, "title": "封面", "contentType": "封面", "pageStyle": "story", "voice": "zh-CN-XiaoxiaoNeural", "rate": "+15%", "duration": 15 }
]
}
Phase 2: 方案确认
🚧 GATE: Phase 1 完成,方案总览已生成 ⛔ BLOCKING — 必须等待用户确认
向用户展示 video_design_spec.md,等待响应:
请确认:
1. 确认生成 → 进入 Phase 3
2. 修改第X页 → 重新生成该页 → 再次确认
3. 调整风格/音色 → 更新设置 → 重新确认
用户确认后,进入 Phase 3。
Phase 3: 技术合成
🚧 GATE: Phase 2 用户已确认
调用 generate.js,纯自动化执行:
node <SKILL_DIR>/scripts/generate.js \
--slides "<PROJECT_DIR>/input/<pptx_file>" \
--scripts-dir "<PROJECT_DIR>/scripts_rewritten/" \
--output "<output_dir>" \
--spec "<PROJECT_DIR>/video_design_spec.json" \
--project-dir "<PROJECT_DIR>" \
--keep-temp
脚本职责:
- PPT 截图(LibreOffice → pdftoppm)
- TTS 合成(edge-tts,直接读取纯文本)
- 视频片段合成(ffmpeg)
- 片段拼接(ffmpeg concat)
脚本不做:内容判断、风格检测、讲稿改写。
Phase 4: 质量验证
🚧 GATE: Phase 3 完成
bash <SKILL_DIR>/scripts/verify_video.sh <output_video> <expected_pages>
检查项:
- 文件存在且 > 1MB
- H.264 + AAC 编码
- 1280×720 分辨率
- 页数匹配
- 每段音频 > 3 秒
生成 VIDEO_COMPLETE.md 报告,向用户输出结果。
🛠️ 依赖要求
# 必需
node --version # v18+
python3 --version # 3.8+
ffmpeg -version # 5.0+
libreoffice --version # 7.0+
edge-tts --version # 7.0+
# Python 依赖
pip install python-pptx # PPTX 文字提取
pip install PyMuPDF # PDF 文字提取(可选)
# 系统依赖
sudo apt-get install poppler-utils # pdftoppm
⚠️ 故障排除
| 问题 | 解决 |
|---|---|
extract_ppt_text.py 报错 | pip install python-pptx |
| edge-tts 失败 | 检查网络;文本超长时分段合成 |
| 截图失败 | libreoffice --version 检查安装 |
| 视频合成失败 | ffmpeg -version 检查;检查截图/音频文件存在 |
| TTS 读出 markdown 符号 | 检查讲稿是否为纯文本,无 **/#/ |
🔗 相关技能
- pptx-master: 专业 PPT 生成
- fireworks-tech-graph: 架构图生成
版本: v2.0 | 架构参考: pptx-master 多阶段串行管道模式