关于 talking-head-b-roll
用于将完成录制的访谈视频制作成带定时叠加图形和全屏 B-roll 的影片工作流技能。它指导视频编辑者完成转录、画面规划、渲染和交付,同时保留原始语音与画面。
主要功能
- 01转录语音并生成逐词时间
- 02规划人物、叠加与遮盖片段
- 03让画面与口播词语同步
- 04渲染影片和透明图层
- 05检查版式与场景节奏
适用场景
- 01为已完成的录制添加说明图形
- 02保留原始音频并制作 B-roll
- 03为视频编辑者交付可编辑叠加层
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ iart-ai/ b-roll-skills --skill talking-head-b-roll安装后在 Claude Code 中输入/talking-head-b-roll确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/compare-timing.pyrender.mjstiming.test.mjstranscribe.mjstemplates/b-roll.html详细介绍
脱口秀画面素材
用户的录制效果已经很好:台词和表达方式都已定稿。只看一个人对着镜头说话会很乏味,因此影片要做的是,为每一段讲话决定画面显示什么。声音始终不停;只有画面在变化。
录制内容不会被剪切、移动、裁切或缩放。你制作的所有内容都是绘制在录制画面上方的图层:在应显示说话者的地方保持透明,在图形遮住说话者的地方保持不透明。scripts/render.mjs 会将该图层叠加到录制画面上,并保留原声。
一次完成:不要询问录制内容或合理默认值已经能回答的问题,交付时列出你的选择。在存放录制文件的文件夹中工作,并从那里运行脚本;输出文件也会保存到那里。下文中的 <skill> 指此技能所在的文件夹(即存放本文件的文件夹)。
1. 转录
node <skill>/scripts/transcribe.mjs talk.mp4 # → transcript.json, and prints every line with its start and end
它会输出视频的尺寸、帧率和时长(这些信息会写入页面),以及按句末拆分的转录文本,并将每个词的时间戳写入 transcript.json。在决定任何内容之前,先通读整份转录。若已安装 whisper.cpp,它会使用本地版本;否则会使用 ELEVENLABS_API_KEY;两者都没有时,它会说明如何进行设置。停顿时长来自音频本身,因此句子之间的间隔就是说话者实际停下来的地方;句子内部的时间戳误差在几十分之一秒以内。转录可能会听错数字:如果某个数字与其余内容不符,就不要把它放在画面上,并在交付时说明。
2. 规划:三种处理方式
A. 说话者。 只显示视频,不叠加任何内容。适用于重点在人物本身的地方:开场白、个人观点或故事、情绪起伏、行动号召、结束语。
B. 叠加层。 视频保持可见;在上方叠加透明的动态画面:关键词或短语、递增的数字、图标、箭头、徽标,或逐项显示的简短列表。适用于某句内容中有一个值得展示的具体事物,同时说话者也值得观看的情况。叠加内容尽量放在边缘及上三分之一或下三分之一处,以免遮住说话者的脸。画面中一次只呈现一个概念;句意转变时,该内容也随之消失。
C. 遮盖。 不透明的全屏动态场景遮住说话者,但保留其声音。适用于与其看着一张脸说,不如直接展示画面的内容:数字和比较、流程或步骤、工作原理、产品或界面,以及包含三个或更多部分的内容。动态画面应解释这句话,而不是单纯装饰。
在句子或分句结束处拆分转录内容。为每一行指定 A、B 或 C,并用一句话说明理由,同时说明 B 或 C 要展示什么。然后检查节奏:
- 以 A 开场,让观众先认识说话者;以 A 收尾。
- A 连续出现的时长不要超过约 8 秒;用 B 或 C 打断。
- C 连续出现约 3–8 秒;两段 C 之间回到说话者画面,避免影片变成配旁白的幻灯片。
- 在每行边界处安排处理方式的切换,并在其对应词语出现时展示叠加内容;根据下方的时间规则决定各元素的先后顺序或同步方式。
- 优先采用较少且更清晰的处理方式,而不是每行都切换一次。
视觉时机:逐拍决定
为每个有意义的元素选择时机,而不是为整个 B-roll 图层一次性选择。在计划中记录它对应的口播词语或短语、时间戳、时机选择和简短理由:
| 时机 | 适用场景 | 时钟 |
|---|---|---|
| 提前约六帧 | 让观众视线有所准备的内容:坐标轴、卡片、物体、流程结构 | s.now |
| 与相关词语同步 | 新的关键信息:金额、百分比、价格、排名、最终图表数值 | s.audioNow |
| 等待揭晓 | 笑点、否定、暂不揭晓的答案和结论 | s.audioNow,在揭晓词语或短语处触发 |
对于“收入增长了 30%”,应提前呈现图表结构,然后在说到“30%”时,让 30% 清晰可读,并让最终柱状图数值同时呈现。同步意味着信息已清晰可读或稳定呈现,而不只是较长的淡入或计数动画刚刚开始。准备性的动画可以提前开始,但不得提前揭晓答案。先前提到的数值可以作为背景信息继续显示。
SCENES.from/to 和词语锚点使用原始转录中的秒数。模板会将结构时钟提前 VISUAL_LEAD_FRAMES / FPS(默认提前六帧:25 fps 时为 240 毫秒,30 fps 时为 200 毫秒)。s.now、t、s.in 和 s.out 使用该时钟;s.audioNow 仍是实际播放时间。使用 s.audioNow >= wordStart 触发每项同步信息。不要同时移动锚点,也不要在编辑器中对完成的图层重新定时。对于要求精确同步的情况,使用 VISUAL_LEAD_FRAMES = 0;在混合场景中,事实信息和暂不揭晓的内容应继续使用音频时钟。
保持录制内容、音频、字幕和影片时长不变。检查场景出口时间偏移后是否会遮挡同步揭晓内容,或缩短其清晰可读的停留时间;必要时延长或重新规划该场景及相邻场景。开场和结尾保留仅有说话者的画面。围绕锚点试听:估算的词语时间不保证精确到帧。这是根据我们的样例审查得出的编辑默认方案,并非普遍适用的感知规则。
为便于比较,固定视觉内容并带声音审看。scripts/compare-timing.py 只用于较早的整层偏移实验:输入零提前量的基准 Alpha 图层,不要输入选择性定时或已经提前的图层。它无法验证这些逐元素的时机选择。
本方案不包含完整的烧录字幕:只有用户提出要求时才添加。B 叠加层中的文字应是几个关键词,而不是正在说的整句话。
屏幕文字应使用说话者实际说出的词语,或来自转录内容或用户材料中的数字和名称。不要编造数据、主张或引语。
3. 构建页面
将 <skill>/templates/b-roll.html 复制到录制文件所在目录,并命名为 page.html,然后设置:
VIDEO、W×H(视频的画面比例:1920 × 1080;竖屏则为 1080 × 1920;4K 文件可以沿用 1920 × 1080 页面)、FPS、DURATION,取自transcribe.mjs输出的内容。FACE:说话者头部所在位置(包括头发,并在周围留出一些空间),用画面比例表示。node <skill>/scripts/render.mjs page.html face --stills 2s,20s --face会显示带框的录制画面;调整参数,直到所有静帧中的头部都能被框住。SCENES:每段 B 或 C 片段各设一项,格式为{ from, to, kind: 'overlay' | 'cover', draw },时间取自transcript.json中的单词时间戳。场景之外的内容都属于 A。两个场景可以首尾相接(前一个的to就是下一个的from);说话者短暂露出会像闪烁一样。- 每个场景编写一个
draw(t, s),内容要配合该句所说的内容。模板中的两个示例(关键词卡片和同步显示的数字)展示的是结构,而非视觉风格。s.in和s.out分别表示入场和退场;s.now是前进中的结构时钟;对于同步事实和延后揭示的内容,使用s.audioNow和原始单词锚点。
界面默认采用浅色。只有在以下情况才使用深色:(a)用户或品牌明确要求;或(b)主题本身就适合深色背景(终端/代码、夜空、影院)。黑底霓虹是所有 AI 视频的陈词滥调式默认风格;未经要求就采用这种风格,是设计失误。
字体:每个字体系列使用一个 Google Fonts <link>,其中包含所用字重;绘制时使用的每种字体都必须列在 FONTS 中,这样渲染时就不会回退到其他字体(渲染需要网络才能加载字体)。
4. 检查
node <skill>/scripts/render.mjs page.html --check # the plan against the transcript and the pixels
node <skill>/scripts/render.mjs page.html film.jpg --sheet 1 # the whole film, one frame a second, over the recording
node <skill>/scripts/render.mjs page.html shot --stills 12s,20s # full frames, to read text and spacing
--check 必须通过:每个遮罩在入场后都要完全遮住说话者;叠加元素不得侵入 FACE;每个原始语音锚点都必须落在单词之间(显示的图形可以提前出现);场景之外不得绘制任何内容;文本不得溢出画面,也不得与其他文本重叠。如果文本距离画面边缘不足 3%,程序会发出警告,因为部分播放器会裁切边缘内容。它还会输出时间线,列出每段所说的内容,并提示节奏问题(长时间只有说话者出镜、遮罩少于 3 秒或超过 8 秒、遮罩连续出现、片头或片尾没有以说话者出镜结束或开场);如果有合理原因,警告可以保留,但要说明原因。
它无法判断图形是否表达了对应语句的内容、文本是否清晰易读,或文本是否溢出卡片、跨越图表线条:查看整页来检查流程,并查看每个场景的静帧来检查文本。修正后再次检查,直到效果达标。
5. 渲染并交付
node <skill>/scripts/render.mjs page.html film.mp4 # the finished film: the recording, the b-roll over it, the original sound
node <skill>/scripts/render.mjs page.html b-roll.mov # the b-roll alone with alpha: ProRes 4444 for Premiere Pro, Resolve, Final Cut
node <skill>/scripts/render.mjs page.html b-roll.webm # the same as VP9 with alpha: small, for browsers and OBS
交付 film.mp4、页面(在浏览器中打开,即可播放带声音的影片并拖动浏览各个场景),以及一份简短的方案表:时间、所说内容、处理方式、屏幕显示内容。如果用户要在 Premiere Pro、DaVinci Resolve 或 Final Cut 中编辑,也要提供 Alpha 图层(.mov;ProRes 文件较大,1080p 下约为每秒 5 MB):将它放在录制素材上方的轨道中,并从 0 开始。说明你做了哪些用户未要求的选择。
要求:Node 18+、在工作目录或其上级目录(也可以在 skill 自身目录或其上级目录)中运行 npm i playwright-core、ffmpeg、Chrome(或运行 npx playwright install chromium),以及 whisper.cpp 或用于生成转录文本的 ElevenLabs 密钥。