AI解説動画:コード駆動パイプライン
"Opus 5.5 is good at explainer videos" と題された投稿が 319ポイント、175コメントで Hacker News の上位に居座りました — そしてスレッドを読んでいて最も興味深いのは、 どれだけ多くの人が仕組みを取り違えていたかです。彼らは動画モデルだと思い込んでいました。 そうではありません。
実際に起きていることはもっと奇妙で、はるかに有用です:コーディングモデルが 決定論的なアニメーションプログラムを書き、別のレンダラーがそのプログラムを フレームに変換します。モデルは出力のピクセルを一切見ません。つまり全体が ソフトウェアのように振る舞う — 差分が取れ、再レンダリングでき、パラメータ化でき、 デバッグできる — のであって、見た目が整うまで再プロンプトを繰り返すスロットマシンの ようには振る舞いません。
このページは、あのスレッドに欠けていた実践的なガイドです:パイプラインの仕組み、 3つのレンダーエンジンのどれを選ぶか(そしてモデルが測定可能なほど苦手なのはどれか)、 エージェントが書いたアニメーションコードを静かに壊す2つの失敗モード、見られる解説動画と 読めない解説動画を分けるペーシングの算術、そしてお金が実際にどこへ行くのか。
- なぜコーディングモデルが解説動画で動画モデルに勝るのか — そして何を諦めているのかを説明する
- フレームレンダリングされるアニメーションで Math.random() が禁止される理由と、その代替を挙げる
- Remotion、Motion Canvas、Manim をライセンスと「モデルがどれだけうまく書けるか」で選び分ける
- エージェントが書いたアニメーションコードの2つの罠を見抜く:Manim のフォーク分裂と、古くなった Remotion API
- 推測ではなくスライドごとの最小表示時間を計算し、視聴者が実際に読めるようにする
- どの費目が請求額を支配するかを予測する(たいていは LLM ではありません)
仕組み:モデルが書くのは動画ではなくプログラム
まったく別の2つのものが「AI動画」と呼ばれています。
拡散動画モデル(ジェネレーティブメディア で扱っているファミリー)はプロンプトを受け取り、ピクセルを直接出力します。b-roll、 ドローンショット、テクスチャ、ムードには最適です。正確でなければならないもの — 読める文字、正しいアーキテクチャ図、実際のプロダクトUI、40%と書かれていなければならない 数字 — には不向きです。
コード駆動アニメーションは逆方向に進みます。コーディングモデルがアニメーションの ソースコード — React コンポーネント、TypeScript のシーングラフ、あるいは Python — を書き、レンダラーがそれを実行します。テキストはテキストなので、鮮明で綴りも正しい。 図はレイアウトなので、正確です。あなたのロゴはあなたのロゴファイルそのものです。
この分かれ方が、HN スレッドで最も多かったワークフロー報告を説明します:モデルが 「HTMLページを作り、生のJSでタイミング制御したアニメーションを使う」、そしてフレームを キャプチャして ffmpeg で組み立てる、というものです。同時に、このアプローチが何を 諦めているかも説明します — 写実的な映像を創り出すことはできないので、実際のパイプラインの 多くは b-roll のために画像モデルや動画モデルを呼び、合成しています。
内面化しておく価値のある帰結:あなたの解説動画はリポジトリになる。 スライド4の 価格を変えて、再レンダリング、完了。ナレーションをローカライズして、同じシーンから 12言語を再レンダリング。プロンプト・トゥ・ビデオのモデルが与えてくれる性質では ありません。
なぜ決定論こそがすべての鍵なのか
ここが、あなたのパイプラインがきれいな動画を作るのかチラつく汚れを作るのかを静かに 決める部分であり、これについて書く人はほとんどこれに触れません。
Remotion のようなレンダラーは、あなたのアニメーションを画面録画しません。 ヘッドレス Chrome でコンポジションを開き、クロックをフレーム0にセットしてスクリーンショット、 クロックをフレーム1にセットしてスクリーンショット、と続けます — しかもこれを 複数スレッドにわたって、ページを何度も開きながら行います。フレームは順不同に、 並列に、別々のブラウザコンテキストで生成されます。
すべてはそこから導かれます:
- アニメーションはフレーム番号の純粋関数でなければならない。 Remotion では
それが文字通り API です:
useCurrentFrame()がフレームを与え、interpolate()が それを値に写像します。タイマーなし、requestAnimationFrameなし、実時間で駆動される CSS トランジションなし。CSS トランジションは、スクリーンショットが撮られた瞬間に たまたま途中だった状態をそのままレンダリングします。 Math.random()は構造的に壊れている。 スレッドごと、ページロードごとに異なる値を 返すので、「ランダムな」パーティクルが毎フレーム新しい位置へ飛び跳ねます。Remotion は まさにこのためにrandom(seed)— シード付き mulberry32 PRNG — を同梱しています:random(1)は常に0.07301638228818774を返します。spring()も同様で、(frame, fps, config)をキーにキャッシュされた純粋計算です。- フレーム落ちが原理的に起こらなくなる。 重いアニメーションの画面録画は、CPUが 追いつかないとフレームを落とします。フレームごとのレンダリングは単に時間が長く かかるだけです。ノートPCでの5分のレンダリングが完全に滑らかに再生される動画を 生み出せるのはこのためです。
- アニメーションコードをエージェントに書かせるためのルールを1つだけ覚えるなら:実時間を禁じること。setTimeout なし、CSSトランジションなし、Date.now() なし、Math.random() なし。すべての視覚的な値は現在のフレーム番号から導かれなければなりません。モデルはCSSトランジションに手を伸ばしがちです — ウェブのコーパスがそれで溢れているからです。
3つのエンジン
3つとも実在し、活発にメンテナンスされ、放送品質の出力を生み出します。違うのは言語、 ライセンス、そして — 重要なことに — モデルがどれだけ確実にそれを書けるかです。
| Remotion | Motion Canvas | Manim | |
|---|---|---|---|
| 言語 | React / TypeScript | TypeScript(ジェネレーター) | Python |
| リポジトリ | remotion-dev/remotion | motion-canvas/motion-canvas(約19.2kスター) | ManimCommunity/manim(約41k)・3b1b/manim(約94k) |
| ライセンス | ソース公開型 + Company Licence | MIT | MIT |
| 得意領域 | プロダクト/ローンチ動画、UI、テキスト中心の解説 | タイムライン精度のモーショングラフィックス | 数学的・アルゴリズム的な可視化 |
| モデルが書く品質 | 強い — しかも公式のエージェントスキルを提供 | まずまず | 3つの中で最弱(下記参照) |
この表のうち2点は、1行では足りません。
Remotion の落とし穴はコードではなくライセンス
Remotion は MIT ではありません。ソース公開型で2階層の商用ライセンスがあり、その閾値は ほとんどのチームを捕まえるほど小さいものです:個人、非営利、評価目的、そして従業員3名まで の営利企業は無料。3名を超える営利組織には有料の Company Licence が必要です。
2つ目の分岐は、動画ではなくプロダクトを作っている場合にさらに重要になります:
- Remotion for Creators — シート課金。自社内で自社のために行う低ボリュームの レンダリングを想定しており、エンドユーザーにパーソナライズ動画を配信することは 明示的に対象外です。
- Remotion for Automators — レンダリング課金。エージェントが顧客向けに動画を レンダリングした瞬間に該当するのがこの階層です。バージョン5.0からは ライセンスキーによるテレメトリ報告が必須になります。
つまり「エージェントがサインアップごとに動画を生成する」は Creators のユースケースでは ありません。出荷する前に Automators として見積もってください。それが致命的なら、 Motion Canvas は MIT で、同じ領域の多くをカバーします。
Manim の罠:2つのフォーク、1つのimport名
これは聞いたことがない人を焼き尽くすもので、同時に HN スレッドのある観察 — 強力なコーディングモデルが期待よりひどい Manim を書き、Gemini のほうが Opus 5.5 より うまく扱えるというコミュニティ報告がある — も説明します。
Manim は2つあります:
- 3b1b/manim — Grant Sanderson のオリジナル、あの有名な動画のもの、約94kスター、
manimglとしてインストールされます。 - ManimCommunity/manim — コミュニティフォーク、約41kスター、一般用途として実際に
ドキュメント化・メンテナンスされているもの、
manimとしてインストールされます。
両者は API 互換性がなく、どちらも from manim import * でインポートされます。
学習コーパス中のチュートリアル、StackOverflow の回答、ブログ記事はどれかの一方であり、
ラベルはありません。だからモデルはもっともらしいコードを書きつつ両方の方言を混ぜ、
Python はもう一方のフォークにしか存在しないメソッドで例外を投げます。これは推論の失敗では
なく、名前空間が汚染されたことによる失敗です。
修正法は退屈ですが効きます:プロンプトと環境の両方でフォークを固定し、エージェントに 思い出させるのではなく、そのバージョンの実際のAPI表面を与えることです。
エージェントが1行書く前に Manim の方言を固定する
Use ManimCommunity Manim (the "manim" package on PyPI), NOT 3b1b/manimgl. Before writing any scene, run: python -c "import manim; print(manim.__version__)" and confirm the version. If a class or method you want is not in that version's API, do not use it — check with: python -c "import manim; print([n for n in dir(manim) if 'Text' in n])" Never mix manimgl APIs (e.g. ShowCreation) with community APIs (Create).
古いAPIの罠(Remotion 編)
同じコーパス汚染の問題が、別の理由で Remotion を襲います:ライブラリが学習データより 速く動いたのです。
現在の Remotion では、メディアコンポーネントは @remotion/media にあり、トリミングの
プロパティは trimBefore / trimAfter です。プレビューとレンダリングで意図的に異なる
コンポーネントを使うことすらできます — プレビュー中は remotion の Html5Audio、
レンダリング時は @remotion/media の Audio を useRemotionEnvironment() で切り替える、
というように。古い資料を中心に学習したモデルは import {Audio} from 'remotion' を
startFrom 付きで書きますが、これは旧形式です。
そのコードは動いてしまうかもしれません。そして何の役にも立たないことを静かに行う 可能性もあり、そちらのほうが厄介です。
だからこそ Remotion は公式の Agent Skills を公開しています — モデルが覚えていることに 期待するのではなく、現在のベストプラクティスをエージェントに手渡す12個のスキル群です。 Claude Code、Codex、Cursor などに向けて設計されており、 オープン標準としての SKILL.md で扱っているのと 同じオープンフォーマットに従っています。
Remotion の公式エージェントスキルをインストールする
npx skills add remotion-dev/skills
スキルは粒度が細かく、それが要点です — 作業フェーズに合うものを呼び出します:
/remotion-create で足場を作り、/remotion-markup でアニメーションとタイポグラフィ、
/remotion-studio でプレビュー、/remotion-render でレンダリング、
/remotion-captions で字幕、そして迷ったときの傘として remotion-best-practices。
ベンダーがメンテナンスするスキルは、動きの速いライブラリに関するモデルの古い知識に対して
最も安価に手に入る修正です:一度インストールすれば、エージェントは推測をやめます。
実際に機能するパイプライン
品質を最も大きく左右するレバーは、動画全体に対するより良いプロンプトではありません。 モデルが判断作業を、レンダラーが決定論作業を担うように仕事を分割すること — その間に 人間が読める成果物を置くことです。
- まず JSON のシーンリストを求めます:シーンごとに、タイトル、画面上のテキスト、ビジュアルの意図、そして秒単位の尺。これが安価でレビュー可能なステップです。12シーンなら30秒で読めて、コンポーネントが1つも存在しないうちに物語を直せます — そして物語を直すことこそが動画を最も改善する編集です。レビュー済みのストーリーボードから生成されたコードは、ふわっとした段落から生成されたコードよりはるかに一貫します。
- 下記の読み速度の算術を各シーンのテキストに対して行い、尺をクランプします。データ層でやればコストはゼロですが、コンポーネントができてからやると、シーン長に依存するすべてのアニメーションのタイミングを取り直すことになります。
- 動画単位ではなくシーン単位で原稿を書けば、音声の境界と映像の境界が揃います。各シーンを TTS API で個別の音声ファイルに合成します。そして各クリップの実際の長さを測定します — シーン長の真実は合成された音声であって、あなたの見積もりではありません。
- これは誰もが飛ばすステップであり、多くのAI解説動画で映像がナレーションを追い越している理由です。各音声ファイルの実際の長さを読み取り、フレームに変換し、その尺をプロパティとしてコンポジションに戻します。推測したフレーム数をハードコードしてはいけません。
- ここで初めて、凍結したストーリーボードに対してエージェントにシーンごとのアニメーションコードを書かせます。決定論のルールを強制します:すべての値は useCurrentFrame() と interpolate() から、ランダム性はシード付きヘルパーから、CSSトランジションは禁止。スタジオでプレビューします — 実際のプレビューは、どれだけコードを読んでも見つからないレイアウトの誤りを捕まえます。
- 単語のタイミングをモデルに推測させてはいけません。自分のナレーションをローカルで文字起こしし、トークン単位のタイムスタンプを使います。Remotion はまさにこのために install-whisper-cpp を提供しています:installWhisperCpp()、downloadWhisperModel()、次にトークン単位タイムスタンプを有効にした transcribe()、そして後処理の toCaptions()。字幕は手に入るアクセシビリティ改善として最も安価であり、ミュートでも見られる動画にしてくれるものでもあります。
- CI で再現できるよう CLI からレンダリングします。そして並列度を推測ではなく実測でチューニングします — Remotion には、同じレンダリングを複数の並列度で繰り返し実行して比較するベンチマークコマンドがあります。
CLIからレンダリングし、本当の並列度を見つける
# deterministic render, reproducible in CI npx remotion render src/index.ts MyExplainer out/video.mp4 # stop guessing --concurrency: measure it npx remotion benchmark src/index.ts MyExplainer --concurrencies=2,4,8 --runs=3
ペーシング:ほとんどのAI解説動画が見ていられない理由
HN スレッドで最も一貫していた不満は、動画の見た目が悪いということではありませんでした。 読むには速すぎる、ということでした。スライドが現れ、テキストがアニメーションで 入ってきて、人間が文を読み終える前に消えてしまう。
これは好みの問題ではなく、公式のあるバグです。見慣れない画面上のテキストに対する大人の 読み速度はおおよそ毎分200〜250語で、視聴者はさらに読み始める前に新しいテキストを 見つける時間も必要とします。したがって:
# minimum dwell time for a text block, in frames
words = number of words in the block
wpm = 200 # conservative for unfamiliar on-screen text
settle = 0.4 # seconds to notice and locate the new text
exit = 0.3 # seconds of breathing room before it leaves
dwell_seconds = settle + (words / wpm) * 60 + exit
dwell_frames = ceil(dwell_seconds * fps)
# worked example: a 14-word bullet at 30 fps
# 0.4 + (14 / 200) * 60 + 0.3 = 4.9 s -> 147 frames
これを実際に使えるものにする2つの注意:
- 入りは速く、保持は長く。 入場トランジションは200〜400msであるべきで、 保持にこそ表示時間の予算を注ぎます。モデルは逆をやりがちです — 長く優雅なフェード、そして短い保持。
- ナレーションがあるなら、表示時間の下限はナレーションの長さ。 テキストは、 それを説明する文と少なくとも同じ長さだけ画面に残らなければなりません。合成音声から シーン長を導く(上記ステップ4)とペーシングがほぼタダで直るのはこのためです。
すべてのシーンを max(dwell_frames, narration_frames) にクランプすれば、ビジュアルを
まったく変えなくても「AIスロップ動画」感の大部分が消えます。
いくらかかるのか、そしてどの費目が支配するのか
HN スレッドのコミュニティ報告では、完成した生成解説動画1本あたりおよそ 3〜4ドルのAPI支出で、注目すべき点として、コストを支配していたのは 言語モデルではなく画像モデルの呼び出しでした。あるコメント投稿者は、 オーケストレーションされたパイプラインを使い、M4 MacBook Air 上で5分の動画を 実時間およそ5分で生成したと報告しています。
絶対値は生ものとして扱うべきですが、その形は構造的で、計画に織り込む価値があります:
- ここでは LLM は安い。 ストーリーボードと数百行のアニメーションコードは少ない トークン数です。フラッグシップ価格でもセント単位です。 プロバイダー横断のAIコストを参照。
- アセットごとの生成呼び出しが支配する。 生成画像や b-roll クリップは1つずつが 有料の呼び出しで、シーン数だけ掛け算されます。上限を設けるべきはこの費目です。
- 計算資源は自前。 レンダリングは自分のマシンか CI で走るので、API支出ではなく時間と 電気代です — サーバーレスレンダラーに移すまでは。移した時点で両方になります。
- 再レンダリングはほぼ無料であり、これこそが構造的な優位のすべてです。スライド4の 誤字修正にかかるのは1回のレンダリングであって、1回の再生成ではありません。12言語への ローカライズは12回のTTSと12回のレンダリングであって、12本の動画ではありません。
実務的な予算管理の一手:画像は一度生成してアセットとしてコミットし、再レンダリングを アセットフリーに保つこと。レンダリングのたびに画像を再生成するパイプラインこそが、 驚くような請求書を生みます。
画一化の問題
スレッドで最も鋭い批判は、真剣に受け止める価値のあるものでした:これらのツールが 広まって数週間のうちに、出力が見分けられるようになった、というものです。同じグラデーション 背景、同じスプリングで入ってくるカード、同じ3語の箇条書き、同じ小気味よい声。 複数のコメント投稿者は、繰り返しの多いコピーも指摘しており、ある例では、動画が まったく別の題材について自信満々に語っていた — Twilight Imperium の参考サイトが AIデータのスタートアップとして説明されていた — と報告しています。
これを本気で使うなら、出力の没個性化を測定可能なほど抑えるレバーは次のとおりです:
- デザインシステムを与える。発明させない。 実際のパレット、タイプスケール、 スペーシングスケール、ロゴを、コンポーネントがインポートする定数として渡します。 指定が足りないプロンプトこそ、モデルのハウススタイルが漏れ出す場所です。
- コピーは自分で書くか、徹底的に手を入れる。 ビジュアルはモデルが得意な部分です。 物語こそが「生成されたもの」として読まれる部分です。
- 自分の画面録画をヒーローアセットに使う。 生成されたシーンに合成された本物の プロダクト映像は、画一化に対する最強の一手であり、ハルシネーションのリスクも 解消します — プロダクトが画面に映っていれば、動画がプロダクトを誤って説明することは できません。
- 主張はドキュメントと同じように検証する。 解説動画の中の事実的な内容はすべて、 あなたの名前で公開される事実の主張であり、テキストページのような簡単な訂正経路は ありません。YouTube に上がってからではなく、レンダリングする前に確認してください。
- 意図的に1つだけ慣例を破る。 デフォルトのテンプレートなら選ばない意図的な選択 — 変わったアスペクト比、音楽が期待される場所での沈黙、手描きのアセット — が1つあれば、 たいてい出力が機械のデフォルトとして読まれるのを止めるのに十分です。
これが得意なこと、そうでないこと
正直に書く価値があります。あのスレッドの懐疑派には一理あったからです:作られているものの 多くは、ナレーション付きのアニメーション化されたスライドデッキです。それは変更履歴、 ローンチ、リリースノート、オンボーディングのウォークスルーには申し分のない成果物であり — そして本当の「教えること」の代用としては貧弱です。教えることには、実例、間違った回り道、 そして気にかける理由が必要だからです。
コード駆動パイプラインに手を伸ばすのは、こんなときです:
- 内容が正確でなければならない — 実際のUI、実際の数字、実際の図。
- 後で変更する必要がある、あるいは複数言語で出す。
- 同じテンプレートから異なるデータで多数の動画を作る。
別の手段に手を伸ばすのは、目的が写実的な映像のとき(動画モデルを使う)、あるいは 価値が「人間が難しい考えをまず下手に、次にうまく説明すること」にあるとき — これは いまだにどんなパイプラインも生み出せないものです。
Check yourself
0/5出典と参考文献
- Opus 5.5 is good at explainer videos — Hacker News の議論 — このページが土台にしているスレッド:319ポイント、175コメント、報告されたワークフロー(HTML + JS のタイミング制御アニメーションを ffmpeg でキャプチャ)、約3〜4ドルのコスト、Manim の弱さ、ペーシングへの不満、画一化への批判。ベンダーの主張ではなくコミュニティの報告であり、本ページ全体を通じてそのように扱っています。
- Remotion — React ベースのレンダラー。決定論モデルについては
useCurrentFrame()とinterpolate()、Math.random()が禁止される理由とシード付きPRNGが返す値についてはrandom()、Company Licence、Creators/Automators の分岐、v5.0 のテレメトリ要件についてはライセンスのページを参照。 - remotion-dev/skills — Claude Code、Codex、Cursor などのための Remotion の12個の公式 Agent Skills。
npx skills add remotion-dev/skillsでインストールできます。モデルの古い知識を修正するためにベンダーがエージェント向けドキュメントを出荷している、現時点で最も明快な例です。 @remotion/install-whisper-cpp— 字幕のためのローカル文字起こし:installWhisperCpp()、downloadWhisperModel()、トークン単位タイムスタンプ付きのtranscribe()、そして後処理のためのtoCaptions()。npx remotion benchmark— フラグを推測する代わりに、並列度ごとのレンダリング時間を測定します。- Motion Canvas — MIT、TypeScript、ジェネレーターベースのタイムライン。Remotion の Company Licence が障害になるときのライセンスフリーな代替。
- ManimCommunity/manim と 3b1b/manim — どちらもMIT、どちらも
manimとしてインポートされ、相互に非互換。上記の Manim 失敗モードの根本原因です。 - AILmanac の関連ページ:ジェネレーティブメディア:画像、音声、動画 · オープン標準としての SKILL.md · プロバイダー横断のAIコスト · Claude Opus 5.5 フィールドガイド
次へ
- ジェネレーティブメディア:画像、音声、動画 — もう一方の枝:このパイプラインが描けない b-roll のための拡散モデル
- オープン標準としての SKILL.md — ベンダーがエージェントスキルを出荷することが、モデルの古いライブラリ知識に対する一般的な修正である理由
- Claude Opus 5.5:フィールドガイド — この波の中心にあるモデルを、価格とベンチマークで