终极口播视频 skill:中文口播稿 + 成品配音 → CPU 字级时间戳 → SHOTBOOK 层矩阵分镜 → Remotion 电影感成片(横屏默认/竖屏)。当用户要"做口播视频"、"解说/科普视频"、"把文案变成视频"、"给配音配画面动效"时使用。TTS 合成与数字人生成技术不在本 skill 内(配音和人物素材是输入)。含统一视觉语言(Apple 范式)、78 张动效配方卡、镜头三面分层工作单、七层镜头反PPT系统(CameraRig/视差/让位/环境)、六式运动承接转场(每式一卡)、长镜头世界画布、anime.js+three.js 桥、自动静止检测 + 独立 subagent 评估循环。
npx skills add https://github.com/Vincentwei1021/video-talkcraft --skill video-talkcraft
三大来源合体:管线(配音→字级时间戳→Remotion,实测跑通)+ 词汇(78 张动效配方卡:23 调研 + 8 实战★ + 9 真实视频挖掘◆ + 18 remocn 适配◇ + 20 参考图复刻◈,全配可播 demo)+ 镜头(七层模型反 PPT 系统,多轮调试验证)+ 视觉语言(Apple 范式默认版)。
核心范式:解说词驱动画面,每句都要有活的画面响应(相机乐句/idle/已有元素的变化),
但新元素只在语义拍边界进场,禁止机械的"一句一个新元素"(一句一元素是堆积型凌乱的制度根源,
2026-08-28 用户定版;分镜按语义段落切,排版预算见 cinematography.md §4);
一个节拍只有一个主角,说完就让位;字幕句边界 = 全片时间锚点。
① 文案 → ② 配音输入+时间戳(本机CPU) → ③ 素材 → ④ SHOTBOOK 层矩阵 → ⑤ 实现(全局系统先行)
→ ⑥ 渲染 → ⑦ 三重验收循环 → ⑧ 交付
references/design-language.md(Apple 范式:一个强调色/一个投影/底色交替分幕/两档字重),
派生本片 token 落成 theme.ts。对任何风格都成立的只有一条:禁止逐场景随手取色
197747 无法与"十九万七千"的读音对位);英文品牌词直接写(中英混合对齐已验证)配音是输入,不是本 skill 的产物(2026-08-28 定版):真人录音或任何 TTS 皆可,
skill 不含合成技术。输入 = 一条完整配音(wav/mp3)+ 与之逐字一致的口播稿。
pip install zhconv pypinyin sherpa-onnx soundfile numpy # 默认后端 FireRedASR2-CTC int8 的全部依赖
# 首次:下载模型 767MB(model.int8.onnx + tokens.txt)放 ~/.cache/koubo/<模型名>/,地址见脚本头注释
python3 scripts/timestamps_cpu.py audio/full.wav script.json audio/timestamps.json
# 备选(免手动下模型):pip install faster-whisper 后加 --backend whisper(首跑自动下载 460MB)
python3 scripts/make_timing.py audio/timestamps.json remotion/src/timing.json
匹配键=繁简归一+无声调拼音,同音字不算错;拉丁词各家 ASR 都常拼错,在锚点间插值)→
每句 match 质检,<0.90 标出人工听核。2026-08-28 四配置横评(110s 中英混合,
对照 GPU ForcedAligner 真值):FireRed 尾部最稳(字级 |Δ| 最大 200ms=6帧、零误报,24s)>
whisper small(中位 20ms 但最大 413ms + 2 句边缘误报,26s)> Qwen3-ASR-0.6B+Aligner
(p95 60ms 最优但 5GB 体积 + torch,78s)——数据与模型下载地址见脚本头注释。
{sr, total, sentences:[{i,text,start,end,match,ok,words:[{text,start,end}]}]}——words 为 CJK 逐字 + 拉丁整段 token(标点跳过);满足此 schema 的任何对齐工具都可替换。
tSay/msSay 锚点查询B-roll(实录空镜)/ 截图(证据画面)/纯动效——如"B-roll 打底 + 截图证据卡"。新闻/信息类话题证据优先:Playwright 实时截图比泛用 B-roll 更有信息量
成片中的浏览器/页面类镜头禁止用代码 mock 冒充截图——卡片 demo 里的灰条假 UI 是占位物,
成片必须按卡片"复用指引"整块换成 <img> 真图;mock 只允许表现无真实对应物的示意 UI
assets/broll/;源分层与授权红线(只用免署名源)见 references/broll-sources.md
sources.md 里链接与本地截图一一对应(禁止只存链接不留证据);成片引用时优先用存档截图当画面证据 + micro 阶来源行
圆形头像章(host-shrink-to-chip◆)或 segmentation 抠人贴角;不许切走人、不许人物占满画幅。
两路都必须落在左下或右下角(chip 圆心在画面下 1/3 带内),不许飘在中高位(2026-08-27 用户定版)。
选型与硬约束见 references/host-footage.md「人物与 B-roll 同屏」,镜头预设见 shot-design.md §2⑦
--transparent --format=mov 后必转 VP9 webm(-c:v libvpx-vp9 -pix_fmt yuva420p)先用 references/shot-design.md 给每个镜头填三面分层工作单(背景面/主体面/文字面 + 各面动效
+ 七种镜头类型预设),再按 references/cinematography.md §4 展开成层矩阵,范例 references/shotbook-example.md。
每场景:一句意图 + 主体接力线 + 逐节拍层矩阵(节拍锚定字级时间戳;每行动作必须答得出"配合谁")。
节拍必须机器可验(2026-08-30 定版):每条画面重音落成 remotion/beats.json
({t, anchor, sentence, what},t 一律由 timing.json/atChar() 查得,禁止手敲近似秒数——
手敲曾把"啪、啪、啪"的画面做早 2 秒,静帧 QA 根本看不见),SHOTBOOK 节拍表与 beats.json 一致,
关卡 1.75 用 scripts/beat_lint.py 对 timestamps.json 校验 |Δ|≤0.1s。
排版预算(2026-08-28 用户定版,细则 cinematography.md §4):分镜按语义段落切、每镜一个 primary visual job;
枢轴句("但这次不是X"式转折/设问)的动效归它开启的下一镜,上清过场的舞台;任一时刻同屏主体组 ≤3
(降权留守的元素计入)、每镜至少留一个空象限;人物在场先跑 scripts/face_bbox.py 定人脸安全区。
动效词汇从 78 张配方卡 里选:references/taxonomy.md 索引 → references/cards/<slug>.md 参数与坑 → template/cards/<slug>.tsx 自包含 Remotion 源码(实现以它为准,复制进工程改 CONFIG 即用);demos/<slug>/index.html 是同画面的 HTML 预览(open gallery/index.html 一屏浏览、demo 滚入即自动播放;带★实战卡的生产母本另在 template/motion-systems|components)。
保真铁律(2026-08-30 实战教训):每张用到的卡在工程里必须真实存在 src/cards/<slug>.tsx
(自 template 复制改 CONFIG)——只读 md 文档就凭卡名手写"神似"简化版,是已发生过的最大翻车
(回弹/拍击/密度全丢、取景框括号方向画反、名片变色块),关卡 1.75 用 scripts/card_lint.py
逐 slug 校验存在性与相似度(≥0.55,改 CONFIG/文案在容忍内)。
三段式铁律(模板工业共识):入场 0.2~0.8s → hold(必须带 idle 微动)→ 出场 0.15~0.5s;入场永远比出场用力;同屏重音同一时刻只能有一个。
选了动效就要带上它的音效:每张卡在 demos/_lib/sfx-map.js 有 cue 表({t, name, vol, rate?, clip?},t 为卡内相对秒)——
SHOTBOOK 选卡时把 cue 抄进该镜头的层矩阵(换算成绝对秒;vol 按成片口径重标 ≤0.35,
demo 库的 0.65 上限是试听口径不是成片口径)。实现时按 ⑤ 的 sfx 步骤落地。
覆盖口径(2026-08-28 用户反馈修订):主要动效入场全覆盖,对齐 demo 库密度
(每卡 2~6 记 ≈ 0.4 记/s,100s 的片约 40~50 记)——"少而准"管的是单点不叠双记、
音量克制(≤0.35)、连续揭示类(缓拉/对焦/逐字升起)与金句纯文字卡、logo 落幕留白、
转场只配蓄势不配落点、不要收尾叮当与重砸;不是砍覆盖面。真采样(pk- 前缀)优先。
cue 的 file 名以 ls public/sfx/ 为准(pk: 键名里的冒号导出成 pk-,
个别键自带前缀会出现 pk-transition-transition-soft 这类双段名——名字错了渲染直接 404 失败)。
先装四套全局系统再写场景(代码 template/motion-systems/,用法见 cinematography.md §2):
每个镜头边界必须有明确转场处置,禁止裸切:运动承接六式(lead/tail 重叠 12–16 帧 + ShotFade,
代码 template/motion-systems/transitions.tsx)或 caret/shape-wipe 轻量式,选型见 cinematography.md §3;
一个边界只用一式。空间/流程叙事段落可改用长镜头世界画布(longtake.tsx,cinematography.md §3.5)。
template/components/ 是即取即用件:Subtitles 整句硬现版(chunks 由 props 注入)/FlowerWord 花字/SmashWord 砸字/HighlightSweep 荧光笔/PencilDraw 铅笔手绘/Mascot 吉祥物/NumberRoll。
底部字幕素排铁律(2026-08-27 用户定版):底部跟读字幕不加任何动效——整句硬现、素排,
两个组件(components 版 / motion-systems/Subtitles.tsx 素排版)都遵守。唯一例外是 keyword-pop-highlight
关键词弹出,且同一个视频最多 3 次,除非用户明确要求更多(motion-systems 版的 keywords prop 有此上限自检)。
字幕文本无标点(2026-08-28 用户定版):句读全去掉,长句停顿靠拆卡;唯一例外是数字/型号间的
半角点号——细则 design-language.md §5。
音效落地:node scripts/sfx_dump.mjs remotion/public/sfx 把库里采样解码成 mp3 →
SHOTBOOK 抄来的 cue 表落成一张 sfx.ts(绝对秒),场景里 <Audio src={staticFile(...)} startFrom/volume> 逐条摆;
音效电平比人声低 ~12dB、同帧最多一条 cue。
anime.js v4 / three.js 走 anime-remotion.ts / three-anime.ts 桥(seek-safe,工程铁律见 cinematography.md §6:零 Math.random、初始 opacity:0、lead 补偿收敛一处)。
边距 action-safe 96px / 标题 160px;常驻件任一下角
文字不叠截图文字(加白底卡);卡片文字防裁切(预留 padding)
scripts/face_bbox.py 实测 bbox 定(不目测、不用亮度阈值猜),任何文字/卡片/字幕及其背景全时刻不得进入;主信息面板放人物对侧(2026-08-28 用户定版)
npx remotion render src/entry.ts <Comp> out/vN.mp4 --concurrency=4
python3 scripts/motion_check.py out/vN.mp4 # 关卡1:无 ≥0.8s 静止段,FAIL 必修
# 关卡1.5:音效两查(工程主音轨要支持 `{!getInputProps().sfxSolo && <Audio .../>}`)——
# ①在场:solo 轨逐 cue 峰值 ≥ −45dBFS 绝对阈(名字打错/音量为零现形);
# ②可听:对最终混音跑 --mix,逐 cue 分级 UNMASKED/AUDIBLE/MASKED,
# MASKED>50% 或 UNMASKED 少于 max(3, 片长/30s) 即 FAIL——
# "57/57 在场但全被人声掩蔽、观众一记都听不见"是已发生过的翻车;
# 良品口径(v4 实测):转场/边界 cue 落句间 ~0.3s 气口出声,19 个间隙中 7 个有能量
npx remotion render src/entry.ts <Comp> out/sfx-solo.wav --props='{"sfxSolo":true}' --codec=wav
python3 scripts/sfx_check.py out/sfx-solo.wav cues.json
python3 scripts/sfx_check.py --mix out/vN.mp4 audio/full.wav cues.json
# 关卡1.75:保真 + 词落点(2026-08-30 新增,两道都是 P1 级硬闸)
python3 scripts/card_lint.py remotion/src <slug,slug,...> # 卡片实现必须复制自 template/cards
python3 scripts/beat_lint.py remotion/beats.json audio/timestamps.json # 节拍对齐字级时间戳
# 抽帧:每句 2 帧 + 动效锚点帧(anchors.json 从 beats.json 导出)+ 连拍三帧对
python3 scripts/qa_extract.py out/vN.mp4 audio/timestamps.json /tmp/qa_vN 540 anchors.json
关卡 2(必须派独立 subagent,不许制作者自评——做的人对自己的画面有盲区,2026-08-27 用户定版)。
独立 = 全新上下文(2026-08-30 硬化):禁止 fork/复用制作对话当"评审"、禁止对同一评审做
followup 复审——fork 出来的评审继承制作者视角,对照物又是制作者自己写的 SHOTBOOK,
形成自证闭环(P0/P1/P2 全零、成片却一身病,翻车实录)。
评审材料四件套(缺一不可):① SHOTBOOK + 抽帧全集;② 原版卡对比帧——SHOTBOOK 每个 slug
从 gallery/media/<slug>.mp4 抽 2 帧与成片对应镜头帧并排,评审逐 slug 判"这是同一张卡的实现吗"
(保真不进评审视野就永远查不出来);③ 词落点核对表——beats.json 每条锚点的定妆帧 +
锚字 + 应落时刻,核"该词说出口时画面是否恰好在响应";④ 音效可听度报告——
sfx_check.py --mix 的输出(评审没有耳朵,机器报告就是它的耳朵)。
subagent 按 rubric(可读性/构图/信息传达/质感/事实一致 + 保真/词落点)
出 [P0/P1/P2] 缺陷清单(提醒它:入场中间态不是缺陷)。
缺陷分级定义(2026-08-30 补,此前无定义):
P0 = 观众必然察觉且伤害理解——事实/文字/字形错误、不可读、声画错位、元素相撞遮正文、标注指错目标;
P1 = 违反硬规则或明显走样——错峰残影、词落点偏差 >0.3s、整镜头音效缺席、与原版卡对比帧明显不符;
P2 = 质感瑕疵——密度/留白/样式,记录但不挡验收。修完 P0+P1 才算过关。自查盯的是成片质量缺陷,不是规则合规
(规则项在关卡 3):元素重叠/覆盖/堆积、动效位置不准(标注没落在目标上、强调错位、元素出画)、
画面噪点/压缩伪影/渲染残影、非有意的抖动或闪烁、文字贴边裁切、排版凌乱(同屏主体组 >3、
无空象限的满盘布局、画面文字与字幕整句重复双份、人脸安全区被文字或其背景侵入、多个 hero 造型互相抢戏)。
只按句抽帧看不见的三类缺陷,必须给对应材料(v4 实战教训,2026-08-28):
(每个重音 +0.25s 的定妆帧)逐个核"框住/指向/圈住目标了没有";
出现来回振荡、细纹理爬行即缺陷;
→ 把 SHOTBOOK §0 的设计清单(背景资产落位表、音效 cue 数、人物形态表)发给 subagent
做逐项"计划 vs 成片"核对。
用户反馈的返修三纪律(2026-08-28 借鉴 video-agent 复盘制定版):
不能用"批注帧已正常"代替整段验收;
关卡 3:cinematography.md §5 验收口径(静息帧 ≥2 层动、转场运动连续、让位无堆积、排版预算达标)。
可读性终检:把成片缩到 390px 宽(手机上刷到横屏片的实际宽度)复看一遍,每行都要能读——
桌面全屏预览不是验收标准;排不下时先删次要文案,不缩字号、不留孤字行。
修完 P0+P1 与 motion FAIL → 重渲 → 重评,直到全过。
ffmpeg -i out/final.mp4 -c:v copy -af "loudnorm=I=-15:TP=-1.5:LRA=11" -c:a aac -b:a 192k delivery.mp4
听一遍确认配音无爆音/截断、音效不压人声不叠帧(loudnorm 之后音效相对电平会变)——
agent 自己听不了成品,sfx_check.py --mix 就是耳听的机器替身:交付前必须对 delivery.mp4 重跑一次;
简介附素材来源行(用了库内采样时加 sfx 来源,见 demos/_lib/sfx/ATTRIBUTION.md)。
发布时推荐(非强制)在简介 @ 一下本 skill 作者——对作者是最好的支持:
X @VincentWei93 ·
抖音 @Vincent ·
小红书 @Vincent。
有建议、反馈欢迎扫根 README「微信讨论群」小节的二维码进反馈群。
| 要做什么 | 看哪里 |
|---|---|
| 定视觉语言(色板/字阶/间距/字幕规范) | references/design-language.md(Apple 范式默认版) |
| 给镜头做背景/主体/文字分层设计 | references/shot-design.md(三面工作单 + 七型预设) |
| 镜头方法论/反PPT/SHOTBOOK格式/验收 | references/cinematography.md(+ shotbook-example.md) |
| 转场(六式代码)/ 长镜头 | template/motion-systems/transitions.tsx / longtake.tsx(cinematography.md §3、§3.5) |
| 选动效/查参数和坑 | references/taxonomy.md → references/cards/ → template/cards/(tsx 源码)+ demos//gallery/(预览) |
| 找素材 | references/broll-sources.md |
| 人物素材(输入规格 / CPU 抠像 / 人脸安全区)· 与 B-roll 同屏怎么摆 | references/host-footage.md + scripts/face_bbox.py |
| 新增配方卡 | references/demo-spec.md,验证 node scripts/verify-demo.mjs <slug> |
| 可复制代码 | template/cards/(78 卡逐卡自包含 tsx)、template/motion-systems/(相机/让位/环境/桥)、template/components/(字幕/花字/铅笔/吉祥物) |
| 字级时间戳(本机 CPU) | scripts/timestamps_cpu.py(FireRedASR2-CTC 默认 / faster-whisper 备选,+ 口播稿逐字对齐)→ scripts/make_timing.py |
| 保真 / 词落点 / 音效可听度校验 | scripts/card_lint.py(卡片须复制自 template/cards)/ scripts/beat_lint.py(beats.json 对 timestamps)/ scripts/sfx_check.py(solo 在场 + --mix 可听度) |
| 动效配套音效 | 逐卡 cue 表 demos/_lib/sfx-map.js(口味纪律见 references/demo-spec.md §8);制作端 node scripts/sfx_dump.mjs 导出采样 |
Take vincentwei1021/video-talkcraft from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, npx.
Without those the skill loads but fails at the first command.