コンテンツ制作 · iart-ai/tiktok-video-skills

caption-animation

ユーザーから「アニメーション字幕の追加」「TikTok風テロップの作成」「カラオケ風字幕」「単語ごとの字幕」「自動字幕」「アクティブな単語のハイライト」「動画への字幕焼き込み」「ナレーション/ボイスオーバーへの字幕同期」「SRT/文字起こしのアニメーションテキスト化」を求められた場合に使用するスキル。Whisperによる単語レベルのタイミング取得、単語ごとのポップ/スケールイン、アクティブ単語のハイライト、9:16セーフエリア配置、視認性の高いタイポグラフィ、焼き込み vs サイドカーSRT/VTTの出力に対応する。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author iart-aiGitHub iart-ai/tiktok-video-skills ↗Stars 11License MIT(仓库根 LICENSE 为 "MIT License / Copyright (c) 2026 iart.ai";GitHub API spdx_id = MIT;.claude-plugin/plugin.json 亦声明 "license": "MIT")Commit 2a775336b5
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 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.
ここで行われていること:この規律により、パイプライン全体がSRTの文レベルのcueではなく、単語ごとのタイムスタンプを取得することが義務付けられます。以降の全コンポーネントが同一のフラットなtoken形状を消費するため、タイミングの同期(カ点)が後からの微調整ではなくアーキテクチャ上の既定動作となります。

パイプラインを6段階の表(文字起こし→正規化→ページ分割→アニメーション→配置→エクスポート)に固定し、各段階で具体的なツールを指定してエージェントの自由な即興実装を防ぐ。

skills/caption-animation/SKILL.md
| Transcribe | Audio → word-level timestamps | Whisper (`@remotion/install-whisper-cpp`), AssemblyAI |
ここで行われていること:この表が「実装原理」の中核です。能力はモデルが即興で書くコードに依存するのではなく、各ステップを決定論的なライブラリ関数(Remotionのcaptionsツールチェーン + whisper.cpp)へ収束させることで担保されます。

全工程を通じてデータ構造を `{text, startMs, endMs}` の1つに統一し、あらゆるソース(Whisper / SRT / クラウドAPI)をこの形式に正規化する。

skills/caption-animation/SKILL.md
type Token = { text: string; startMs: number; endMs: number };
ここで行われていること:データ構造こそがインターフェースです。tokenに正規化された後、下流の「どの単語をハイライトするか」は単純な区間包含判定となり、レンダラーは単語の出所を知る必要がありません。

各単語のポップアニメーションを自身のstartMsに固定し、Remotion springのオーバーシュートを用いて生き生きとした動きを演出する。

skills/caption-animation/SKILL.md
const enter = (token.startMs / 1000) * fps; // word's own entrance frame
ここで行われていること:インフレームは全体の進行率ではなく、単語ごと(frame - enter)に計算されます。これが単語レベルの同期を成立させる技術的根拠です。

ページ分割ルール:1ページあたり1〜4単語とし、combineTokensWithinMillisecondsを用いて2段階のリズム感を切り替える。

skills/caption-animation/SKILL.md
and tune `combineTokensWithinMilliseconds`: ~200–500ms for true word-by-word, ~1000–1500ms for short readable phrases.
ここで行われていること:「リズム」を単一の数値としてパラメータ化し、同一コンポーネントでネイティブな1語ごとの表示と短いフレーズのグループ化の両方に対応できるようにします。

可読性とセーフエリアを形容詞ではなく具体的な数値表(フォントサイズ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)の制約を数値化し、エージェントが感覚で字幕を配置するのを防ぎます。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.
ここで行われていること:「SNSでの即時利用」と「アクセシビリティ適合」を2つの成果物に分離しつつ、同一のタイムコードを共有することで二度手間となるアライメント作業を排除します。

検証ループ(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)
ここで行われていること:目視では判別しにくい「ズレ」を、わずか3枚のPNGを用いて判定可能な単一点のアサーション(frame/fps が token 区間に収まっているか)へと変換します。

referenceにてエンドツーエンドで実行可能なコード(Whisperのインストール、SRT解析、ページ分割、SRT/VTTエクスポート、プラットフォーム別セーフエリア、フォント仕様)を網羅する。

skills/caption-animation/references/word-timed-captions.md
# Word-Timed Captions — End-to-End Build
ここで行われていること:SKILL.mdで規律と骨組みを提示し、referenceでそのまま貼り付け可能な実装を提供します。この2層の役割分担が本パックの統一パターンです。

文字起こしに関してオフラインとクラウドの2つの選択肢を用意する(クラウドはreference内に代替案として1行記載されるのみ)。

skills/caption-animation/references/word-timed-captions.md
npx @remotion/install-whisper-cpp # one-time: installs whisper.cpp + a model
ここで行われていること:デフォルトのパスはローカルのwhisper.cpp(モデルダウンロードを含む)であり、クラウドAPIはあくまでオプションの代替手段です。これにより本スキルのセキュリティ評価はローカルツール型のまま維持されます。

2コア機能

01単語レベルのタイムライン構築:Whisper(ローカルwhisper.cpp)またはクラウドAPI文字起こし → 統一token配列への変換、SRTパーサーによるcueのミリ秒変換
02単語ごとのポップイン(span + spring)とアクティブ単語のハイライト(単一アクセントカラーまたは塗りつぶしピル)
03ページ分割(1〜4単語/ページ)とテンポ調整による画面いっぱいのテキスト表示防止
04純粋なWeb/CSSパス(DOMプレイヤー向け):単語ごとに animation-delay = startMs を設定
05視認性の高いフォント仕様と9:16セーフエリア:極太サンセリフ、56〜80px、2〜6pxストローク + ドロップシャドウ、中央帯配置、下部UI領域の回避
06音声と字幕で同一のタイムベースを共有(ボイスオーバーを再録した場合は再文字起こし必須、手動オフセット調整は禁止)
07焼き込みMP4 + サイドカーSRT/VTTのデュアル成果物出力(GIFはREADME用の動作証明スニペット限定)
08納品・検証ループ:静止画出力(実際の納品用propsを使用)→ 目視確認 → エンコード、`npx remotion compositions` による durationInFrames/fps の取得

3外部依存関係

KindDependency / Endpoint
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推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: `npx @remotion/install-whisper-cpp`:プロジェクトディレクトリへのwhisper.cppおよびモデルファイルの一括インストール(オフライン文字起こしパス)
  • 网络端点: 外部ネットワークアクセスの宣言: (オプション・非デフォルト)AssemblyAI / Deepgram / OpenAI Whisper APIを選択した場合、ユーザーの音声素材がサードパーティの文字起こしサービスに送信される。re
  • 本地工作目录: ファイルの読み書きと成果物の出力: 本スキルに基づきエージェントが構築するRemotionプロジェクト(src/、Root/Composition、zodスキーマ)および out/capti
監査ノート: 。3段階の自己証明:① 判定対象=本スキルディレクトリ(skills/caption-animation/ 内をfindで確認したところ、SKILL.md、references/word-timed-captions.md、README.md の3つの .md ファイルのみが存在し、非 .md ファイルおよび実行可能スクリプトはゼロ);② ディレクトリ自体の内部動作=ローカル書き込み(Remotionプロジェクト、out/*.mp4、out/*.gif、out/f-*.png、サイドカー .srt/.vtt)+ローカルCLI(`npx remotion still/render/compositions`;リポジトリ直下の scripts/contact-sheet.sh、probe-mp4.sh を介した ffmpeg/ffprobe の実行)。skills/ 全域で `process.env` / `API_KEY` / `token` / `cookie` / `https?://` の実行時エンドポイントは**検出数0**(唯一の外部リンクはreference末尾の iart.ai UTMマーケティングリンクのみ);③ 唯一のネットワーク面はnpm公式チャンネルからのパッケージ取得(remotion / @remotion/*)および whisper.cpp とモデルを取得する1回限りの `npx @remotion/install-whisper-cpp` であり、サイト内の青判定の前例(hyperframes、general-video:公式npm経由のnpx実行は単独で評価を引き上げない;motion-background:同一の scripts/ を使用して青判定)と同基準。黄判定への引き上げなし:「固定公開エンドポイントへの問い合わせ」やスクレイピング行為は存在しない。橙判定への引き上げなし:認証情報や環境変数の読み取りはなく、デフォルトパス(ローカルwhisper.cpp)では素材は外部送信されない。なお、reference §2 のクラウド文字起こし代替案が選択された場合は橙判定のトリガー条件(素材の外部送信+ユーザー自身によるAPIキー準備)に該当するが、第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区間の等式がチェックリストに明記されており、確認後即座にエンコード可能で追加コストがほぼゼロ
  • 同一のtoken群からデュアル成果物(焼き込みMP4 + サイドカーSRT/VTT)を出力し、二度手間のアライメントなしにSNS利用とアクセシビリティを両立
  • 縦型動画の制約を数値化:フォントサイズ56〜80px、ストローク2〜6px、中央帯62〜70%、下部280pxの余白、さらにプラットフォーム別のセーフエリア表を完備
  • referenceにコピー&ペースト可能な実装(完全なSRTパーサーおよびSRT/VTTシリアライザーを含む)が揃っており、エージェントがゼロからパーサーを作成する必要がない
  • 最適な用途: 最適:自身またはクライアントの縦型ショート動画(TikTok / Reels / Shorts)に単語同期の字幕を焼き込みたいクリエイターや動画編集エージェンシー。クリアな音声トラック(または準備済みのSRT/文字起こし)があり、Remotion内で字幕を再利用可能なコンポーネントにしてテキスト差し替えの一括再レンダリングを行いたいユースケース。ソーシャル向け(焼き込み)とウェブ向け(.srt/.vtt)を同時に納品する必要があるプロジェクト。エージェントにエンコードまで一任しつつ、自身で3枚の静止画を最終確認したいユーザーに最適。
    不向きな用途: 非推奨:① 単語ごとの同期を必要とせず「単にテロップを載せたい」だけの場合(通常のffmpeg焼き込みの方が手軽);② BGMが極端に大きい、または複数人の発話が被っており、トラック分離やノイズ除去を行わない素材(単語の境界判定が壊れるため);③ 長尺動画(reference記載の通り10分の動画でローカルレンダリングに30〜60分かかるため、分割またはLambda推奨)でレンダリング時間を許容できない場合;④ リモートパッケージやモデルのインストールが禁止されており、完全なオフライン自立環境を求める場合;⑤ 音声をサードパーティに送信したくないがローカルWhisperもインストールしないシナリオ(クラウド経由しか選択肢がなくなりオレンジ判定のトリガーとなる);⑥ リポジトリ全体のscripts/を配置せず、単一のskillディレクトリのみをコピーする導入方法。
    Install Agent-Ready
    ① Verified Mirror 2026-09-28
    Option A · Direct DownloadDownload caption-animation.tar.gz
    sha256: 1b958f9e09758504…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 2a775336b5.