关于 papercut-storyboard
papercut-storyboard 是为 Papercut 视频编写分镜规划的技能,供后续场景制作使用。它为每个场景明确镜头运动、转场、逐帧事件和音效,减少制作阶段的临场猜测。
主要功能
- 01规划逐场景镜头运动与转场
- 02将分镜表扩展为逐帧视觉事件
- 03安排字幕区、背景与场景元素
- 04规划转场和音效
- 05检查证明画面、回扣及节奏规则
适用场景
- 01将脚本整理成可执行的场景分镜
- 02为每个场景指定镜头与切入方式
- 03安排旁白重点词对应的画面事件
- 04在交给 papercut-build 前检查分镜
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ 0xs4n4tg/ papercut-explainer --skill papercut-storyboard安装后在 Claude Code 中输入/papercut-storyboard确认已加载。
详细介绍
Papercut 分镜脚本
分镜脚本是每个场景据以构建的计划。它为每个场景指定镜头运动和转场,避免场景 Agent 自行编造。如果简报写着“CameraPush 或自行设计变换”,每个场景就会变成平淡的推进镜头或手工制作的缩放,而工具包里的镜头运动也会闲置。
预检
- 安装:最简配置就够了。若有库,请查看
library/papercut/CATALOG.md(“paper/camera.tsx”和“paper/transitions.tsx”部分),了解每种运动的属性及适用场景。如果文件缺失或内容过时,请运行python3 $PAPERCUT_LIB/tools/catalog.py。先从环境变量解析$PAPERCUT_LIB,否则读取~/.config/papercut-explainer/config.env中的PAPERCUT_LIB=行,再不行就询问一次。 - 需要
narration/script.json和papercut/STORYBOARD.md,其中包含 HOOK 区块和布景表(每行包括横幅、场景布置、道具、UI 时刻、吉祥物、笑点)。如果缺少,请运行papercut-hook和papercut-script。 - 用于挑选场景布置的背景图表:
library/papercut/public/bg/backdrops/_sheet.jpg。只打开此步骤所需的内容。
1. 全局规则
将以下内容放在 STORYBOARD.md 顶部的 HOOK 区块下方。按角色设定调色板(每个场景轮换背景色):../papercut-explainer/references/style-guide.md 第 5 节。字体:第 6 节。画布和区域:第 4 节。适合用一个延展隐喻呈现的功能解锁,可以参考第 12 节。
- 1080x1920,30 fps。横幅占画面高度的 14-21%,字幕带占 68-80%(按场景调整,避开人物面部),底部 20% 保持空白。
- 光线从左上方照入。仅角色、字幕和信号使用高饱和度。
2. 镜头 / 转场表
在场景区块之前,每个场景一行。每行都要指定工具包 paper/camera.tsx 中的一个组件,以及切入该场景时使用的 CutSeries 类型(来自 paper/transitions.tsx)。
| 场景 | 镜头(paper/camera.tsx) | 切入转场(CutSeries 类型) |
|---|---|---|
| S01Hook | OrbitCamera + Depth,对“”使用 SnapZoom | none |
| S04Name | Crane 升至 | tearAway |
| S09Peak | CrabTrack 沿着 移动 | whip |
| S10CTA | RackFocus 从 转到手机 | tapePull |
- 镜头选项:
OrbitCamera+Depth、SnapZoom、Crane、CrabTrack、DollyZoom、RackFocus、ForegroundPass、DutchTilt、FocusPulse、FreezeFrame、PullBack、PovMask、TimeRamp、TiltShift、FocusHunt、Handheld和CameraPush(来自paper/kit.tsx)。目录中的paper/camera.tsx部分会说明每种镜头的适用场景。 - 转场选项:
hard、whip、zoomThrough、pageTurn、tearAway、tapePull、stampCut、infiniteZoom、popUpBook、keyhole、burnAway。 - 普通的
CameraPush最多用于三分之一的场景。 - 将每行的镜头复制到对应场景区块的标题中。转场列填入
episode.json,格式为"cuts": {"S04Name": {"kind": "tearAway"}}(未填写表示硬切),由papercut-build自动补全。
3. 场景区块
每个场景一个区块,时长 1.5-5 秒,按句子边界剪切:
## S03: <beat> (5.6-8.2 s, 78 f) BANNER: <TAKEAWAY IN CAPS>
Location/bg: <world location + bg colour> Camera: <camera.tsx component + params, from the table> Cut in: <kind>
Cast: <who, accessories> Caption band: y=0.76
| VO word (stressed) | frame | event | motion spec |
| "<word>" | +6 | <prop enters / state flips / acts> | <spring/slide/swap + frames> |
Ambient: <LED blink, idle bob, stars, screen waveform>
Boil: banner + labels, +-1.5 px every 2 frames
SFX: <pop, chime, click...>
- 将布景表的每一行扩展成逐帧事件:每个重读词一个事件(每 0.4-0.8 秒),环境动作始终保持。帧的偏移量以词为基准,之后通过
cueOf(ID)(word, n)读取。 - 产品 UI 应粗略重建在纸质显示器或笔记本电脑上,并加入虚构交互(光标点击、打字、进度、波形、列表滚动)。
- **佐证:**每条短片使用一次源页面的真实截图(通过
library/tools/capture.mjs进行浏览器截图,而非重新绘制),将其贴在纸卡上,再用红色记号笔画圈,圈线自行绘制并标出关键行。其他内容均保持粗略剪纸风格的重建。 - CTA 之前回访一次较早出现的场景布置。
4. 摄影机与转场规则
- 每个场景都要有一个镜头运动。缓慢推进是基准。布光场景可加入视差环绕以增强纵深;在数字和笑点处,对重读词快速推近或急速变焦;加入前景掠过(模糊的纸质物体掠过镜头)或焦点转换;拉远以展现规模;在受挫吉祥物的桥段定格画面并加上标签。
- 横幅变化时主要使用硬切。在 2-3 个主题切换处使用带运动模糊的甩镜;在进入屏幕、门或镜子「内部」时使用穿越式变焦;每条视频最多使用一次翻页或撕纸(用于揭晓或前后对比);最后用胶带拉出转入 CTA(使用普通牛皮纸胶带,可选添加
label以印上文字)。 - 从开场钩子切出时,要延续其中的运动。对 S01 和 S02 应用
papercut-hook的规则。 - 转场持续 6-12 帧,每个转场都要配上相应的音效(甩镜、变焦、翻页、撕纸、撕胶带)。
- 在项目库中,使用套件的转场序列串接场景,这样每个场景都会从其
plan.json指定的帧开始,确保语音保持同步。
5. 音效计划
- 空气音效(呼啸、滑动、甩镜、变焦)合计每 2.5 s 视频时长最多使用一次。
cues.py会在超出时打印提示。以此为准,33 s 内使用 12 次没问题,26 s 内使用 24 次则会让人分心。 - 入场时加入接触音效(弹出、砰击、盖章),或保持静音。在渲染音频前,先在
tools/cues.json中统计。 - 在每个区块的
SFX:行中填写library/audio/CATALOG.md里的音效名称。场景 Agent 将实际条目写入tools/cue_sheet.d/<Scene>.json。 - 选择床音预设(
episode.json中的"bed"),并设置cutSfx以匹配切换类型:tearAway对应撕纸,tapePull对应撕胶带。
检查清单
-
每个场景都有摄影机运动和切入方式,且普通的
CameraPush至多用于三分之一的场景。 -
每个重读词都有对应事件;已列出环境运动。
-
有一个佐证桥段、一个回环呼应,以及拉胶带或甩镜转入 CTA。
-
翻页或撕纸最多一次;空气音效不超预算。
-
在每个场景区块的事件表中注明预备动作和唯一的夸张桥段。12 条原则及其对应的套件组件见
../papercut-explainer/references/motion-principles.md。
交接
接下来是 papercut-build,它会搭建项目,并将摄影机/切换表和场景边界转换为 episode.json。它会读取 STORYBOARD.md 和 narration/script.json。STORYBOARD.md 的 Timing 部分将在之后、语音完成后生成,因此请不要填写。