graphic-overlays

graphic-overlays

熱門

在完整播放的现有口播 / 访谈 / Podcast 影片上,叠加配合逐字稿时间点的精美动态图卡(GRAPHIC OVERLAY)进行视觉包装 — 包括标题、下三分之一字卡(lower-thirds)、数据突显(data callouts)、引言、侧边栏、子母画面(PiP)等。原影片会全程完整播放;Agent 会在对话中直接设计并撰写每张图卡的 HTML,最后透过 hyperframes 算图汇出为 MP4。当使用者要求添加图卡叠加(graphic overlays)、画面图卡 / lower-thirds / 数据卡片 / 动态标题、或提出「包装/修饰我的影片」、「新增叠加卡片 / 视觉图卡」、或是想对现有影片进行 AI 动态视觉包装时使用。本 Skill 「并非」用于处理一般纯字幕(→ 请用 embedded-captions),也不是从头制作新影片(→ 请用 creation 创作流程);若不确定该用 overlays 还是 captions,请先参阅 /hyperframes。

3.1萬星標
3036分支
更新於 2026/6/25
SKILL.md
唯讀
名稱
graphic-overlays
描述

在完整播放的现有口播 / 访谈 / Podcast 影片上,叠加配合逐字稿时间点的精美动态图卡(GRAPHIC OVERLAY)进行视觉包装 — 包括标题、下三分之一字卡(lower-thirds)、数据突显(data callouts)、引言、侧边栏、子母画面(PiP)等。原影片会全程完整播放;Agent 会在对话中直接设计并撰写每张图卡的 HTML,最后透过 hyperframes 算图汇出为 MP4。当使用者要求添加图卡叠加(graphic overlays)、画面图卡 / lower-thirds / 数据卡片 / 动态标题、或提出「包装/修饰我的影片」、「新增叠加卡片 / 视觉图卡」、或是想对现有影片进行 AI 动态视觉包装时使用。本 Skill 「并非」用于处理一般纯字幕(→ 请用 embedded-captions),也不是从头制作新影片(→ 请用 creation 创作流程);若不确定该用 overlays 还是 captions,请先参阅 /hyperframes。

Graphic Overlays

Graphic Overlays 能够处理一段完整播放的本地影片,并在影片上叠加一系列精心设计且对齐口播内容(逐字稿)的动态图卡(graphic cards) — 包含标题、下三分之一字卡(lower-thirds)、数据突显、引言、侧边栏、子母画面等。Agent 会设计这些图卡(时间点 + 内容)并在对话中直接撰写每张图卡的 HTML,随后将其拼装成单页组合 HTML,并透过 hyperframes 算图汇出为 MP4。这里没有固定的原型列表,也没有预设的卡片结构 — 所有的叠加图卡都是根据逐字稿的实际口播内容即兴设计出来的。

开始制作前,请先确认路线。 本 Skill 旨在为现有口播影片加工,叠加上精美设计的图卡(标题、lower-thirds、数据卡片、引言、侧边栏、子母画面)。如果使用者只是需要一般文字字幕(将口播语音转为可读字幕) → 请改用 /embedded-captions;如果只需要单一简短且无配音的元素(如单颗 Logo 片头 / 下三分之一字幕条) → 请改用 /motion-graphics原始剪辑片段会保持原样播放 — 任何重新对时、调色、重新裁切(reframing)、调整顺序或音讯处理,都属于非线性剪辑(NLE)范畴,超出本 Skill 的处理范围。若是想根据 URL / 主题 / PR 简报从头制作影片 → 请使用 creation 创作流程。若不确定该用 overlays 还是 captions?请先阅读 /hyperframes

embedded-captions 并列的动态包装 Skill。 Captions 是把 口播文字 加上去作为可读字幕;而本 Skill 则是为播放中的影片叠加 设计好的动态图卡。一般纯字幕 → embedded-captions。从零开始制作影片 → 使用 creation 创作流程(如 product-launch-video / faceless-explainer / …)。

工作目录中可供检查的中介档案:

  • metadata.json — 片长 / 宽度 / 高度 / fps
  • audio.mp3 — 提取出来的音讯
  • transcript.json — 扁平的单字阵列 [{ text, start, end }, …](由 Whisper 生成;没有 segments,也没有 words 包裹层)
  • storyboard.json — 轻量级卡片大纲(Agent 的规划蓝图)
  • public/cards/card-XX.html — 每张卡片的 HTML 片段
  • public/index.html — 最终拼装完成的组合页面
  • output.mp4 — 算图完成的影片

CLI 逻辑解析

# hyperframes — 语音转写(本地 Whisper) + 将组装好的 HTML 算图汇出为 MP4
npx hyperframes --help

本 Skill 完全依赖 hyperframes CLI 以及系统环境中的 ffmpeg / ffprobe 执行。
语音转写是通过 hyperframes transcribe 在本地运行 Whisper 达成 — 无须第三方服务、API Key,亦无 API 速率限制(rate limit)。

工作流程

1. 检查环境

npx hyperframes doctor          # ffmpeg, headless browser, render deps
# 确认内建静态资源:
ls "<SKILL_DIR>/assets/fonts" "<SKILL_DIR>/assets/vendor/gsap.min.js"

必要条件:

  • ffmpeg / ffprobe(系统安装)
  • <SKILL_DIR>/assets/fonts/*.woff2, <SKILL_DIR>/assets/vendor/gsap.min.js(本 Skill 内建资源,将于步骤 9 部署至工作目录)

语音转写无须 Key — hyperframes transcribe 会在本地执行 Whisper(步骤 4)。

在 macOS 上强烈建议为 hyperframes render 设定此环境变量:

export PRODUCER_BROWSER_GPU_MODE=hardware

2. 建立工作目录

所有产出物皆存放于 videos/<project-name>/ 下 — 与其他影片工作流程(product-launch-video / faceless-explainer / pr-to-video)保持相同规范。请保持当前的 cwd 在工作区根目录;后续所有指令均写在该子目录下。

VIDEO_PATH="/absolute/path/input.mp4"
WORK_DIR="videos/$(basename "$VIDEO_PATH" | sed 's/\.[^.]*$//')"
mkdir -p "$WORK_DIR"

3. 提取音讯与元资料(Metadata)

# 元资料 — 片长 / 宽度 / 高度 / fps
ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,r_frame_rate \
  -show_entries format=duration -of json "$VIDEO_PATH" > "$WORK_DIR/metadata.json"
# 音讯
ffmpeg -y -i "$VIDEO_PATH" -vn -acodec libmp3lame -q:a 2 "$WORK_DIR/audio.mp3"

输出产物:metadata.json(读取 width/height/duration;fps 为计算后的 r_frame_rate 分数,例如 30000/1001 → 29.97)与 audio.mp3

4. 语音转写(Transcribe)

npx hyperframes transcribe "$WORK_DIR/audio.mp3" -d "$WORK_DIR" --json --model small.en

本地 Whisper — 无须 API key、代理伺服器或速率限制。会在工作目录下写入按单字划分的 transcript.json(包含单字 text 以及 start / end 时间戳记)。
读取此档可获取单字/句子级别的精准时间点,以便在步骤 6 中设定卡片时间;若需要句级片段,可在标点符号或停顿处自行将单字组合成句子。

限制在媒体片长范围内。 Whisper 返回的最后一个单字 end 时间可能会稍微超出实际影片长度 — 请务必将每张卡片的 endSeccomposition.durationSeconds 截断(clamp)至 metadata.json 的片长内,否则汇出算图时末尾会出现黑画面。

5. 修正逐字稿

transcript.json 是一个单字物件的扁平阵列[{ "text": "...", "start": s, "end": s }, …](没有 segments 阵列,也没有 words 包裹层;每个单字的键名为 text)。读取内容并修复明显的 ASR 识别错误:

  • 同音字、产品名称、技术专有名词、标点符号
  • 直接在原位修改单字的 text 内容;务必保留其原本的 start / end 时间戳记
  • 档案中没有预先分好的 segments 阵列 — 当你在规划卡片时间点需要句级片段时,请自行将单字组合成句子(在句号/停顿处切分)

6. 在对话中起草轻量级分镜脚本(Storyboard)

不涉及 CLI 指令。 结合读取 transcript.jsonmetadata.json,在对话中直接设计卡片。storyboard.json 是 Agent 内部规划用的产物 — 没有任何 CLI 指令会直接读取它;它的存在是为了讓你在编写每张卡片的 HTML 之前,能够清晰地构思时间点与内容。请保持其数据结构与下方示例一致,以便在步骤 9 撰写组合页面时使用:

{
  "schemaVersion": 3,
  "composition": {
    "fps": 30,
    "width": 1080,
    "height": 1920,
    "durationSeconds": 121.2,
    "layout": "portrait",
    "themeId": "noir",
    "seed": 42
  },
  "videoTrack": {
    "sourcePath": "input-video.mp4",
    "startSec": 0,
    "endSec": 121.2,
    "bounds": { "x": 0, "y": 0, "width": 1080, "height": 1920 }
  },
  "subtitles": { "enabled": false },
  "cards": [
    {
      "id": "card-01",
      "intent": "Hook with the speaker's anxious midnight question",
      "startSec": 0.5,
      "endSec": 13.0,
      "accentIndex": 0,
      "zone": "fullscreen",
      "contentHints": {
        "kicker": "AN HONEST QUESTION",
        "title": "The soul-searching question at 11 PM",
        "detail": "Client's 60-second voice message: 'If the RMB appreciates, does that mean my USD policy is a terrible loss?'"
      }
    }
  ]
}

卡片必要栏位:

栏位 型别 用途
id string 用在卡片 HTML 与 GSAP 选择器上的稳定 ID
intent string 自然语言描述;提供给卡片合成逻辑
startSec / endSec number 秒数时间点(endSec > startSec)
accentIndex 0 | 1 | 2 | 3 | 4 此卡片使用 5 种主题强调色中的哪一种
zone enum(见下方) 卡片在画布上的显示位置
contentHints object 自由包容物件;Agent 在此放置 kicker/title/detail/data/quote
archetype(可选) string 自由标签,可用来记录卡片模式;省略则预设为自由模式
transition(可选) enum: cut | fade | slide | wipe 声明式的卡片间转场效果

五种 zone 数值:

zone 对应逻辑范围 适用时机
fullscreen 覆盖整个画布 核心高光时刻、大数字、金句总结
whiteboard-area 留出 40px 边距(或直式高度的 45%) 密集数据 / 带有标注的内容
lower-third 底部 30% 区域 在可看清的影片画面上压字标注
side-panel 右侧 42%(横式)或底部 40%(直式) 一侧放置数据,另一侧保留影片
video-overlay 全画布,预期卡片大部分为透明 在全萤幕影片上置入标注叠加层

在步骤 9 拼装组合页面时,请参照上表将每张卡片的 zone 解析为卡片容器(card-host wrapper)上的像素范围。
影片范围在组合设定中仅设定一次videoTrack.bounds);若想让影片看起来在「卡片间移动」,请在组合页面的 <script> 中针对 #video-wrap 撰写 GSAP 补帧动效(tween)(参见步骤 9)。

无预设卡片角色,无预设叙事结构。 卡片的形式完全取决于影片实际口播内容 — 可以全都是引言或全都是数据,可以由数字开场也可以由故事开场。让逐字稿决定节奏。

该提炼多少个重点?— 根据片长 + 密度自动推断。 没有固定的上限。根据影片片长设定基础节奏,再根据资讯密度进行微调。只有下限是固定的:最少 5 张卡片,确保即使是短影片也有视觉节奏感。

步骤 1 — 根据片长决定基础节奏(中等密度下的自然「秒数/卡」):

影片片长 基础节奏(每张卡片秒数) 说明
< 60 秒(Short/Reel 短影音) 6–8 秒 观众期望短影音有更快的节奏切换
60 秒 – 3 分钟 8–12 秒 一般社群影片的常见节奏
3 – 10 分钟 12–20 秒 给予喘息空间;每张卡片承载更多内容
10 – 30 分钟 20–35 秒 长影片演讲 / 访谈的流畅节奏
> 30 分钟 30–60 秒 单元化、接近章节划分的感觉

步骤 2 — 资讯密度乘数(与基础节奏相乘):

逐字稿中的特征信号 乘数 效果
高密度 — 包含大量数字、独立观点、断续节奏、清单列举,每 1–2 句话就是一个新观点 × 0.7 切换更快

<!-- truncated for translation batch; full body continues in source -->