{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
AI 演示视频
从脚本 + 图片制作经过校验的 AI 讲解视频。
Skill 元数据
| 来源 | 可选 — 通过 hermes skills install official/creative/ai-presenter-video 安装 |
| 路径 | optional-skills/creative/ai-presenter-video |
| 版本 | 1.0.0 |
| 作者 | cclank (https://github.com/cclank/lanshu-create-ai-presenter-video),由 Hermes Agent 移植 |
| 许可证 | MIT |
| 平台 | linux, macos |
| 标签 | video, presenter, avatar, lipsync, tts, captions, creative |
| 相关 skill | hyperframes, kanban-video-orchestrator, comfyui |
参考:完整 SKILL.md
以下是 Hermes 在触发此 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。
AI 讲解视频
把一个主题(或现成脚本)外加一张已授权的成人讲解者图片,变成一支完整、可直接发布的讲解者出镜视频:锁定旁白、带口型同步质检的数字人形象生成、字幕、确定性剪辑、响度归一化的母版/分享版编码,以及机器 + 视觉验收报告。
本 skill 既可用于新建讲解者视频,也可用于继续、修订、加字幕、修复口型同步或重新导出一个已有的讲解者视频任务。工作流与提供商无关:从会话中实际可用的能力里挑选生成手段(通过 image_generate 调用 FAL 视频/图片模型以及视频生成插件,通过 text_to_speech 做 TTS,通过 whisper/STT 工具做 ASR,用 ffmpeg 完成一切确定性操作)。
移植自 cclank/lanshu-create-ai-presenter-video(MIT)。上游正文在
references/中基本保持原样;Hermes 的适配部分集中在本中枢文件中。脚本是确定性的(无网络、无凭据)。
Hermes 适配说明(先读)
-
Skill 目录解析 — 上游把它自己 agent 的 skill 路径写死了。在 Hermes 中,加载器会把
${HERMES_SKILL_DIR}展开为本 skill 的安装目录,因此下面每条命令都直接使用该令牌:SKILL_DIR="${HERMES_SKILL_DIR}"Shell 变量在两次工具调用之间不会保留——在每条用到它的终端调用里都要重新粘贴该赋值(或展开后的路径)。
-
能力映射 — 当参考文档里说"某个语音生成能力"时,用
text_to_speech(按用户配置走 OpenAI/Edge/ElevenLabs);"讲解者/数字人生成" → 通过配置好的视频工具走 FAL 图生视频系列(Kling、Wan、MiniMax H3 等),或用户有权限的某个数字人/口型同步端点;"带词级时间戳的 ASR" → 通过 STT 工具走 whisper,或在 venv 里用faster-whisper;"确定性合成器" → ffmpeg filtergraph,或在安装了hyperframesskill 时用它(剪辑参考里有一个 HyperFrames 小节可直接对应)。 -
视觉质检 — 用
vision_analyze对生成的联系表(contact sheet)加抽帧做"常速视觉复查"(身份、口型时机、手部、眨眼、连贯性)。数值检查来自脚本的 ffprobe 输出。 -
付费生成需征得同意 — 远程数字人/TTS 生成是计费的。遵循上游操作规则:在第一次付费调用前,说明已上传的素材、所需时长、已知成本、试点规模和重试上限,并取得用户的明确同意。在
job.json中remote_upload_approved为 true 之前,绝不要把讲解者图片上传到远程提供商。 -
同意标志位位于
input下 —rights_confirmed、adult_presenter_confirmed、remote_upload_approved、voice_clone_approved都在job.json的input对象内(init 标志会设置它们;手工编辑必须改input.*,而不是任务根节点)。manual_input_review.*位于根节点。preflight.py会区分errors(阻断一切)和remote_blockers(仅阻断远程生成)——远程被阻断时,本地脚本/音频工作仍可继续。
工作流
-
新建或恢复一个任务。 新任务:
python3 "$SKILL_DIR/scripts/init_job.py" \ --job-dir ~/Videos/my-presenter-video \ --presenter-image /path/to/presenter.png \ --topic "explain context engineering in one minute" \ --duration 60 --aspect 9:16 \ --rights-confirmed --adult-presenter-confirmed已有脚本文件用
--script;其他标志:--voice-sample、--supporting-media、--width、--height、--fps、--watermark、--cta。对已有任务,读取job.json+ 质检报告,从最早未完成的状态继续——绝不重新生成已通过验收的内容。 -
人工输入复核。 真正去看讲解者图片(
vision_analyze)并听任何语音样本;通过设置job.json中的manual_input_review布尔值记录结论,例如:python3 - <<'PY' import json p = "~/Videos/my-presenter-video/job.json" # expand ~ or use an absolute path import os; p = os.path.expanduser(p) j = json.load(open(p)) j["manual_input_review"].update(image_viewed=True, single_clear_face=True, image_has_no_unwanted_text=True) json.dump(j, open(p, "w"), indent=2) PY然后做门禁检查:
python3 "$SKILL_DIR/scripts/preflight.py" ~/Videos/my-presenter-video/job.json仅当
ok: true时才继续;仅当remote_ready: true时才做远程生成。注意:preflight 会就地更新job.json(记录报告路径)——运行后要重新读取,而不是编辑一份过期副本。 -
锁定内容与音频 — 阅读
references/generation.md。脚本 → 通过text_to_speech生成完整旁白 → 用 ASR 对照脚本校验旁白 → 记录真实时长。锁定后的音频是下游一切的主时钟。 -
规划并生成讲解者形象 — 阅读
references/generation.md。先做一段低成本的短试点;试点通过身份与口型时机复查后再跑完整流程。 -
剪辑 — 阅读
references/editing.md。由锁定音频驱动的确定性时间线;字幕和关键词标注只在音频与素材定稿后才加。 -
校验并交付 — 阅读
references/qa-recovery.md,渲染,然后:bash "$SKILL_DIR/scripts/finalize_delivery.sh" \ ~/Videos/my-presenter-video/renders/rendered.mp4 \ ~/Videos/my-presenter-video/outputs my-videofinalizer 保持宽高比,跑两遍响度归一化(节目 ≈ −16 LUFS),产出母版 + 分享版编码,对两者做解码校验,写出交付报告 JSON,并生成一张九帧联系表。在宣称完成前,用
vision_analyze检查联系表。
操作规则(不可协商)
- 在相关远程操作之前,确认图片权利、成年身份、远程上传批准和语音克隆授权。
- 绝不根据图片推断或克隆真实人物的声音;使用已授权的样本或现成的 TTS 声音。
- 在讲解者形象生成、字幕时间轴或最终场景边界之前,先锁定完整旁白。
- 最终合成中将视频源静音;只有获批的旁白和有意混入的音轨带音频。
- 保留提供商请求体和任务 ID(去掉凭据/会过期的 URL)。重新提交前先轮询被中断的任务——避免重复计费。
- 三个付费候选被拒后停止,并总结失败模式。
- 在最终文件完整解码、且联系表或完整回放已复查之前,不得宣称完成。
最少输入时的默认值
9:16、1080×1920、30fps;由主题生成的视频目标时长 45–75 秒;无授权样本时用现成声音;讲解者出镜版式,钩子 → 2–4 个节拍 → 收尾;除非要求,不加音乐/CTA;语言根据请求推断。
参考路由
references/generation.md— 接单、内容、语音、能力选择、讲解者提示词、付费生成、提供商切换。references/editing.md— 时间线约定、开场/结尾、字幕、关键词标注预设、HyperFrames 合成、导出。references/qa-recovery.md— 技术验收、视觉验收,以及口型/身份/手部/曝光/冻结/字幕/音频故障的恢复。
常见坑
preflight.py需要 ffprobe;在干净机器上先装 ffmpeg。- 由 init 标志设置的同意布尔值落在
input.*下;在 job-json 根节点编辑它们会静默无效(preflight 持续阻断)。 finalize_delivery.sh需要 bash + jq + awk,以及一个完全可解码的输入——被截断的渲染会按设计(而非意外)在解码检查处失败。- 长数字人片段会漂移:优先用一段连续的讲解者源,在音频时间线上切片,而不是重新生成多段章节片段(多次重生成间的身份漂移是视觉质检失败的头号原因)。
- FAL 图生视频端点有时长上限(通常 5–15 秒);据此规划章节级讲解者分段,并在端点支持时复用试点的种子/参数以保持一致。
验证
已实际跑通验证(2026 年 8 月):init_job.py → 生成状态机正确的 job.json;preflight.py 在输入未复核时正确阻断,复核布尔值后翻转为 ok: true,并在 input.remote_upload_approved 之前保持 remote_ready: false;finalize_delivery.sh 在一段合成的 5 秒 1080×1920 渲染上产出了解码校验通过的母版(631kbit/s)+ 分享版编码、交付报告 JSON 和一张 9 帧联系表,退出码 0。