插件安装: 在执行设置或更新命令之前,请遵循 插件执行规则 — 当此技能位于 HyperFrames 插件内部时适用。独立安装则保留下面的更新说明。
首先,保持此技能最新 — 在执行前与用户确认:
npx hyperframes skills update faceless-explainer。当一切为最新时,这是一个快速空操作;否则,它会在此技能以及它所依赖的核心领域技能生效前对其进行刷新。
media-use:在获取音频/图片/logo 之前,调用
/media-use以从 HeyGen 目录中解析 BGM/音效/图片,并从其官方来源获取品牌 logo。请先运行--adopt注册现有资源。参见/media-use技能。当宿主应用提供其自己的音乐或音效工具时,请使用这些工具来处理音乐和音效。
无人讲解到 HyperFrames
使用此技能将一段文字转化为解说视频:选择一个设计系统,规划一个教学故事,然后在 HyperFrames 中逐帧构建。无人讲解 意味着所有视觉元素都会在后续生成 —— 没有截取步骤,也没有真实的资源清单。
入口是
/hyperframes。 您是编排者。依次执行每一步,验证其关卡,然后再继续。此技能用于从文本中讲解主题,没有产品也没有网站可供截取。任何其他意图、简单的“制作视频”或任何不确定的情况 → 首先阅读/hyperframes—— 意图层负责所有路线决策,一个直接到达此处而没有BRIEF.md的新创建请求也需要通过它(设置的开场规则)。
您是编排者。在 videos/<project>/ 中工作。按顺序运行步骤并在继续之前通过每个关卡。用户关卡是步骤0、步骤3和步骤6。在步骤0之前阅读 ../hyperframes/references/brief-contract.md —— 它定义了关卡类型以及 BRIEF.md 的 flow/storyboard 如何派生模式,该模式管理步骤3/4/6的关卡。除了步骤5(您需要为每帧分派一个子代理)之外,所有步骤都亲自动手。不要在这里放置设计或动效规则;这些规则位于帧工作子代理、此技能本地的 ../hyperframes-animation/rules/ + ../hyperframes-animation/blueprints/ 以及 hyperframes-creative 中。
工作流:步骤0 设置 → hyperframes.json;步骤1 简报 → capture/extracted/;步骤2 设计系统 → frame.md;步骤3 故事板/脚本 → STORYBOARD.md 和 SCRIPT.md;步骤3.1 音频 → audio_meta.json;步骤4 视觉设计 → 增强版 STORYBOARD.md;步骤5 帧 → compositions/frames/NN-*.html 和 index.html;步骤6 最终渲染 → renders/video.mp4。
步骤 0:设置
目标:带着已确认的简报进入,创建 HyperFrames 项目,并使简报持久化。
简报由意图层确认,而不是通过此处提问确认。 开场规则,按顺序:(1) BRIEF.md 存在 → 阅读它,不再提问 —— 简报已确定,其 flow/storyboard 派生模式(简报合同 § 1)。(2) 没有 BRIEF.md 但项目存在(磁盘上有 hyperframes.json / STORYBOARD.md)→ 从故事板的前言和已记录的首选项继续;从不重新审问一个半构建完成的项目。(3) 两者都没有 —— 一个直接到达此处的新创建请求 → 阅读 /hyperframes 并运行其意图层(references/intent-interview.md):它检查配方和已记忆的默认值,进行此路线的提问(../hyperframes/references/routes/faceless-explainer.md),并返回锁定的简报。编辑请求跳过所有这些 —— 直接进行编辑。
仅当 hyperframes.json 缺失时才初始化。从主题使用 kebab-case 命名 <project>,例如 compound-interest-explained;绝不要使用工作空间名称或时间戳。
npx hyperframes init "videos/<project>" --non-interactive --example=blank --skill=faceless-explainer —— init 检查已安装的技能与 GitHub 上的最新版本,并在有任何技能过期时更新全局集合。
初始化后,让 <PROJECT_ROOT> 为 videos/<project>,并以此目录作为工作目录运行每个后续的相对路径命令。在下面的命令中,. 表示 <PROJECT_ROOT>;永远不要在调用者目录中写入 .media、capture 或输出文件。
在 init 后立即写入 BRIEF.md(永远不要在之前 —— init 会拒绝非空目录):意图层锁定的简报,格式遵循 ../hyperframes/references/brief-format.md。将 <MEDIA_DIR> 解析为已安装的 /media-use 技能目录。然后使用 node <MEDIA_DIR>/scripts/prefs.mjs record --hyperframes . 记录每个基于首选项的答案(brief-format.md 指定了子集)。如果意图层采用了一个配方,运行 node <MEDIA_DIR>/scripts/recipe.mjs use --hyperframes . --name <name>;它会将其 frame.md 复制到项目中(步骤2随后被跳过)并返回步骤3根据其草稿的骨架。配方填充答案,而非批准;审核关卡仍然运行。
在继续设置之前显示登录状态 —— 运行 npx hyperframes auth status 并逐字转发其输出。它会报告是使用 HeyGen 还是本地引擎来实现语音/BGM,以及在未登录时如何登录。应用一个分支:
- 协作: 等待用户登录或明确选择
offline/go。 - 自主: 说明状态并通过可用的本地引擎继续。
当没有离线提供商存在时,不要无声地省略必需的功能;要明确指出阻碍。不要将此决定并入另一个问题或将密钥写入每个仓库的 .env 文件中。认证所有权和离线回退:/media-use 中的 references/setup-providers.md § 提供商。
关卡: hyperframes.json 和 BRIEF.md 存在;基于首选项的答案已记录(简报合同 § 2);登录状态已显示(已登录,或作为离线继续)。
步骤 1:简报(无截取)
目标:将用户的文本作为信息源纳入项目。没有网站截取,也没有真实资源 —— 这是一个无人讲解的解说。
逐字保存用户的完整输入,然后手动创建合成的截取包:
capture/extracted/visible-text.txt—— 完整的文章/笔记/主题/简报,逐字记录。这是信息的来源,并非故事模板(步骤3会重塑它)。capture/extracted/tokens.json——{ "title": "", "description": "", "colors": [], "fonts": [] }。从简报中填充title/description。除非用户明确给出了品牌颜色或字体,否则让colors/fonts保持为空 —— 如果给出了,则添加它们(设计预设无论如何都会提供一个完整的调色板)。
如果用户粘贴了一个脚本或希望保留其措辞,请将其逐字保存为 user_script.txt;VO_MODE(逐字或重构)来自 BRIEF.md —— 意图层在脚本到达时会询问它。仅当简报不知何故缺少此信息时,才在此处询问一次,并将答案存储起来供步骤3使用。
不要 运行 npx hyperframes capture(没有 URL)。不要创建 asset-descriptions.md 或填充 capture/assets/ —— 无人讲解的视觉元素将在步骤4-5中创作生成,而非截取。唯一的例外是:如果用户提供了一张真实图片,将其放在 public/<basename> 下,并在步骤3中注明。
关卡: capture/extracted/visible-text.txt 和 capture/extracted/tokens.json 存在;您可以用一句清晰的话说明解说的主题和受众。
步骤 2:设计系统
目标:选择一个内置帧预设;一个脚本将其转化为此视频的 frame.md + 字幕皮肤。
当 BRIEF.md 指定了一个 style_preset —— 用户在意图层通过观看展示作品亲自挑选的 —— 使用它;只有当简报未指定时,判断调用权才属于您。然后您做出唯一一次调用 —— 选择哪个预设:阅读 ../hyperframes-creative/references/design-spec.md 并浏览 ../hyperframes-creative/frame-presets/;选择外观最适合主题、语气和受众的预设。然后运行:
node <SKILL_DIR>/scripts/build-frame.mjs --preset <name> --hyperframes .
脚本会确定性地完成其余工作:将预设的 FRAME.md 复制 → frame.md,并将其重新混合到 capture/extracted/tokens.json 中的任何品牌令牌上(品牌颜色按角色映射到预设的颜色键上;预设的显示 + 正文字体替换为品牌的字体),将预设的字幕皮肤复制到 .hyperframes/caption-skin.html,并自我验证(在映射错误时退出 1)。一旦它退出 0 就继续 —— 不要手动编辑规范。
一个无人讲解的解说通常没有品牌颜色/字体(tokens.json 中的颜色/字体为空)→ 脚本会保留预设自己的调色板,一个完整的可交付用的设计。只有当用户指定了品牌颜色/字体时,才在运行前将它们添加到 tokens.json,并且只有在确实需要调整映射时才在之后手动编辑 frame.md。
关卡: build-frame.mjs 退出 0 —— frame.md 来自一个命名的预设,并且(当预设提供一个时).hyperframes/caption-skin.html 作为字幕皮肤源存在;所选的预设已记录为首选项(--key style_preset --workflow <this workflow>,简报合同 § 2)。
步骤 3:故事板和脚本
目标:将文本转化为一个已批准的逐帧教学计划。
阅读 ../hyperframes-creative/references/story-spine.md(钩子语言、价值先于证据、故事板作为提案、源可追溯的视觉)、references/story-design.md、../hyperframes-animation/blueprints-index.md、../hyperframes/references/storyboard-format.md 和 ../hyperframes/references/script-format.md。使用它们来编写 STORYBOARD.md,以及当需要旁白时编写 SCRIPT.md。从简报的 length 设置前言中的 duration: —— 一个粗略的预期;组装时会报告剪辑最终位置与之的差距。
使用 story-design.md 来获得解说结构(概念/操作指南/列表文章/故事)、钩子策略、清晰化技术、情感节拍、类型枚举映射以及 VO_MODE。视频的序列来自叙事设计,而非输入文本的段落顺序 —— 可以重新排序、合并、省略、压缩。作为软指南,查阅 ../hyperframes-animation/blueprints-index.md 中的角色→蓝图菜单:对于每个节拍,按照其候选蓝图所暗示的形状编写画外音,并在适合时标记该候选 blueprint: id。教学真理仍然决定哪些节拍存在 —— 永远不要强迫节拍适合蓝图,也永远不要仅仅因为有一个经过验证的形状可用而发明节拍。无人讲解的视觉元素在后续生成,因此帧不携带资源清单:除非用户提供了真实的 public/<basename> 图片,否则让 asset_candidates 保持为空。使用来自故事板和脚本参考的精确必需字段。
草拟完成后,运行审核循环的计划步骤 —— ../hyperframes/references/review-loop.md § 1:将计划作为提案呈现,并询问两个问题 —— 批准或更改,以及先看草图(推荐)或跳过。反馈以聊天回复的形式出现;循环直到获得批准。这是一个检查关卡(简报合同 § 1):在自主模式下没有什么可问的 —— 将相同的摘要作为预告发布并继续;草图会被纳入构建中,而最终预览(含一个问题)在步骤6进行。
关卡: STORYBOARD.md 存在,每帧都有必需的叙事字段,当需要旁白时 SCRIPT.md 存在,并且用户批准了逐帧计划(自主模式:摘要已作为预告发布)。
步骤 3.1:音频
目标:从已批准的脚本生成旁白、单词时间码、音乐和音频元数据。
在步骤3获得批准后开始音频。在后台运行它,然后继续执行步骤4。(登录状态已在步骤0中显示;引擎会自动回退。)
在调用之前,根据用户的请求选择旁白声音。 如果请求指定了声音、性别或语气,请选择一个匹配的声音 id 并使用 --voice <id> 传递它。否则,管道默认值在 HeyGen 上是 Marcia(女声),在 Kokoro 上是 am_michael —— 因此像“男声”这样的请求除非您传递了标志,否则会被忽略。声音 id 因提供商而异;根据步骤0的登录状态选择的提供商进行解析:HeyGen(已登录)通过 node <MEDIA_DIR>/audio/scripts/heygen-tts.mjs --list(或 GET /v3/voices?engine=starfish);Kokoro(离线)通过 <MEDIA_DIR>/audio/references/tts.md 中的声音表(前缀 am_/bm_ 男声,af_/bf_ 女声)。当用户未表达任何偏好时,在管道默认值之前回退到已记忆的声音(简报合同 § 2),并说明您使用了哪个;仅当两者都没有指定时才省略 --voice。当用户在此次运行中明确选择了某个声音时,记录下来(prefs.mjs record --key voice)。
node <SKILL_DIR>/scripts/audio.mjs --script ./SCRIPT.md --storyboard ./STORYBOARD.md --hyperframes . --out ./audio_meta.json --voice <voice-id> &
音频脚本处理旁白、单词时间码、从 HeyGen 音乐库查找 BGM 和时间元数据。BGM 氛围来自故事板的 music: 字段。这使用 HeyGen 音频 API 进行检索而非生成,并使用与 TTS 相同的 ~/.heygen 凭据。有关提供商详情,请阅读 ../media-use/audio/references/tts.md。当宿主应用自己的工具制作音乐或音效时,将文件放在 assets/ 下,并在 audio_meta.json 文件中列出,标记为 "source": "host":音乐作为 bgm { "path": "assets/…", "source": "host" },故事板中 music: none;音效作为 sfx 条目 { "frame": <n>, "file": "assets/…", "offset_s": 0, "duration_s": <its length>, "source": "host" }。每次音频处理都会保留这些,带有宿主声音的帧不会获得查找的提示。
如果没有旁白且没有 SCRIPT.md,则跳过语音生成。如果故事板有音乐氛围,BGM 可能仍然运行。
标准的完全静音标记(在此复用此音频模型的工作流之间共享):STORYBOARD.md 顶部 YAML 块中的 music: none,没有 SCRIPT.md,并且没有 sfx: 提示或宿主音频。此组合将项目标记为静音。
步骤 4:视觉设计
目标:丰富故事板中的帧描述,添加详细的视觉方向。由于视觉元素是生成的,因此编辑受到原点帧预设的约束。
对于 STORYBOARD.md 中的每一帧,丰富其 composition: 和 visual: 字段,参考 frame.md(视口、时间线、混音)、../hyperframes-animation/blueprints-index.md 中的蓝图提示、../hyperframes-animation/rules/ 中的规则 / 词汇表,以及 ../hyperframes-creative/references/style-guide.md。这些必须可操作 —— 帧工作子代理将根据此信息构建帧。
此步骤在静默模式中可能看起来是确定性的。 更改仅限于根据 frame.md 的约束是什么而锁定。
关卡: STORYBOARD.md 已更新为丰富的视觉描述。
步骤 5:帧构建
目标:为每帧分派一个独立的子代理,以从 frame.md、audio_meta.json 和丰富的视觉描述构建 NN-*.html 文件。
阅读 ../hyperframes-animation/blueprints-index.md 和 references/dispatch.md,然后为 STORYBOARD.md 中的每一帧运行 node <SKILL_DIR>/scripts/build-frame.mjs --frame <N>(根据需要设置并行性)。
这些子代理将使用 frame.md、audio_meta.json 和丰富的视觉描述来生成每帧的 HTML 文件。
关卡: 所有帧 HTML 文件存在于 compositions/frames/ 中;index.html 已生成以编排帧序列并实现过渡。
步骤 6:最终渲染
目标:渲染最终视频,提供预览,并获得用户对该输出版本的批准。
运行 npx hyperframes render 以生成 renders/video.mp4。提供预览并与用户一起检查。
关卡: 用户批准了最终视频输出(渲染通过,预览已获批准)。
维护和更新
要更新此技能,请运行:npx hyperframes skills update faceless-explainer