Communitygithub.com

解释器剪辑师

将一段竖屏(9:16)人物讲解视频,以 After Effects 动态风格,剪辑为 Pipecorn 解释器语言风格的短剧:演讲者被放在舞台底部圆角框内,舞台上方实时绘制其讲解内容。

解释器剪辑师 是什么?

该技能(explainer-editor)将单段竖屏人物讲解视频,转化为具有动态设计感的解释型短剧。其核心是将演讲者置于画面底部一个暗色舞台上的圆角框中(头部可“浮出”边框),在其上方,随着讲解的进行,以 After Effects 风格的动态画面(摄像头移动、运动模糊、阴影和辉光、光影变化)将内容绘制出来。它严格遵循一套预定义的视觉规则(解释器语言),包括场景切换、图形元素与特定词汇的对应、标题样式(Inter ExtraBold + Instrument Serif Italic)、以及配角元素(如光影、粒子)。该技能作为 short-editor 的子集运行,基于其引擎(布局、舞台、背景等),并提供了从初始化、字幕转录、人像遮罩、故事板编写到最终渲染和验证的完整流程。它特别强调对视频和音频内容“不可见听”,因此所有位置(如头部位置、单词起始点)和音量都必须通过测量得到,并经过 verify.mjs 和 measure.mjs 严格的验证。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ihsaneGTM/gtm-skills/tree/main/plugins/video/skills/explainer-editor

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

explainer-editor: 演讲者上方的舞台解释

用户提供一段自己面对摄像头讲话的竖屏视频素材。本技能将其置于舞台底部一个暗色舞台上的框内,其头部浮出框外,并在他们说话的同时,在其上方绘制他们讲解的内容,具有 After Effects 编辑的动态和光照效果:镜头在场景间移动,物体飞入、上升、弹出时带有运动模糊,每个物体都有其阴影和辉光,大约每秒钟舞台上有新元素出现,每次移动都有音效。演讲者的话语在舞台和演讲者之间逐条显示。每分钟有几次,相机闪光灯会将画面切换至演讲者全屏。

短剧的视觉风格是固定的:§ 解释器语言(见下方流程)。它是通过对用户为客户编辑的一个短剧(108秒,一个关于文本挂钩的指南)逐帧分析而确定的,然后基于第一版编辑的评审意见(2026-10-05:“根本不是 After Effects,不是动态设计,屏幕上东西太少,很无聊,缺少嗖嗖声”)和第二版编辑的评审意见(“好多了;元素背后的小阴影和辉光还不够,全黑的背景没有衬托出它们;这里有一组非常轻的音效包”)进行修订:两条评审意见的每一条现在都成为了规则。每次从新素材开始编辑时,都从这个规范出发(init.sh 会构建脚手架);不要重新打开它。

此技能运行在 short-editor 技能的引擎之上。 其渲染、混音、人像遮罩、预览、构建和验证均由引擎的文件完成,详见 ../short-editor/SKILL.md 的 § 先决条件、§ 文件存放位置 以及 § 4 到 § 6;本文件说明存在差异之处。本技能特有的内容包括:布局(layout.mjs:演讲者框和全屏呼吸区,由引擎的 build.sh 和 preview.mjs 代替其缩放功能运行)、舞台(stage.mjs:摄像机、场景、运动模糊、图形、字幕、运动音效)、背景(bed.mjs)、静态帧(stills.mjs)以及测量(measure.mjs)。在每次剪辑前和每次运行时,请先阅读:

  • ../../references/pitfalls.md 的 § 转录和字幕、§ 工作方法:编辑过程中容易犯的错误(其他章节在需要时阅读:§ 手动测量音效前的音频、§ ffmpeg 和 § 自己执行命令前的 Shell;引擎工具遵循其余规则)
  • ../../references/brand-kit.md,当编辑需要显示它们时:用户的真实标志、截图和数字,绝不能是编造的,并且他们的品牌集在 workspace/brand/ 中只需设置一次(§ 你的品牌,设置一次)
  • $X/example/:参考项目,包含一个已交付编辑的每个文件(stage.theme: "light" 表示其亮色版本);$X/example-2/:在另一个素材上从头运行该技能(两个片段,一个安静的录音,无呼吸区),以及该运行所做的更改

在步骤需要时阅读:../../references/audio-spec.md 关于电平部分(响度标准,电平如何作为听觉测量)。引擎的图形:node plugins/video/skills/short-editor/scripts/api.mjs <module> [figure],绝不使用其源代码。

我无法观看视频或收听音频。 头部在哪里、单词从哪里开始、嗖嗖声听起来有多大声:每一点都需要测量。verify.mjs 在“准备就绪”和“文件损坏”之间把关;measure.mjs 判断音效设计是否被感知到。绝不能跳过它们。

以下所有路径均相对于 GTM by Pipecorn 文件夹的根目录。$X 表示 plugins/video/skills/explainer-editor/scripts(本技能),$E 表示 plugins/video/skills/short-editor/scripts(引擎)。请使用绝对路径运行它们。

先决条件(预检:开始前检查)

引擎所需:ffmpeg + ffprobe 在 PATH 中(brew install ffmpeg)以及 python3(Xcode 命令行工具)是必需的,且无法从此处安装;如果缺少任何一个,请停止并提示相关命令。其他一切自动配置:引擎的 bootstrap.mjs(node 包、语音转文本虚拟环境、音乐库)在 init.sh、transcribe.sh 和 build.sh 内部运行;init.sh 会拉取字体:Inter(ExtraBold, Bold, SemiBold, Medium;SIL 开放字体许可证,通过 jsDelivr 从 npm 包 inter-ui 获取)和 Instrument Serif Italic(Google Fonts, OFL)到项目的 assets/fonts/ 目录。不会进行系统级安装。swiftc 用于构建人像遮罩:没有它,头部将无法浮出框外(框只是简单地裁剪演讲者),并且舞台将绘制在覆盖层上;请说明这一点。

文件存放位置

按照引擎的规定,且仅此方式:每个编辑对应一个工作目录 workspace/projects/<slug>/,slug 不能与任何其他项目重复;成品文件为 workspace/videos/<slug>.mp4;即使是对同一素材,也绝不使用其他项目的文件;临时文件放在项目的 tmp/ 目录中,而不是 /tmp。本技能的 scripts/ 目录保持只读。用户的图片(截图、标志、视频帧)放在项目的 assets/ 目录中。

流程

0. 设置工作目录

$X/init.sh workspace/projects/<slug> <source.mp4> workspace/videos/<slug>.mp4 [--theme light]

引擎的脚手架(从文件读取的 project.json、assets/sfx-top5/ 中的 SFX 包),然后是本技能的 plan.mjs 和 edl.mjs、project.json 中解释器语言的关键字段(style: "explainer"、layout: $X/layout.mjs 的路径、blurBand 0)、基于素材人声设置的 sfxMasterDb(其响度 + 15.3 dB,每低于 -20.5 LUFS 1 dB 再加 0.13 dB:以确保室内音效听起来与基础技能中的一样,无论素材电平如何)、字体、用于较小竖屏素材的 1080x1920 母版(在第二次运行时保留),以及主题(stage.theme:dark,即参考主题,或 light;--theme light 设置它;已设置的项目保留其主题)。从该目录运行后续所有命令。

0.2. 首先询问,一个问题内问完

主题(深色、参考主题或亮色:同一舞台、白色玻璃、深色文字、更柔和的阴影)、音乐(音乐库 plugins/video/assets/music/;默认使用 Convergence;说明非 Mixkit 的曲目可能会影响视频的盈利功能)、节奏(默认 ×1;语速较慢的讲解在 ×1.1 下效果更好),以及用户可以提供的图片:其产品的截图、他们谈论的视频帧、他们的标志、真实数据。用户未提供的图片,使用其文字和室内的象形图绘制,绝不使用编造的截图或数据。从 GTM by Pipecorn 页面运行,第一条消息的概要会回答这一问题(其备注中的主题:“light”表示亮色主题):根据以下规则决定,不要再次询问。

Pipecorn 通用标志:每个风格的 BONUS,每次都会询问,默认关闭 (plugins/video/references/pipecorn-generic.md):在视频最末尾处播放约 6 秒,先是 Pipecorn,然后其值在同一个槽位中逐个替换,然后又是 Pipecorn,无音乐。否 · 是,并指定哪些值(1 到 4;node $E/generic.mjs --list;默认显示手机覆盖范围、连接率、管道)。

让你的声音更好听:一个 BONUS,每次都会询问,默认关闭 (plugins/video/references/voice-clean.md):ElevenLabs 的语音隔离器会去除素材中的房间回声和噪音。否 · 是,让我的声音更好听。这需要 ElevenLabs 连接器:如果没有密钥,请用一行说明其存在(设置 › 连接器 › 添加密钥)并继续。如果是“是”,则在步骤 1 之前:node plugins/video/motion/voice.mjs clean <source>,然后修改 project.json 中的 source 为 <…>-voice.<ext>(长度相同,画面不变)。

1. 逐字转录

$E/transcribe.sh --lang en      # 实际使用的语言;然后设置 project.json 中的 "lang"

words.json,基于原始素材的时间码。绝不能翻译。如果素材中有大量重新开始的内容,则首先使用引擎的 rough-cut.mjs 进行粗剪(short-editor/SKILL.md § 0.7),然后再次转录。接着运行 node $E/words.mjs(引擎的):words-fixed.json,每个单词的开始时间被移出静音区并调整到人声实际开始处,结束时间被调整到暂停前;有疑问的单词会被列出;使用 words.mjs env|end|say 来读取一个单词(short-editor/SKILL.md § 1)。绝不能为此编写自己的脚本。

2. 遮罩和框

node $E/matte.mjs                          # 人像遮罩(需要 swiftc),每分钟素材约需 1 分钟
node $X/layout.mjs --measure --write       # 头部位置 → project.json 中的 stage
node $X/layout.mjs --print                 # 框、字幕、呼吸区

--measure 会找到素材的镜头(源文件中的剪切点,正如 verify.mjs 所做的那样),并在每个镜头中读取遮罩上的头部位置(每个镜头 32 帧):框的宽度使得最长镜头中的头部达到参考大小(226 像素宽;特写镜头会得到更窄的框,居中放置,因此肩膀和胸部会进入画面:在工作示例中为 598 像素,其头部占素材宽度的 38%;第二个素材为 782 像素;--keep-frame 会保留参考的 942 像素并警告框将主要显示面部);在每个镜头中,框的上边缘位于头部通常顶部下方 88 像素处(参考值),因此头部可以浮出;字幕会向上移动与头部通常上升的高度相同的量(最多 90 像素),并保持在其上方 20 像素处;全屏时头部占宽度的 45%。对于包含多个镜头的素材,会生成 stage.shots(每个镜头的裁剪、字幕和全屏构图;摄像机在剪切时切换,但框保持不变)。通过预览(§ 5)检查。在此样式中,源剪切发生在演讲者框内,只占画面的一小部分:verify.mjs 可能会报告它“位于全屏板下方”(第二个素材);检查它是否通过框本身的差异落到其框上,而不是通过肉眼判断。

3. 阅读转录,编写故事板

这是判断步骤,也是全部工作。从头到尾阅读转录文本,并在编写任何代码之前将故事板写成一个列表:包括场景,以及在每个场景中,哪个单词出现时显示什么内容。

  • 场景,通过镜头运动连接。 一个场景是一个概念(承诺、产品、过程、步骤、列表、比较):持续 4 到 8 秒,然后摄像机移动到下一个。默认的移动是横扫(向右平移:旧场景模糊地离开左侧,一道光带穿过,新场景到达);当下一个概念深入时使用上升(旧场景向上离开);当新场景回答旧场景时使用推入(一个“为什么”、一个揭示);只有在呼吸区之后才使用剪辑。尽量不连续使用两次相同的移动。

  • 场景以组合好的形式到达。 在场景自身时间点上放置的元素会随摄像机一起移动(当移动结束时它们已经在那里:参考示例从未显示移动后空荡荡的舞台);稍后出现的元素会在其对应的单词出现时进入。当场景中的事物被一个接一个地提及时,将它们全部放置在场景的时间点上,处于黑暗或失焦状态(dim: 0.6,blur: 10),并在其单词出现时点亮每个元素(.blurTo(on(i), 0).lit(on(i)) 及其音效):舞台从第一帧起就是满的,并且在每个单词上仍然保持运动(第二个素材中的“人物”和“频道”,2026-10-05)。

  • 大约每秒钟有新内容出现。 每个提到事物、数字、步骤、主张的短语,在其单词上都会出现一个图形或一次移动:一个图形进入、一个标签展现、在某物周围画上一个标记、一个物体被点亮、场景移动。如果超过 2 秒舞台没有新内容,就会被视为无聊:这是对第一版编辑的评审意见(2026-10-05)。

  • 标题以两行短文本命名该部分,关键字使用衬线字体(*Killer* Text Hooks),在包含数字或主张的行上使用红色方框(3 Winning Types Of)。它会随着部分的变化而变化,旧标题上升离开,新文字上升进入。

  • 什么图形对应什么内容:

    表达的内容使用的图形
    包含 N 个事物、步骤、规则的列表S.list:条形从左飞入,标签在提及前保持模糊(reveal),正被解释的条形亮起(focus),其判断结果在末尾弹出(glyph: "check", "cross"…);header 可将某个条形变为该部分的标题
    名称、术语、定义S.pill(内部可包含象形图:glyph)、指向所命名对象的 S.arrow、围绕物体的 S.ping(ring: true)、在强调的单词上绘制的 S.mark(圆形、方框、下划线)
    由部分组成的事物、因果关系、链条S.tree(子节点依次落下,通过火花连接)、任意两点之间的 S.wires
    组合、比较S.equation(+、=)、带有 S.shake 和毛刺效果的 VS 标志
    产品、工具、平台用户的标志(S.icon,其辉光,ring 使其看起来像手机在响)、他们的截图放在 S.card 或 S.phone 中、使用时的 S.prompt 输入
    示例、视频、系列他们图片的 S.cards,或素材本身的帧(stills.mjs)配合 player 卡片
    搜索、多个来源、人群带有 glyph 的 S.cards 网格,逐个点亮(扫描效果)
    数字攀升到该数字的 S.count,或彩色文字({g:22 Days} 绿色,{r:A Few Weeks} 红色)
    好/坏、是/否S.glyph(绿色方块上的 check,红色方块上的 cross),条形图上的判断结果
    行动号召标题(Comment "X"、To Get The *Skill*)、用于发送内容的 S.file
  • 呼吸区(FULL):硬切到演讲者全屏(进入时伴随相机闪光灯,离开时伴随嗖嗖声),除了字幕外不画任何东西。用于坦白、妙语、强烈观点;持续 2 到 6 秒;不能在视频开头 15 秒内。非人物头部镜头(B-roll、广角镜头)全屏显示:[from, to, { zoom: 1 }]。呼吸区之后的场景在其后面打开(S.scene(<breather end> - 0.45, "push")),因此在呼吸区结束时场景已经存在。

  • 仅使用真实名称和真实数字(brand-kit.md):如果某个图形需要显示用户未提供的屏幕截图或数字,则使用他们的文字和室内的象形图绘制,或者剪掉。

  • 字幕是逐字的:`fi

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能