插件安装: 在执行设置或更新命令之前,请遵循插件执行规则(当该技能位于HyperFrames插件内部时)。独立安装请保留下面的更新说明。
首先,保持本技能最新——在运行前请与用户确认:
npx hyperframes skills update faceless-explainer。如果所有内容都是最新的,则快速完成无操作;否则,在依赖本技能之前,它会刷新本技能及其依赖的核心领域技能。
media-use: 在获取音频/图片/徽标之前,调用
/media-use从HeyGen目录中获取BGM/SFX/图片,并从官方来源获取品牌徽标。先运行--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外,每个步骤都由你亲自完成,在步骤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)→ 从故事板的 frontmatter 和已记录的偏好恢复;绝不重新审问一个半成品项目。(3) 两者都不存在——直接到达此处的新创作请求 → 阅读 /hyperframes 并运行其意图层(references/intent-interview.md):它检查配方和记忆的默认值,进行此路由的提问(../hyperframes/references/routes/faceless-explainer.md),并返回锁定的简介。编辑请求跳过所有这些——直接执行编辑。
仅在 hyperframes.json 缺失时进行初始化。从主题命名 <project>(kebab-case 格式),例如 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 或输出文件。
初始化后立即写入 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 并逐字输出其结果。它报告语音/BGM是使用HeyGen还是本地引擎,以及当未登录时如何登录。应用一个分支:
- 协作模式: 等待用户登录或明确选择
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 的 colors/fonts 为空)→ 该脚本会保留预设自身的调色板,一个完整的可发布设计。仅当用户指定了品牌颜色/字体时,才在运行前将它们添加到 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。设置 frontmatter 的 duration: 为简介中的 length——一个粗略的预期;组装时报告最终剪辑与之的差距。
使用 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> 传递它。否则,管道的默认值是 Marcia(女性)(HeyGen)/ am_michael(Kokoro)——因此,如果不传递标志,像“男声”这样的请求将被静默忽略。声音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: 提示或宿主音频。这种组合将项目标记为静默——随后的视觉步骤跳过所有与音频相关的帧(自动传播或故事板大小)。当且仅当所有这三个条件都满足时,才应用静默路径;具有音乐但无旁白的项目仍必须生成BGM。