mcpField
C
concept-to-video

concept-to-video

github.com/mathews-tomクリエイティブ・メディア337135 回インストール2 日前に更新
リポジトリ

concept-to-video について

concept-to-videoは、Manimで概念をアニメーション解説動画にするスキルです。編集可能なPythonシーンを中間成果物として、プレビューと修正を重ねてから書き出せます。

主な機能

  1. 01Manimでアニメーションを作成
  2. 02フロー・比較・タイムライン用テンプレート
  3. 03低画質プレビューと反復修正
  4. 04MP4・GIF・WebMへの書き出し
  5. 05音声と字幕の追加

活用シーン

  1. 01アルゴリズムの手順をアニメーション化
  2. 02構成やデータフローを説明
  3. 03比較図やタイムラインを作成
  4. 04動画にナレーションや字幕を追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mathews-tom/armory --skill concept-to-video

インストール後、Claude Code で/concept-to-videoを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

config.toml
pyrightconfig.json
evals/
cases.yaml
references/
storyboard-schema.md
references/code2video/
coder.md
critic.md
LICENSE
planner.md
references/rules/
agent-interaction.md
algorithm-stepthrough.md
architecture-layers.md
audio-overlay.md
comparison.md
images.md
layout.md
math-concept.md
multi-scene.md
pipeline-flow.md
subtitles.md
text-animation.md
training-loop.md
transitions.md
voiceover-scaffold.md
references/templates/
comparison_template.py
data_flow_template.py
timeline_template.py
scripts/
_config.py
_fixup_client.py
add_audio.py
critic_pass.py

詳細

コンセプトから動画へ

Manim(Python)をプログラムによるアニメーションエンジンとして使用し、コンセプトから解説動画を作成します。

参考ファイル

ファイル用途
references/rules/pipeline-flow.mdRAG、ETL、CI/CD — 矢印を使った連続するステージのアニメーション
references/rules/architecture-layers.mdシステムスタック、ネットワーク層、抽象化の階層
references/rules/algorithm-stepthrough.mdソート、検索、グラフ探索 — 状態を保ちながら順を追って進めるアニメーション
references/rules/comparison.mdAとBの並列比較、前後比較、トレードオフの視覚化
references/rules/agent-interaction.md複数エージェント間のメッセージパッシング、分散システム、パブリッシュ/サブスクライブ
references/rules/math-concept.md方程式、数式、幾何学的証明 — デフォルトではLaTeXを使用しません
references/rules/training-loop.md勾配降下法、RLのループ、循環的な反復プロセス
references/rules/transitions.mdシーンのセクション間のフェードおよびワイプトランジション
references/rules/text-animation.mdテキストの置き換え、箇条書きの段階的表示、コールアウト、強調
references/rules/layout.mdキャンバスの座標、VGroupの配置、間隔のガイドライン
references/rules/audio-overlay.mdffmpegによる音声の重ね合わせ — BGM、ナレーション、複数トラックのミキシング
references/rules/voiceover-scaffold.mdタイミングスクリプトの生成、TTSへの引き継ぎ、ナレーションのベストプラクティス
references/rules/images.mdImageMobjectの使用、ロゴ/スクリーンショットのパターン、拡大縮小と配置
references/rules/subtitles.mdシーンのタイミングに基づくSRT生成、ffmpegによる字幕の焼き込み
references/rules/multi-scene.md複数のSceneクラス、ffmpegによる連結、チャプター単位の構成
references/templates/data_flow_template.pyパラメーター指定可能なパイプライン/データフローアニメーション(設定駆動のSTAGESリスト)
references/templates/comparison_template.pyパラメーター指定可能な並列比較(設定駆動のLEFT/RIGHT項目)
references/templates/timeline_template.pyパラメーター指定可能なタイムラインアニメーション(設定駆動のEVENTSリスト)
scripts/render_video.pyManim CLIのラッパー — 品質、形式、出力パスのクリーンアップを処理します
scripts/add_audio.pyffmpegのラッパー — 音声の重ね合わせ、音量、フェードイン/アウト、動画に合わせたトリミング

エンジンにManimを使う理由

Manimは「動画のSVG」です。アニメーションを宣言的に記述するPythonコードを書き、任意の解像度でMP4/GIFにレンダリングします。Pythonのシーンファイル自体が編集可能な中間生成物です。ユーザーはコードを確認して変更を依頼でき(「矢印を赤にする」「3つ目のステップを追加する」「トランジションを遅くする」など)、納得した後に最終的な高品質レンダリングを一度だけ行えます。このため、コンセプトから画像を作る際にHTMLを中間生成物として使うのと同様に、反復的で制御しやすいワークフローを実現できます。

ワークフロー

Concept → Manim scene (.py) → Preview (low-quality) → Iterate → Final render (MP4/GIF)
  1. 解釈 — ユーザーのコンセプトを解釈し、最適なアニメーション手法を判断します
  2. 設計 — 自己完結型のManimシーンファイルを設計します — 1ファイル、1つのSceneクラス
  3. プレビュー — 低品質(-ql)でレンダリングして、素早く反復します
  4. 反復 — ユーザーからのフィードバックに基づいてシーンを調整します
  5. エクスポート — scripts/render_video.pyを使って、高品質で最終動画を出力します

ステップ0:依存関係を確認する

シーンを書く前に、Manimがインストールされていることを確認します。

# System deps (usually pre-installed)
apt-get install -y libpango1.0-dev libcairo2-dev ffmpeg 2>/dev/null

# Python package
pip install manim --break-system-packages -q

次のコマンドで確認します:python3 -c "import manim; print(manim.__version__)"

ステップ 1:コンセプトを解釈する

最適なアニメーションパターンを決め、コードを書く前に該当するルールファイルを読んでください。

ユーザーの意図読むルールファイル主な Manim プリミティブ
パイプライン/フローを説明するreferences/rules/pipeline-flow.mdArrow, Rectangle, Text, AnimationGroup
アーキテクチャのレイヤーを示すreferences/rules/architecture-layers.mdVGroup, Arrange, FadeIn with shift
アルゴリズムを段階的に説明するreferences/rules/algorithm-stepthrough.mdTransform, ReplacementTransform, Indicate
アプローチを比較するreferences/rules/comparison.mdSplit screen VGroups, simultaneous animations
数学的なコンセプトreferences/rules/math-concept.mdMathTex, geometric shapes, Rotate, Scale
エージェント/複数システム間の相互作用references/rules/agent-interaction.mdArrows between entities, Create/FadeOut
トレーニング/最適化ループreferences/rules/training-loop.mdLoop with Transform, ValueTracker, plots
タイムライン/歴史references/templates/timeline_template.pyNumberLine, sequential Indicate
画像やスクリーンショットを埋め込むreferences/rules/images.mdImageMobject, SVGMobject
字幕やキャプションを追加するreferences/rules/subtitles.mdSRT generation, ffmpeg subtitle burn
複数の独立した章references/rules/multi-scene.mdMultiple Scene classes, ffmpeg concat
音声やナレーションを追加するreferences/rules/audio-overlay.mdffmpeg, scripts/add_audio.py
セクション間を移行するreferences/rules/transitions.mdFadeOut all, shift off-screen
テキストの表示、コールアウト、強調references/rules/text-animation.mdReplacementTransform, LaggedStart, Indicate
配置、間隔、レイアウトreferences/rules/layout.mdnext_to, arrange, to_edge, move_to

ステップ 2:Manim のシーンを設計する

テンプレート優先と一からの作成

シーンを一から作成する前に、パラメトリックテンプレートでコンセプトに対応できるか確認します。

コンセプトが...使用するテンプレート
線形パイプライン(A→B→C→D)references/templates/data_flow_template.py — STAGES を編集
2つの選択肢の比較references/templates/comparison_template.py — LEFT_ITEMS、RIGHT_ITEMS を編集
時系列のタイムラインreferences/templates/timeline_template.py — EVENTS を編集
その他該当するルールファイルを使って一から作成します

テンプレートを使用する場合は、作業ディレクトリにコピーし、先頭にある設定定数を編集してください。クラスの構造は変更しないでください。

基本ルール:

  • 単一ファイル、単一 Scene クラス:すべてを1つの .py ファイルに記述し、class XxxScene(Scene) を1つだけ含めます。
  • 自己完結型:どうしても必要な場合を除き、外部アセットは使いません。すべてに Manim のプリミティブを使用します。
  • 読みやすいコード:シーンファイル自体がユーザーの成果物です。わかりやすい変数名を使い、各アニメーションの区切りにコメントを付けます。
  • 意図を持った配色:Manim の色定数(BLUE、RED、GREEN、YELLOW など)または16進数の色を使用します。色数は最大4~5色にします。各色に意味を持たせます。
  • ペース配分:論理的なセクションの間に self.wait() を入れます。間を取る場合は0.5秒、大きな切り替えでは1~2秒にします。
  • テキストの読みやすさ:本文には最低でも font_size=36、タイトルには font_size=48+ を使用します。目標とする解像度で確認してください。
  • シーンの寸法:Manim のキャンバスはデフォルトで14.2 × 8単位(16:9)です。コンテンツは水平方向に±6、垂直方向に±3.5の範囲内に収めます。
アニメーションのベストプラクティス
# DO: Use animation groups for simultaneous effects
self.play(FadeIn(box), Write(label), run_time=1)

# DO: Use .animate syntax for property changes
self.play(box.animate.shift(RIGHT * 2).set_color(GREEN))

# DO: Stagger related elements
self.play(LaggedStart(*[FadeIn(item) for item in items], lag_ratio=0.2))

# DON'T: Add/remove without animation (jarring)
self.add(box)  # Only for setup before first frame

# DON'T: Make animations too fast
self.play(Transform(a, b), run_time=0.3)  # Too fast to read
構成テンプレート
from manim import *

class ConceptScene(Scene):
    def construct(self):
        # === Section 1: Title / Setup ===
        title = Text("Concept Name", font_size=56, weight=BOLD)
        self.play(Write(title))
        self.wait(1)
        self.play(FadeOut(title))

        # === Section 2: Core animation ===
        # ... main content here ...

        # === Section 3: Summary / Conclusion ===
        # ... wrap-up animation ...
        self.wait(2)

ステップ3:プレビューをレンダリングする

すばやく反復できるように、低画質でレンダリングします。

python3 scripts/render_video.py scene.py ConceptScene --quality low --format mp4

これは480p/15fpsでレンダリングされるため、タイミングやレイアウトをすばやく確認できます。動画をユーザーに提示してください。

ステップ4:反復する

よくある調整依頼とその対応方法:

依頼対応
「遅く/速くして」run_time= のパラメーターと self.wait() の時間を調整します
「色を変更して」色定数を更新します
「ステップを追加して」セクション間に新しいアニメーションブロックを挿入します
「順番を入れ替えて」コードブロックを移動します
「レイアウトを変更して」.shift()、.next_to()、.arrange() の呼び出しを調整します
「ラベル/注釈を追加して」.next_to() を使って Text または MathTex オブジェクトを追加します
「ループさせて」対応する開始状態と終了状態を追加します

ステップ5:最終版を書き出す

ユーザーが満足したら:

python3 scripts/render_video.py scene.py ConceptScene --quality high --format mp4
品質プリセット
プリセット解像度FPSフラグ用途
low480p15-ql高速プレビュー
medium720p30-qm草案のレビュー
high1080p60-qh最終納品
4k2160p60-qkプレゼンテーション品質
フォーマットのオプション
フォーマットフラグ用途
mp4--format mp4標準的な動画の納品
gif--format gifドキュメントやソーシャルメディアへの埋め込み
webm--format webmWeb 向けに最適化
出力の納品

次の両方を提示します。

  1. .py シーンファイル(後から編集するため)
  2. レンダリング済みの動画ファイル(最終成果物)

最終動画を /mnt/user-data/outputs/ にコピーして、提示してください。

ステップ 5.5:音声オーバーレイ(任意)

ユーザーが音声(音楽またはナレーション)を提供した場合、または音声をリクエストした場合:

# Background music at 25% volume with fade-in/out
python3 scripts/add_audio.py final.mp4 music.mp3 \
    --output final_with_audio.mp4 \
    --volume 0.25 --fade-in 2 --fade-out 3 --trim-to-video

# Voiceover at full volume, trimmed to video length
python3 scripts/add_audio.py final.mp4 voiceover.mp3 \
    --output final_narrated.mp4 --trim-to-video

録音前にナレーションの台本を作成する場合は、references/rules/voiceover-scaffold.md をお読みください。 字幕を作成する場合は、references/rules/subtitles.md をお読みください。 高度なマルチトラックミキシングについては、references/rules/audio-overlay.md をお読みください。

エラー処理

エラー原因解決策
ModuleNotFoundError: manimManim がインストールされていないステップ 0 のセットアップコマンドを実行します
pangocairo のビルドエラーシステムの開発用ヘッダーが不足しているapt-get install -y libpango1.0-dev
FileNotFoundError: ffmpegffmpeg がインストールされていないapt-get install -y ffmpeg
シーンクラスが見つからないクラス名が一致していないクラス名が CLI 引数と一致しているか確認します
オブジェクトが重なっている位置が計算されていない.next_to()、.arrange()、明示的な .shift() の呼び出しを使用します
テキストが切れているテキストが大きすぎる、または端に近い位置にあるfont_size を小さくするか、±6、±3.5 の範囲内に位置を調整します
レンダリングが遅いオブジェクトが多すぎる、または変形が複雑オブジェクト数を減らし、パスを簡素化して、低い品質設定を使用します
LaTeX ErrorLaTeX がインストールされていない(MathTex 用)代わりに Text を使用するか、texlive-latex-base をインストールします
LaTeX の代替手段

LaTeX が利用できない場合は、MathTex と Tex を避けてください。代わりに、Unicode の数式記号を使った Text を使用してください。

# Instead of: MathTex(r"\frac{1}{n} \sum_{i=1}^{n} x_i")
# Use:        Text("(1/n) Σ xᵢ", font_size=36)

エージェントモード(オプトイン)

デフォルトのワンショットモードは高速かつ低コストで、コーダーがコンセプトから直接 scene.py を作成します。レイアウトの正確さやアセットの解決が重要で、追加の LLM および VLM 呼び出しに見合う本番品質のレンダリングが必要な場合は、エージェントモードを使用してください。

パイプライン
concept
  └─► plan_storyboard.py ──► storyboard.json
            │
            ▼
      fetch_assets.py (optional)
            │
            ▼
      coder writes scene.py
            │
            ▼
      render_video.py --max-fix-attempts N
            │  ▲
            │  └─ LLM fixup loop (on failure, up to N retries)
            ▼
      critic_pass.py --critic
            │  ▲
            │  └─ VLM layout patch (1 call with M image blocks)
            ▼
       final MP4
フラグのリファレンス
スクリプトフラグデフォルト上限効果コストへの影響
render_video.py--max-fix-attempts03レンダリング失敗時に LLM が自動修正します。0 = 無効再試行ごとに LLM 呼び出しが 1 回増加します
critic_pass.py--critic無効—VLM による批評パスを有効にします。このフラグがない場合は noopVLM 呼び出しが 1 回増加します(N 個の画像ブロック)
critic_pass.py--critic-budget50000—批評呼び出しのトークン予算。超過するとエラーで停止します上限を設定します。予算の際限ない消費を防ぐために使用します
critic_pass.py--frames510批評用にレンダリング済み動画からサンプリングするフレーム数フレーム数が多いほど、批評実行ごとのトークンコストが高くなります
fetch_assets.py--adapternone—アセットのバックエンド:local、iconfinder、noneiconfinder は外部 API 呼び出しを追加します
fetch_assets.py--asset-dir——--adapter=local のルートディレクトリ。local 使用時は必須なし
コストのトレードオフ

修正ループでは、レンダリングに失敗するたびに LLM 呼び出しが 1 回追加されます。--max-fix-attempts 3 を指定すると、ループが終了するか成功するまでに、最大 3 回の追加呼び出しが発生する可能性があります。批評パスでは、N 個の PNG 画像ブロックを含む VLM 呼び出しが 1 回追加されます(デフォルトは 5 個、最大 10 個)。各フレームのトークン数は、base64 エンコードされた PNG の約 800 バイトにつき 1 トークンです。そのため、高解像度の複雑なシーンでは、コストが大幅に増加します。--critic-budget に控えめなトークン上限(例:20000)を設定すると、API 呼び出しの前に BudgetExceededError が発生するため、意図せずサイズの大きいリクエストに対して料金が発生することはありません。このエラーは明確に通知され、設計上、復旧できません。

呼び出しの例
# 1. Plan
python3 scripts/plan_storyboard.py "explain transformer self-attention" \
    --output storyboard.json

# 2. (Optional) Fetch assets
python3 scripts/fetch_assets.py storyboard.json \
    --adapter local --asset-dir ./assets --output resolved.json

# 3. Coder writes scene.py (Claude writes this from storyboard.json)

# 4. Render with auto-fix
python3 scripts/render_video.py scene.py AttentionScene \
    --quality high --format mp4 --max-fix-attempts 3 \
    --output final.mp4

# 5. Critic pass
python3 scripts/critic_pass.py scene.py final.mp4 \
    --critic --critic-budget 40000 --frames 5

エージェント型パイプラインの設計(ストーリーボードプランナー、自動修正ループ、VLM クリティック)は、Code2Video(arXiv 2510.01174、MIT)を基にしています。ベンダー提供のプロンプトテンプレートは、上流の LICENSE とともに references/code2video/ にあります。ベンダリングの記録、固定されたコミット、再同期ポリシーの詳細は、ルートの ATTRIBUTIONS.md で管理されています。

制限事項

  • Manim と ffmpeg が必要です — これらの依存関係がないとレンダリングできません。
  • 音声はレンダリング後にのみ追加できます — Manim は無音の MP4 をレンダリングします。エクスポート後に音声を重ねるには、scripts/add_audio.py を使用してください。
  • LaTeX は任意です — MathTex には LaTeX のインストールが必要です。数式には Unicode を使った Text を代わりに使用してください。
  • レンダリング時間は複雑さに応じて増加します — 多数のオブジェクトを含む 30 秒の 1080p シーンでは、レンダリングに 1~2 分かかることがあります。
  • 3D シーンには OpenGL が必要です — ThreeDScene はヘッドレスコンテナーでは動作しない場合があります。2D の Scene クラスを使用してください。
  • インタラクティブ性はありません — 出力は静的な動画ファイルであり、インタラクティブなウィジェットではありません。
  • GIF 出力は無音です — 音声を重ねられるのは、MP4/WEBM 出力形式のみです。

避けるべき設計上のアンチパターン

  • 画面に文字を詰め込みすぎる — ラベルは 3~5 語、最大 2 行に抑えます
  • すべてを一度に表示する — LaggedStart を使った段階的なアニメーションにします
  • タイミングを一律にする — run_time に変化をつけてリズムを作ります(単純な内容は速く、重要な内容は遅くします)
  • 視覚的な階層がない — サイズ、色、位置を使って視線を誘導します
  • 虹のような色使い — 意図的に選んだ色を最大 3~4 色にします
  • グリッドを無視する — arrange/align を使ってオブジェクトを一貫した位置に揃えます

コメント