首先,保持技能最新——静默运行,无需询问:
npx hyperframes skills update faceless-explainer。当一切为最新时快速无操作;否则会在你依赖之前刷新本技能及其依赖的核心领域技能。
media-use:在获取音频/图片/标志前,需调用
/media-use从HeyGen目录解析背景音乐/音效/图片,以及从官方渠道获取品牌标志。先运行--adopt注册现有资产。参阅/media-use技能。
无面解说至HyperFrames
使用本技能将一段文本转化为解说视频:选择一个设计系统,规划教学故事,并在HyperFrames中逐帧构建。无面意味着所有视觉元素均在下游生成——没有捕获步骤,也没有真实资产清单。
入口是
/hyperframes。 你是编排者。按步骤运行,验证每个关卡,然后继续。本技能用于从文本解释主题,没有产品和网站需要捕获。任何其他意图、简单的“制作视频”或不确定情况 → 先阅读/hyperframes——意图层掌控所有路线决策,尚未携带BRIEF.md的新建请求无论如何都会先经过它(设置的开篇规则)。
你是编排者。在 videos/<project>/ 中工作。按顺序运行步骤,并在继续前通过每个关卡。用户关卡是步骤0、步骤3和步骤6。在执行步骤0前,请阅读 ../hyperframes-core/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)→ 从故事板的frontmatter和记录的偏好中恢复;绝不重新审查半成品项目。(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 或输出文件。
初始化后立即写入 BRIEF.md(之前绝不——init 拒绝非空目录):意图层锁定的摘要,格式按 ../hyperframes-core/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 § Providers。
关卡: 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(没有网址)。不要创建 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-core/references/storyboard-format.md 和 ../hyperframes-core/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-core/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音乐库中查找背景音乐以及时间元数据。背景音乐情绪来自故事板的 music: 字段。这使用HeyGen音频API进行检索(而非生成),并使用与语音合成相同的 ~/.heygen 凭证。有关提供商详情,请阅读 ../media-use/audio/references/tts.md。
如果没有旁白且没有 SCRIPT.md,则跳过语音生成。如果故事板有音乐情绪,背景音乐仍可能运行。
通用的完全静音标记(在重用此音频模型的工作流间共享):STORYBOARD.md 顶部YAML块中的 music: none 以及没有 SCRIPT.md。该组合标记项目为静音——无旁白、无背景音乐、无音效。audio.mjs 识别它并生成任何内容(它删除任何旧的 audio_meta.json;不存在的 audio_meta.json 正是组装视为静音的条件),因此此步骤是干净的跳过。music: none 带旁白则保持语音合成,仅关闭背景音乐。使用此确切拼写——不要即兴使用其他标记。
关卡: 音频任务已开始,或项目标记为静音(music: none + 没有 SCRIPT.md)。
步骤4:帧视觉设计
目标:为每个故事板帧添加视觉方向、布局意图和运动选择。
首先勾画看板(仅协作模式)。 计划一经批准,立即运行草图阶段—— ../hyperframes-core/references/review-loop.md § 2(无需等待步骤3.1;草图不使用时间线):以线框图形式呈现每个帧的视觉布局、运动和字体排列,使用轻量级格式(例如每个帧的可视化描述或ASCII布局),并收集反馈。批准后,将视觉方向写入 STORYBOARD.md 的每个帧条目中(例如 visual_style, layout, animation 等字段)。
在自主模式下,直接为每个帧生成视觉描述,无需用户审批。
关卡: STORYBOARD.md 中的每个帧都包含视觉设计字段,并且(在协作模式下)用户已批准视觉设计。
步骤5:帧构建
目标:为每个帧生成独立的HTML文件,并创建主 index.html。
每个帧由子代理处理。为每帧运行 node <SKILL_DIR>/scripts/frame-worker.mjs --frame <frame-index> --hyperframes .。子代理使用 frame.md、STORYBOARD.md 中的视觉设计以及 ../hyperframes-animation/ 规则生成 compositions/frames/NN-<slug>.html。
所有帧完成后,运行 node <SKILL_DIR>/scripts/assemble.mjs --hyperframes . 以创建 index.html,它按顺序嵌入所有帧,处理导航和动画调度。
关卡: compositions/frames/ 中存在HTML文件,并且 index.html 已构建。
步骤6:最终渲染
目标:将帧序列渲染为视频文件。
运行 npx hyperframes render --hyperframes . --out renders/video.mp4。在协作模式下,先提供一个预览(例如打开 index.html 或提供视频片段)供用户批准。在自主模式下,直接渲染并通知用户。
关卡: renders/video.mp4 存在,用户已批准最终输出(协作模式),或渲染成功(自主模式)。
故障及编辑
如果在任何步骤中出错: 阅读错误输出,识别问题,修复它(例如重新运行失败的组件、编辑 STORYBOARD.md 或 frame.md),然后从故障步骤继续,必要时重新运行检查。如果用户请求对输出进行更改,则以编辑模式启动:识别需要更改的步骤(例如步骤3为故事板更改,步骤4为视觉更改,步骤5为帧重建),并仅执行必要的步骤。
对于编辑请求: 不运行步骤0-2。直接跳到相关步骤。如果改变脚本,回到步骤3.1进行音频生成。