首页 / 全部技能 / 内容创作 / caption-animation
内容创作 · iart-ai/tiktok-video-skills

caption-animation

This skill should be used when the user asks to "add animated captions", "make TikTok captions", "karaoke captions", "word-by-word subtitles", "auto subtitles", "highlight the active word", "burn in captions to a video", "sync captions to a voiceover/narration", or "turn an SRT/transcript into animated text". Covers word-level timing from Whisper, per-word pop/scale-in, active-word highlight, 9:16 safe-area placement, readable type, and burn-in vs sidecar SRT/VTT.

风险提醒:蓝色 · 知晓即可AI 侦查报告
作者 iart-aiGitHub iart-ai/tiktok-video-skills ↗Stars 11许可 MIT(仓库根 LICENSE 为 "MIT License / Copyright (c) 2026 iart.ai";GitHub API spdx_id = MIT;.claude-plugin/plugin.json 亦声明 "license": "MIT")commit 2a775336b5
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

把「词级时间戳」写成不可谈判规则,并直接否掉最常见的偷懒做法(把句子均分到时长)。

skills/caption-animation/SKILL.md
1. **Word-level timing, not line-level.** Karaoke reads as magic only when each word lands on the syllable. Always transcribe to word timestamps; never fake them by splitting a line evenly over its duration — drift is instantly visible.
注:这里在做什么:这条纪律决定了整条管线必须拿到 per-word 时间戳,而不是 SRT 的句子级 cue。后续所有组件都消费同一个扁平 token 形状,因此「卡点」在架构上是默认结果而非事后调参。

管线被钉成六段表格(转写→归一化→分页→动画→放置→导出),每段指定具体工具,避免 agent 自由发挥。

skills/caption-animation/SKILL.md
| Transcribe | Audio → word-level timestamps | Whisper (`@remotion/install-whisper-cpp`), AssemblyAI |
注:这里在做什么:表格是「实现原理」的主体——能力不是靠模型即兴写代码,而是靠把每一步收敛到确定的库函数(Remotion 的 captions 工具链 + whisper.cpp)。

全流程只有一个数据形状:`{text, startMs, endMs}`,一切来源(Whisper / SRT / 云 API)都归一到它。

skills/caption-animation/SKILL.md
type Token = { text: string; startMs: number; endMs: number };
注:这里在做什么:数据形状即接口。归一到 token 后,下游「高亮哪个词」只是一次区间包含判断,渲染器不需要知道词从哪来。

每个词的 pop 动画锚定它自己的 startMs,用 Remotion spring 的过冲做出「活着」的手感。

skills/caption-animation/SKILL.md
const enter = (token.startMs / 1000) * fps; // word's own entrance frame
注:这里在做什么:入场帧不是全局进度,而是逐词计算(frame - enter)。这是词级同步能成立的技术原因。

分页规则:一次 1–4 词,用 combineTokensWithinMilliseconds 在两档手感之间切换。

skills/caption-animation/SKILL.md
and tune `combineTokensWithinMilliseconds`: ~200–500ms for true word-by-word, ~1000–1500ms for short readable phrases.
注:这里在做什么:把「节奏」参数化成单个数值,同一组件既能做原生逐词,也能做短句成组。

可读性与安全区被写成硬数字表(字号 56–80px、描边、居中带 62–70%、避开底部 ~280px),而不是形容词。

skills/caption-animation/SKILL.md
| Size | 56–80px (≈8% of frame height), min 45px | Legible muted on a phone |
注:这里在做什么:竖屏 9:16(1080×1920)的约束被量化,agent 不必凭感觉放字幕;reference 里还有逐平台的安全区表。

交付纪律:烧录字幕给社交平台,同时从同一批 token 导出 SRT/VTT 以满足可访问性。

skills/caption-animation/SKILL.md
Emit both: burn the animated captions for social, and write a plain SRT/VTT from the same tokens for accessible/SEO playback.
注:这里在做什么:把「社交可用」与「无障碍合规」拆成两个产物,且共用一份时间码,避免二次对齐。

验证回路(deliver-and-verify)不是跑测试,而是「先出静帧人工读图、再编码」:帧级检查项写明「第 90 帧高亮的词必须是被 [startMs,endMs] 覆盖的那个」。

skills/caption-animation/SKILL.md
the word highlighted at frame 90 is the word whose [startMs,endMs] contains 90/fps (no drift)
注:这里在做什么:把「漂移」这种肉眼难判的缺陷转成可判定的单点断言(frame/fps 落进 token 区间),代价只有三张 PNG。

reference 把端到端可运行代码补齐(Whisper 安装、SRT 解析、分页、SRT/VTT 导出、平台安全区、字号规格)。

skills/caption-animation/references/word-timed-captions.md
# Word-Timed Captions — End-to-End Build
注:这里在做什么:SKILL.md 给纪律与骨架,reference 给可直接粘贴的实现;两层分工是该 pack 的统一模式。

转写侧给出离线与云端两条路(云端仅在 reference 里作为一行替代方案出现)。

skills/caption-animation/references/word-timed-captions.md
npx @remotion/install-whisper-cpp # one-time: installs whisper.cpp + a model
注:这里在做什么:默认路径是本地 whisper.cpp(含模型下载),云端 API 只是可选替代——这决定了本 skill 的安全档位仍是本地工具型。

2核心能力

01词级时间轴构建:Whisper(本地 whisper.cpp)或云 API 转写 → 统一 token 数组,SRT 解析器把 cue 转成 ms
02逐词弹入(span + spring)与 active-word 高亮(单一 accent 色或填充块)
03分页(1–4 词/页)与节奏调参,避免整屏文字墙
04纯 Web/CSS 路径(给 DOM 播放器):每词一个 animation-delay = startMs
05可读字型规格与 9:16 安全区:粗黑无衬线、56–80px、2–6px 描边 + 阴影、居中带、避免底部 UI 带
06音频与字幕共用同一时间基准(VO 重录即重转写,禁止手移偏移)
07烧录 MP4 + sidecar SRT/VTT 双产物;GIF 仅作 README 证明片段
08交付-验证回路:stills(真实 shipped props)→ 读图 → 编码;用 `npx remotion compositions` 取 durationInFrames/fps

3外部依赖

类型依赖
clinpx remotion still / render / compositions
package@remotion/captions(createTikTokStyleCaptions / Caption 类型)
clinpx @remotion/install-whisper-cpp(一次性装 whisper.cpp + 模型)
apiAssemblyAI / Deepgram / OpenAI Whisper API(可选云转写替代,非默认路径)
cliscripts/contact-sheet.sh + scripts/probe-mp4.sh(仓库根共享验证工具箱)
packageffmpeg / ffprobe(系统依赖)

4风险提醒 风险提醒:蓝色 · 知晓即可

风险提醒:蓝色 · 知晓即可
  • 云转写替代路径会让音频素材出网(触发条件式橙档) — reference §2 把 AssemblyAI / Deepgram / OpenAI Whisper API 列为替代方案:一旦选用,用户音频被送往第三方且需自备 API key。默认路径(本地 whisper.cpp)不触发,但若环境无本地模型又赶时间,agent 可能自发选择云路径——建议在提示中固定「只用本地 Whisper」。
  • 首次安装会拉远程包与模型 — `npx @remotion/install-whisper-cpp` 一次性下载 whisper.cpp 与模型文件(体积不小),`npx remotion` 亦从 npm 取包;离线或受限网络环境下这一步会失败,且版本未 pin 在仓库内。
  • 转写质量决定成败,但 skill 无法保证输入音频质量 — SKILL.md 自称「Karaoke reads as magic only when each word lands on the syllable」,而 reference 的 tip 也承认「Background music wrecks word boundaries」;带 BGM 的素材需要用户先分轨/降噪,skill 无此能力。
  • 跨包协作依赖:读者若只安装本 skill 目录而漏掉仓库根 scripts/,contact-sheet/probe-mp4 的引用会悬空 — SKILL.md 以相对路径 `scripts/contact-sheet.sh` 调用仓库根脚本;单目录安装(只拷贝 skills/caption-animation)会得到不存在的路径。安装方式需包含整个 repo。
  • 性能与精度声明无据 — 「medium.en ≈ 2x faster than large」等为文档声明,仓库内无基准数据(见 second_pass 的 unlocatable 条)。
风险提醒:蓝色,知晓即可。三段自证:① 判级对象=本 skill 目录(skills/caption-animation/ 内 find 确认只有 SKILL.md、references/word-timed-captions.md、README.md 三个 .md,零非 .md 文件、零可执行脚本);② 目录内自身行为=本地写入(Remotion 工程、out/*.mp4、out/*.gif、out/f-*.png、sidecar .srt/.vtt)+本地 CLI(`npx remotion still/render/compositions`;ffmpeg/ffprobe 经仓库根 scripts/contact-sheet.sh、probe-mp4.sh),skills/ 全域 `process.env` / `API_KEY` / `token` / `cookie` / `https?://` 运行时端点 **0 命中**(唯一外链是 reference 末尾的 iart.ai UTM 营销链接);③ 唯一网络面是 npm 官方渠道取包(remotion / @remotion/*)与一次性的 `npx @remotion/install-whisper-cpp` 拉 whisper.cpp 及模型,与站内蓝档先例(hyperframes、general-video:npx 经 npm 官方渠道拉包不单独抬档;motion-background:同一套 scripts/ 判蓝)同口径。不升黄:无「固定公开端点查询」类行为,也无抓取。不升橙:无凭据/环境变量读取,默认路径(本地 whisper.cpp)素材不出网——但 reference §2 的云转写替代一旦被选用即属橙档触发条件(素材出网 + 用户自备 key),按批4 细则2「仅出现在可选的替代方案里 → 不判级」维持蓝档,并写进 verdict.risks。非红档:无 TLS 降级、无沙箱关闭、无反自动化绕过、无任意代码执行面。

5第二遍独立确认

  • [ok] skill 目录内是否真的没有可执行代码(档位判定的关键证据) — `find iart-tiktok-video-skills/skills/caption-animation -type f` 只列出 SKILL.md / references/word-timed-captions.md / README.md;目录内没有 .mjs/.sh/.ts 等可执行文件。SKILL.md 引用的 scripts/*.sh 实际位于**仓库根**(三仓库各一份),并非 skill 目录内资产——本报告按「SKILL.md 明列的使用路径」把它们计入 scripts_executed,但档位判定仍以 skill 目录内行为为主,两者结论一致(蓝)。
  • [ok] 全部外链是否只是文档链接而非运行时端点 — 对 skills/ 全域 grep `https?://`(排除 iart.ai)零命中;唯二命中是 reference 与 README 末尾的 `https://iart.ai/?utm_source=github&utm_medium=…` 营销/引流链接,以及 skill 内代码里的 `file://`? 无。因此不存在「执行期外发」。
  • [ok] 云转写替代路径是否构成现实风险(要不要升橙) — reference §2 原文只有一行:`- Cloud alternatives (AssemblyAI, Deepgram, OpenAI Whisper API) also return word timing — map their words[] into Token the same way.`,SKILL.md 管线表也只在工具列把 AssemblyAI 与 Whisper 并列。源码未规定任何 endpoint、key 读取方式或上传动作;默认路径是本地 whisper.cpp。按批4 细则2(可选的替代方案不判级)维持蓝档,但已在 risks 写明触发条件。
  • [ok] 验收断言的措辞是否与 reference 的实现一致(防第一遍想当然) — SKILL.md 要求「第 90 帧高亮的词必须是覆盖 90/fps 的 token」;reference §5 的窗口组件正是 `active={now >= t.startMs && now < t.endMs}`(now = frame/fps×1000 系);两侧同一判据,无漂移空间。
  • [unlocatable] 性能声明「Whisper medium.en ≈ 2x faster than large」是否有据可查 — 仓库内无基准脚本、无数据文件、无引用来源;本次为只读侦查且不得运行转写,故不验证该倍数,仅作为文档声明记录,不作为结论。
  • [discrepancy] light tier(seek-shot.sh + `?t=N` harness)对本 skill 是否可用 — scripts/README.md 把 seek-shot.sh 标为 Light tier(驱动页面的 `?t=N` seek harness),但 caption-animation 的 Web/CSS 路径(reference §6 的 renderTrack)只做 track 渲染,**没有提供 seek harness**;本 skill 的「Packaged helper」行也只点名 contact-sheet.sh 与 probe-mp4.sh(Heavy tier),未提 seek-shot.sh。结论:该脚本对本 skill 属仓库级通用件而非本 skill 承诺的能力,读者不应假定 light tier 可用——这是对 pin commit 有效的真实出入(非错误声明,因 SKILL.md 从未承诺)。
  • [ok] 三仓库共享脚本是否同内容(跨包一致性) — 三仓库 scripts/ 逐字节相同:contact-sheet.sh b7dcc28034c9bf8fda5d48683e54d8b5、probe-mp4.sh 167b7977c50f492014e1a6fef8c9ed12、seek-shot.sh 24a4130cd1e64874154429b0b4af12da

6结论

  • 把「卡点」做成架构结果而非调参结果:一条 token 数据形状贯穿转写→高亮→导出,漂移在结构上无处发生
  • 验收标准可第三方复算:帧号 ↔ token 区间的等式写死在 checklist,验完即编码,几乎零成本
  • 双重产物(烧录 MP4 + sidecar SRT/VTT)从同一批 token 导出,既满足社交平台也满足无障碍,无二次对齐成本
  • 竖屏硬约束被量化:字号 56–80px、描边 2–6px、居中带 62–70%、底部留 280px,另有逐平台安全区表
  • reference 是可粘贴的实现(含完整 SRT 解析器与 SRT/VTT 序列化),agent 不必从零写解析
  • 适合:适合:要给自己/客户的竖屏短视频(TikTok / Reels / Shorts)烧录词级同步字幕的创作者与剪辑代理;有干净人声音轨(或已备 SRT/转写)且希望在 Remotion 里把字幕做成可复用组件、批量换文案重渲染的场景;需要同时交付社交版(烧录)与网页版(.srt/.vtt)的项目。适合愿意让 agent 一路做到编码、但自己复核三张静帧的用户。
    不适合:不适合:① 只想要「把字幕画上去」而不需要逐词卡点的人(普通 ffmpeg 烧字幕更省事);② 素材是重 BGM/多人抢话、懒得分轨降噪的音频——词边界会被破坏;③ 长视频(reference 自述 10 分钟视频本地渲染 30–60 分钟,建议分段或 Lambda)且无法接受渲染时长者;④ 不愿安装远程包/模型、要求完全离线自足的环境;⑤ 不愿把音频交给第三方却又不装本地 Whisper 的场景(此时唯一可走的就是云路径,属橙档触发条件);⑥ 只拷贝单个 skill 目录、不安装整仓 scripts/ 的安装方式。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-28
    方式 A · 人下载镜像包下载 caption-animation.tar.gz
    sha256: 1b958f9e09758504…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit 2a775336b5;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库iart-ai / iart-ai/tiktok-video-skills
    Stars11
    最近推送2026-06-22
    本 skill commit2a775336b5
    许可MIT(仓库根 LICENSE 为 "MIT License / Copyright (c) 2026 iart.ai";GitHub API spdx_id = MIT;.claude-plugin/plugin.json 亦声明 "license": "MIT")
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近