Communitygithub.com

Remotion カウントダウンビデオパイプライン

小説・知識・ゲーム理論などのテーマを、Remotion を使って音楽ビートに同期した 16:9 または 9:16 のバイリンガル字幕動画(ナレーションなし)に変換します。SVG アニメーション、ビート解析、エネルギー検出によるクリップ選択、カバー作成、公開パッケージの生成を自動化します。

Remotion カウントダウンビデオパイプライン とは?

このスキルは、与えられたテーマと BGM から、音楽のビートに完全に同期した約 88~90 秒のバイリンガル(中英)字幕動画を生成する、Remotion ベースの完全コード化パイプラインです。音声トラック抽出・ビート解析・エネルギー分析により、動画のテンポとカットポイントを自動決定し、SVG 部品ライブラリを使ってコードだけで視覚的なシーンを構築します。対応プラットフォームは Claude Code(または Remotion が動作する CLI 環境)で、最終出力は動画ファイル・3 種類のカバー画像・公開用テキスト・事実確認リストを含む完全なパッケージとして提供されます。固定のワークフローに従い、手動調整を最小限に抑えつつ、品質を保証するための静画チェックや出力検証ステップも組み込まれています。

対応~Claude Code~Codex CLI~Cursor
npx skills add TYY123-as/remotion-beat-video

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Remotion カウントダウンビデオパイプライン は何をしますか?

Goal: 与えられたテーマと BGM から、88~90 秒 / 16:9 / ナレーションなし / 中英バイリンガル字幕 / すべてのシーンを楽曲の強いビートでカット した動画を生成し、 さらにカバー 3 種類、公開パッケージ、事実確認リスト を出力します。処理全体はコードで完結し、字幕を変更する場合は文字列を書き換えるだけでよく、再レンダリングには約 35 分かかります。

使用するタイミング

  • 「このテーマを Douyin の知識動画 / ゲーム理論解説動画にしてほしい」
  • 「特定の BGM でビートに合わせた動画を作りたい」
  • 「小説のこの部分を動画にしてほしい」(フィクション IP の場合は references/fact-check.md を参照)
  • 完成品セット が必要な場合:動画 + カバー + 公開用キャプション + 事実確認

使用してはいけないタイミング

  • ナレーションの吹き替え が必要な場合(本パイプラインは字幕のみのナラティブです。吹き替えが必要な場合は、まず TTS トラックを生成してからアラインする必要があります)
  • 実写 / AIGC 素材のミックス編集 を行う場合(本パイプラインはコードによる SVG 描写のみです)
  • 動画ではなく 画像 + テキスト のみが必要な場合

〇、スタイル DNA(最初に読んでください。すべて実測に基づいています)

項目仕様理由
画面サイズ1920×1080 / 30fps(縦向きは別途 Composition)アカウントは 16:9 に固定。データ上、内容効率が高い
長さ88~90 秒(約 42 小節)「60~90 秒 / 1 話」のテスト枠に最適
音声ナレーションなし、BGM + 合成効果音スタイル上の要件。TTS のアラインコストも回避
字幕中英バイリンガルの 2 行、中国語は 22 文字以内、各フレーズの表示時間 ≥2.2 秒このアカウントのスタイル(Douyin の一般的な推奨は 1 言語だが、これはアカウント固有の選択)
導入最初の 1 秒 = 完全な対立文 + 具体的なオブジェクト2 秒離脱率が最大の弱点
ナラティブ1 人の人物 + 1 つの問題 + 1 つの因果連鎖「概念図鑑」や「群像ミックス」は避ける
構造フック → タイトル → ルール → トラップ → 反撃 → 逆襲 → 暴露 → 昇華 → エンディングreferences/script-template.md を参照
リズム各シーンは楽曲の強いビートでハードカット。重要なアクションはビートに合わせるカウントダウンは音楽の構造に基づくもので、手動アラインではない
ビジュアル暗めの背景 + メタル/木/金色の質感 + 大きなフォント + 少数のラベルスマートフォンの縮小表示でも可読性を確保
セーフゾーンシーンの要素の y 座標 ≤ 850。字幕は y≈870~1000。左上のヘッダーは y 50~95実測で最も失敗しやすい部分
エンディングスクリーンショット可能なリスト(保存ポイント)+ 質問文を必ず入れる保存率が最大の弱点
正確性フィクション IP は「図はイメージです」と明示。事実は階層に分けて表示references/fact-check.md を参照

一、8 ステップのワークフロー(順番に実行。スキップ不可)

ステップ 1:プロジェクトの立ち上げ(テーマ選択と確認)

  1. ユーザーがテーマを指定しない場合、まず 3 つの候補を提示(各候補に以下を明記:一文のコア / 最初の 1 秒のフック / なぜ描写可能か / 保存ポイント / リスク)。ユーザーが選択する。
  2. 候補はユーザーに提示する前に存在確認を行うこと:フィクション IP なら章名やエントリが確認できること。知識系なら出典が確認できること。
  3. ユーザーが選択後、そのテーマの原典資料を入手する(原文の段落が最良。二次情報のみの場合は、その出典の階層を明記。ステップ 8 参照)。

ステップ 2:音声トラックとビート解析(すべての時間制御の基礎)

# ① 音声トラック抽出(mp4/mp3 対応。システムに ffmpeg がない場合、自動的に imageio-ffmpeg のバイナリを使用)
python scripts/extract_audio.py 入力.mp4 work/            # → work/audio.f32 + work/music.mp3
# ② ビート / 強いビート / セクション / 調性
python scripts/analyze_beats.py work/audio.f32 src/beats.json
# ③ エネルギー分析、ウインドウ選択(重要なステップ)
python scripts/scan_energy.py src/beats.json work/audio.f32 --seconds 89
  • 出力は以下を提供:START_BAR / END_BAR、小節ごとのエネルギーマップ、無音部分がウインドウの何パーセントを占めるか。
  • 反転(どんでん返し)は無音部分の直後の最初の強いビートに配置 — これが動画全体で最も価値のある 1 秒です。
  • ウインドウはエンディングの減衰部分を除外しないこと(切れの悪い終わり方を防ぐ)。
  • もし曲がすでにシリーズで使用済みの場合、まだ使用されていない後半部分を優先的に選ぶ。視覚的な重複を避けるため。

ステップ 3:脚本を書く(src/script.ts)

  • 各シーンは bars(占める小節数)を宣言。すべてのシーンの bars の合計は END_BAR − START_BAR と等しくなければならない(そうでない場合、placeScenes が比例拡大縮小し警告を表示)。
  • 字幕は subs に記述:{zh, en, at}、at はシーン内の何拍目か(例:4.5 のような半拍も可)。1 フレーズあたり 4~5 拍が最適。
  • 効果音は cues に記述:{id, beat, sfx, vol, impact}。impact:'big' = 白フラッシュ + 画面振動 + 色収差 + 音楽サイドチェインで 40 フレーム分ボリュームダウン。
  • リズム予算:フレーズ数 × 2.5~3 秒 ≈ 総時間。89 秒で約 30 フレーズ。

ステップ 4:ビジュアル部品とシーン(src/*/kit.tsx + src/*/scenes.tsx)

  • 部品を先にすべて書き終えてからシーンを書く:1 テーマあたり通常 6~10 個の部品(例:鉄の箱 / 錠 / 鍵 / シュレッダー / 電子レンジ / 人物シルエット / 彫像 / ランプ / 宝くじ / カウンター / 道玉)。
  • すべての部品は純粋な SVG。座標は 1920×1080 でハードコード。translate/scale で再利用する。
  • シーンコンポーネントはビートに合わせて部品を配置することのみ担当:const bf = (n) => beatFrame(scene, n)。出現は常に pp(f, bf(n), 8) のようなイージング関数を使用。
  • チェックリストは references/visual-kit.md を参照。

ステップ 5:プロジェクトのセットアップ

1 つのプロジェクトに複数の動画を含める場合:src/<episode>/{script.ts,timeline.ts,fx.tsx,kit.tsx,scenes.tsx,Main.tsx} として構成。 src/Root.tsx に 2 つ目の <Composition> を登録。各動画は独自の beats.json と music.mp3 を使用する。

  • 2 つ目の動画は独自のビート処理ラッパーを持つ必要がある(fx.tsx の Shell/ImpactFlash は当該動画の cueFrame を使用する必要がある。そうしないと衝撃点がずれる)。
  • オーディオは <Audio startFrom={OFF}> で、内容全体は <Sequence from={-OFF}> でラップする。これによりシーン内部で「音楽フレーム」ベースで時間指定ができる。
  • 詳細は references/pipeline.md を参照。

ステップ 6:静止画チェック(合格するまでレンダリングしない)

node <node> node_modules/@remotion/cli/remotion-cli.js still <Comp> out/s1.png --frame=<シーンの中間フレーム>

各シーンを 1 枚ずつ静止画として出力し、目視で以下を確認:

  1. 字幕がシーンの要素と重なっていないか(最も多い問題)
  2. 要素の重なり(ラベル同士、ラベルと図形)
  3. セーフゾーン(要素の y ≤ 850)
  4. スマートフォンの縮小表示でテキストが読めるか(中国語文字 ≥24px、メインタイトル ≥120px)

ステップ 7:レンダリングと出力検証

node <node> node_modules/@remotion/cli/remotion-cli.js render <Comp> out/<name>.mp4 --codec=h264 --crf=18 --concurrency=6
python scripts/check_mp4.py out/<name>.mp4      # 長さ / トラック数 / 解像度 / オーディオパラメータ

check_mp4.py は ffprobe を必要としません:mp4 ボックスを直接解析し、vide + soun の 2 トラック、長さの一致、1920×1080、AAC 48kHz を確認します。

ステップ 8:納品

python scripts/make_covers.py --src out/<静止画>.png --crop x0,y0,x1,y1 \
    --title メインタイトル --kicker サブタイトル --sub 一言キャッチ --out-prefix out/カバー_XXX

以下 4 点を納品:

  1. 完成動画 mp4(ワークディレクトリのルートにコピー。ファイル名にテーマを含める)
  2. カバー 3 種類(16:9 / 3:4 / 9:16)——絶対に自動フレームキャプチャを使用しないこと
  3. 公開パッケージ(本文 + 固定コメント + カバー案 + 24 時間判定表)。テンプレートは references/cover-and-publish.md
  4. 事実確認リスト(フィクション IP には必須)+ 絵コンテ(タイムコード表)

二、不変のルール(すべて実測から得られた教訓)

  1. 最初のフレームはタイトルではなくフック:完全な対立文 + 具体的なオブジェクト(「人質は電子レンジの中に閉じ込められ、カウントダウンが進んでいる」)。
  2. 字幕のセーフゾーン:シーンの要素はすべて y ≤ 850 に配置。字幕は 870~1000。静止画チェックではこれを優先的に確認。
  3. 1 行の字幕 ≤22 文字、表示時間 ≥2.2 秒。中国語の主文 + 英語の対訳の 2 行。
  4. エンディングはスクリーンショット可能であること:3 ステップ / 3 信号のリスト + 「まずは保存しておくことをおすすめします」という文言。感想だけで終わるエンディングは保存されない。
  5. 無音部分 = 反転ポイント:scan_energy.py が無音部分が何小節目にあるかを教えてくれます。最も強力な反転をその後ろに配置してください。
  6. 大規模衝撃は控えめに:impact:'big' は白フラッシュ + 画面振動 + 色収差 + 音楽のボリュームダウンを引き起こします。動画全体で 5~8 回で十分。多すぎると慣れてしまいます。
  7. 等速スライドは使用しない:すべての出現はイージング(Easing.out(cubic))を使用。ラベルの出現には少しの移動 + スケールを加える。
  8. フォント:「古いテキスト用に切り詰められたサブセットフォント」は使用しない(新しいテキストで文字が欠ける可能性があります)— システムフォントスタック 'Noto Sans SC','Microsoft YaHei' を直接記述してください。
  9. public/ は全体がコピーされる:使用する効果音のみを配置する(例:148 個 → 16 個。レンダリングごとに 60MB のコピーを削減)。
  10. Remotion の ETA は初期に過大表示される:「残り 3 時間」と表示されても心配しないでください。実測では安定して 約 1.35 フレーム/秒、2700 フレームで約 35 分です。
  11. フィクション IP の 3 段階注釈:原典原文 / 読者による整理 / 私の推測 — 動画内では最初の 2 段階の共通部分のみを記述。残りは事実確認リストに回す。
  12. 動画内に数字をハードコードしない(「四つの十二支」→「いくつかの十二支」)、章番号もハードコードしない(「第 359 章」→「第 359 章前後」)。

三、ディレクトリ構成

<project>/
├── public/music.mp4/3              # この動画の BGM
├── public/music.f32(+.json)        # ビート解析用(削除可能)
├── public/sfx/*.wav                # 調性に合わせて合成した効果音
├── src/beats.json                  # analyze_beats の出力
├── src/script.ts                   # スクリプト全体(内容変更はここだけ)
├── src/timeline.ts                 # シーン→ビートマッピング + OFF/TOTAL
├── src/Root.tsx                    # Composition の登録
├── src/fx.tsx                      # 画面振動 / 白フラッシュ / 色収差 / バイリンガル字幕
├── src/<episode>/**                # 2 つ目以降のエピソード:独立した script/timeline/fx/kit/scenes/Main
├── tools/                          # このスキルの scripts/
└── out/                            # 静止画 + 完成動画 + カバー

四、参考ファイル

  • references/pipeline.md — 環境セットアップとコマンド一覧(このマシン固有のすべての注意点を含む:ffmpeg / scipy / npm なし)
  • references/script-template.md — 脚本構造テンプレート + 拍数変換表 + 今回の 2 動画の実際のタイムコード
  • references/visual-kit.md — ビジュアル部品の仕様、セーフゾーン、配色、よくある重なり問題
  • references/sfx-and-mix.md — 効果音合成(調性に合わせる)、サイドチェイン、ラウドネス
  • references/fact-check.md — フィクション IP の事実確認方法と「読者による再話」の注釈仕様(利用可能な Bilibili API を含む)
  • references/cover-and-publish.md — カバー 3 種類の仕様 + 公開パッケージテンプレート + 24 時間判定
  • examples/十日终焉-两集.md — 2 つの実例の構造、データ、決定記録

五、能力範囲(ユーザーに対して誠実に)

  • 本パイプラインはナレーションを生成しません。吹き替えが必要な場合は、別途 TTS を用意し、字幕を再アラインする必要があります。
  • ネットワーク制限環境(多くのドメインが DNS でブロックされている)では、フィクション IP の詳細は二次情報しか得られない場合があります — その場合はステップ 8 の事実確認リストに必ず含め、推測を記述しないでください。
  • レンダリングは計算負荷が高い処理です。4 コアのノート PC で 1 本の 89 秒 1080p 動画に約 35 分かかります。「数分で出力」と約束しないでください。
  • 著作権:BGM を Douyin 動画から抽出するのは、自己参照目的にのみ適しています。公開時には、プラットフォーム内の楽曲ライブラリ / オリジナルサウンドカードを使用してください。

関連スキル