{/* 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
相关 skillhyperframes, kanban-video-orchestrator, comfyui

参考:完整 SKILL.md

INFO

以下是 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,或在安装了 hyperframes skill 时用它(剪辑参考里有一个 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(仅阻断远程生成)——远程被阻断时,本地脚本/音频工作仍可继续。

工作流

  1. 新建或恢复一个任务。 新任务:

    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 + 质检报告,从最早未完成的状态继续——绝不重新生成已通过验收的内容。

  2. 人工输入复核。 真正去看讲解者图片(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(记录报告路径)——运行后要重新读取,而不是编辑一份过期副本。

  3. 锁定内容与音频 — 阅读 references/generation.md。脚本 → 通过 text_to_speech 生成完整旁白 → 用 ASR 对照脚本校验旁白 → 记录真实时长。锁定后的音频是下游一切的主时钟。

  4. 规划并生成讲解者形象 — 阅读 references/generation.md。先做一段低成本的短试点;试点通过身份与口型时机复查后再跑完整流程。

  5. 剪辑 — 阅读 references/editing.md。由锁定音频驱动的确定性时间线;字幕和关键词标注只在音频与素材定稿后才加。

  6. 校验并交付 — 阅读 references/qa-recovery.md,渲染,然后:

    bash "$SKILL_DIR/scripts/finalize_delivery.sh" \
      ~/Videos/my-presenter-video/renders/rendered.mp4 \
      ~/Videos/my-presenter-video/outputs my-video
    

    finalizer 保持宽高比,跑两遍响度归一化(节目 ≈ −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。