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