Communitygithub.com

make-2d-video(2D動画生成)

ナレーション付きのアニメーションビデオを、シネマティックな棒人間スタイルで生成するスキルです。音声ファイルとスクリプトから、フルパイプライン(インストール、タイムスタンプ、ストーリー分割、スタイル選択、シーン構築、レンダリング、音楽、効果音、MP4出力)を実行します。

make-2d-video(2D動画生成) とは?

このスキルは、ユーザーが提供するナレーション音声とオプションのスクリプトを基に、コード(HTML Canvas + Three.js)で描画されたフルアニメーションビデオ(MP4)を生成するための完全なパイプラインを提供します。画像や動画生成AIモデルは使用せず、キャラクターの一貫性とテキストの鮮明さを保ちます。対応プラットフォームは主にClaude Codeで、Windows環境向けのバッチジョブ生成機能も備えています。3つの描画スタイル(デフォルトのシネマティック棒人間、3Dカートゥーン、トゥーンキャスト)から選択可能で、16:9または9:16、720pから4Kまでの解像度に対応します。パイプラインは段階的に実行され、各段階でユーザーの確認を挟みながら、インストール、音声認識(Whisper)、ストーリー分解、スタイル選択、シーン構築、レンダリング、音楽/SFX追加、最終MP4出力を行います。特に、ニュース解説動画向けの機能が充実しており、トゥーンキャストを使用した顔の特徴を捉えたカリカチュア表現や、出典付きのスクリプト作成、サムネイル生成、YouTubeアップロード前の品質管理までをカバーしています。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lynguyen9995/make-2d-video/tree/HEAD

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

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

ドキュメント

make-2d-video スタジオ:完全動画パイプライン

ナレーション(およびオプションのスクリプト)を、すべてのフレームがコード(HTML Canvas + Three.js)で描画され、ヘッドレスChromiumでフレームごとにキャプチャされ、ffmpegでエンコードされた完成済みMP4に変換します。画像や動画生成モデルは使用しないため、キャラクターの一貫性が保たれ、テキストは鮮明に表示されます。スクリプトごとに新しいビジュアルを考案し、固定されるのはスタイルのみです。

バンドルリソース(このスキルのベースディレクトリ):

  • kit/:テスト済みスタジオ(レンダラー、エンジン、ツール、オーディオ、examples/reaction-time リファレンスプロジェクト)。ワークスペースに make-2d-video-studio/ としてインストールします(references/install.md を参照)。
  • references/install.md:インストール、依存関係テーブル、doctor、セルフテスト。
  • references/style-bible.md:ルック(キャラクター、セット、ライト、カメラ、編集、グラフィック、9:16ルール、禁止事項)。ショットをデザインする前に必ず全文を読んでください。
  • references/style-bible-toon.md:トゥーンキャストのルック(cast: "toon")。キャストがトゥーンの場合、style-bible.md の該当部分(リムライト、アウトラインなし、黒いシルエット)の代わりにこれに従います。
  • references/story-breakdown.md:story/bible.md と story/shots.json の作成、およびペーシングルール。
  • references/engine-api.md:シーンAPI、設定、shots.json スキーマ、および3つのキットリファレンス。
  • references/sound-design.md:音楽計画、SFXライブラリ、アンビエンス、レベル。
  • references/render-qc.md:プレビューと最終レンダリング、速度ガイド、QCチェックリスト、トラブルシューティング。

このプラグインのステージコマンドは、1つのステージを再実行します:/new-video(ステージ1~4)、/video-styles(5)、/render-video(6と8)、/video-sound(7)。エンドツーエンドで実行する場合は、このファイルに従い、各ステージで必要なときにリファレンスを読み込んでください。

黄金律

  1. まず動画の言語を尋ねます。 他の質問、インストール、ファイル作成、編集の前に、動画の言語をユーザーに尋ねます(ステージ0)。以降のすべてのステップでその言語を使用します。ユーザーが書く言語でユーザーと会話します。
  2. ナレーションをそのまま保持します。 話し言葉を書き換えたり、追加、削除、並べ替えたりしないでください。各ショットは、画面に表示されている間に話されている言葉を説明します。
  3. 同じスタイル、新しい絵。 このスクリプトからセット、小道具、キャラクター、アクションを考案します。examples/reaction-time はAPIを学習するためだけに使用します。
  4. 言われていることを、文字通りかつ具体的に表示します。 抽象的な行は、ビジュアルメタファー、ダイアグラム、またはクローズアップのリアクションになります。
  5. ドラフト、確認、修正、そしてレンダリング。 完全なレンダリングの前に、自分でコンタクトシートとスチルを開いて(PNGを読んで)ください。レンダリングは遅く、確認は速いです。
  6. 3つのユーザーチェックポイント: セットアップの選択、レンダリングされたサンプルからのスタイル選択、および最終レンダリング前のプレビュー。ユーザーが不在の場合は、デフォルトを採用し、何を想定したかを述べて続行します。
  7. ファイルが真実です。 各動画は make-2d-video-studio/projects/<slug>/ に格納され、story/shots.json がすべてのタイミングを管理します。 1つの動画=1つの自己完結型フォルダ:config.json、input/、assets/(+ 未選択のAI画像用 assets/_raw/)、scenes/、story/(plan.md 引き継ぎメモを含む)、timeline/、jobs/(+ jobs/logs/)、build/(一時的、削除可能)、out/(納品物のみ)。 動画ごとのファイルをスタジオルートや別の _jobs/ フォルダに決して置かないでください。
  8. ストーリーに登場する人だけが画面に表示されます(ニュース/解説動画)。 チャンネルのマスコットやナレーター/ホストキャラクター(例:nhoc、ongdo)は、ユーザーが明示的に要求しない限り表示しません。ニュースに登場する名前のある人物にはそれぞれ独自のトゥーン(特徴的な髪型、眼鏡、服装。style-bible-toon.mdのカリカチュアルールに従う)と名前ラベルを付け、一般的なフィギュアやシルエットにしません。個人情報を特定できない人物(未確認の容疑者、家族)は匿名のままにします:役割ラベルを付けた汎用の名前なしトゥーンまたはシルエット。

チャンネルのデフォルト(channel.json)

ステージ0の前に、make-2d-video-studio/(スタジオを保持するワークスペースフォルダ)の隣、次にカレントフォルダ、次にこのスキルのベースディレクトリ(スキルと一緒に持ち運ばれるコピー;新しいマシンでは、インストールされたらスタジオの隣にコピーします)で channel.json を探します。name、lang、aspect、resolution、fps、style、cast(stick | 3d | toon)、captions、shotsPerMin、music を保持できます。 存在するすべてのキーがこの動画のデフォルトになります:そのキーが回答する質問(言語、アスペクト、解像度、fps、キャプション、ステージ5のスタイル選択)をスキップし、代わりに1行で確認します。例:「Kênh Tí Tò Mò: ベトナム語、9:16、1080p、30 fps、dusk、字幕あり」。 まだ不明なこと(ナレーション、スクリプト、タイトル)のみを尋ねます。name はエンドカード用のチャンネル名です。

3つの描画スタイル(動画ごとに1つの cast を選択)

castルックエンジンスタイルバイブル
stick(デフォルト)リムライトのある黒い棒人間、ムーディーなシネマティック2.5Dセットrig2d.js(+ 3D establishingショット用 three-kit.js)style-bible.md
3d3Dカートゥーンキャスト:白い平たい頭、洋ナシ型の体、細い手足rig3d.js、rig3d-cast.js(kind: '3d'、rig3d: true)style-bible.md → 「2Dキャストまたは3Dキャスト」
toonアウトラインのあるフラット2Dカートゥーン:丸い肌色の頭、豆型の体、棒状の手足、太いアウトライン、ラインの揺らぎ、コミックテキスト、ビジュアルギャグ、公人のカリカチュア;オプションで輝くトゥーンシェーディングされた3Dヒーロープロップtoon.js、toon3d.jsstyle-bible-toon.md

channel.json → cast で決定します。それ以外の場合はステージ1で1度尋ねます(スタイルごとに1行)。toon の場合、デフォルトのカラースタイルは paper です(シネマティックグレードも機能しますが、フラットカラーを暗くします)。トゥーンショットを書く前に examples/toon-demo/ を学習してください。

ニュース解説モード(トゥーンキャスト、チャンネルのメインフォーマット)

ユーザーがニュース/金融/テクノロジー/億万長者/投資資産の解説動画を依頼した場合、kit/CLAUDE.md(make-2d-video-studio/CLAUDE.md としてインストール)に従います。これは以下のステージ1~8を、ゲート付きワークフローに置き換えます: 0 トピック選択(3~5候補とソースの強度、リスク、有効期間)✋ → 1 ソース付きスクリプト+3つのタイトル+サムネイルコンセプト ✋ → 2a 音声と2b アセットマニフェスト(story/assets.md:何を描画するか、数、Flowで作成/ユーザーの画像AI/コードトゥーン/three.js + bloom)✋ → 3 画像+キャラクターシート ✋ → 4 タイミング+シーン → 5 全ショットのコンタクトシート+30秒デモ ✋ → 6 フルレンダリング → 7 パッケージ(サムネイル、出典付き説明、チャプター、期限切れリスト)✋ → 8 アップロード ✋ → 9 統計レビュー。 シーン画像:人物なし、テキストなし、ロゴなし。サムネイル:人物を含むことができます(様式化され、実際の人物のフォトリアルな偽造は禁止)かつ最大4語のテキスト。未監査のプロジェクトからYouTube Data APIを通じてアップロードしないでください(アップロードはプライベートにロックされます);YouTube Studioウェブサイトを通じてアップロードし、非公開/公開スケジュールで保存し、ユーザーの明示的な許可があった場合のみ公開します。 ローカルのClaude Codeセッションでは、すべてのコマンドを自分で実行します。Windowsシェルがない場合にのみ.batジョブを作成します。

ステージ0:動画の言語(常に最初)

channel.json に lang があれば、上記の1行サマリーで確認するだけで、尋ねる必要はありません。それ以外の場合、ファイルの作成、インストール、編集など他の何よりも先に、ユーザーの言語で正確に1つの質問をします。例:「Video này dùng ngôn ngữ nào? (ví dụ: Tiếng Việt, English, 日本語…)」。AskUserQuestion が利用可能な場合はそれを使用します。回答を待ち、ISO 639-1コード(vi、en、ja、ko、es、pt、de、fr、hi、…)にマッピングします。ユーザーがこの会話の前半で既に動画の言語を指定している場合は、再度尋ねずに1行で確認します。

言語コードはパイプライン全体を駆動します:

  • tools/new_project.py に --lang <code> として渡されます(config.json → lang に保存)。tools/transcribe.py は設定から読み取ります。
  • 画面上のすべてのテキスト(タイトルカード、ラベル、単位、標識、チャートキャプション、焼き込み字幕)はこの言語で、短く、正しく綴られ、完全なダイアクリティカルマーク付きで書かれます。話されているナレーションを翻訳したり変更したりしないでください。
  • フォント:レンダラーはラテン、ラテン拡張、ベトナム文字グリフを読み込みます;vi の場合、タイトルフォントは自動的にNunitoに切り替わり、アクセントが1つの一貫したフォントでレンダリングされます。バンドルされたフォントがカバーしないスクリプト(日本語、韓国語、中国語、アラビア語、ヒンディー語、タイ語…)の場合は、ユーザーに伝え、QC中にテキストのスチルを注意深く確認します。

ステージ1:受け入れ

言語が判明した後、一度に尋ねます(AskUserQuestion が利用可能な場合はそれを使用):

  • ナレーションファイル(必須)。まだ録音がない場合?VieNeu(MCPツールが接続されていれば)で作成します:文ごとに1つのクリップを合成します(01.wav、02.wav、…をフォルダ内に)、文を1行に1つずつ sentences.txt に書き込みます(オプションで |0.8 ポーズや |cham スローダウンマーカー、[cười]のような感情タグは行内に残します)、その後 python -I tools/join_segments.py <clip_dir> sentences.txt voiceover.wav。これにより、固定ポーズでクリップが結合され(VieNeuはスクリプト全体を与えられた場合、短い文をマージしてポーズを削除します)、voiceover.wav.script.txt、つまり --script として渡すクリーンテキストが書き出されます。

  • スクリプト: タイムスタンプ付き(SRT/VTT/JSON/TXT で [mm:ss] 形式)、プレーンテキスト(最適:オーディオに合わせて、正確な文言を保持)、またはなし(文字起こし)。

  • アスペクト: 16:9 または 9:16。

  • 解像度: 720p / 1080p(推奨) / 1440p / 2160p(4K)。高解像度はレンダリングにかなり時間がかかることを伝えます。

  • キャプション: デフォルトは9:16でオン、16:9でオフ。

  • 音楽: 生成、ユーザー自身のファイル、またはなし。効果音: オンまたはオフ。

  • タイトル。

  • キャスト(描画スタイル):stick / 3d / toon(channel.json に cast がない場合)。

カラースタイルについてはまだ尋ねません。デフォルト(channel.json に指定がない場合):16:9、1080p、24 fps、生成音楽+SFX、キャスト stick、スタイル dusk(トゥーンの場合は paper)。

ステージ2:スタジオのインストールまたは確認

references/install.md に従います:kit/ をワークスペースの make-2d-video-studio/ にコピーし(すでに存在する場合はスキップ)、依存関係をインストールし、python tools/verify_kit.py と python tools/doctor.py を実行し、その後サンプルのセルフテストを実行します。何がインストールされたかを短いリストで報告します。Windowsで、doctor が ffmpeg を winget フォルダにのみ見つけた場合、make-2d-video-studio/env.sh と env.ps1 を作成します;レンダリングとミックスコマンドの前に source env.sh && を付けてください(インストール前に起動したシェルは新しいPATHを認識しません)。

ステージ3:プロジェクト+タイムライン

make-2d-video-studio/ 内で実行します。python がPython 3でない場合は python3 を使用します。

使用可能なターミナルがないWindows(computer useはファイルエクスプローラーのクリックのみ可能): 各長いステップをユーザーがダブルクリックするジョブにします。tools/jobs/templates/full.ps1 + 2-full.bat を projects/<slug>/jobs/ にコピーします;すべてのジョブ .ps1 は $JobDir = $PSScriptRoot で始まり、..\..\..\tools\jobs\common.ps1 をドットソースします($P、Run、Py、Say、Fail、Done を提供し、jobs/logs/<name>.log + <name>.status = RUNNING / OK / FAILED を書き出し、Claudeが読み取れるようにします)。共有ヘルパー:tools/jobs/set_duration.py(ナレーションからconfig.jsonのdurationを設定)、tools/jobs/make_srt.py(timeline/sentences.json から out/<title>.en.srt を作成)。 Windowsでのスタジオインストール/修復:tools/jobs/setup-studio.bat。

python tools/new_project.py --name <slug> --voice "<voiceover path>" [--script "<script path>"] --aspect 16:9 --resolution 1080p --fps 24 --style dusk --title "<title>" --lang <code> [--captions]
  • タイムスタンプ付きスクリプト:python tools/parse_script.py --project projects/<slug> --script projects/<slug>/input/script.<ext>
  • プレーンスクリプト:python tools/transcribe.py --project projects/<slug> --script projects/<slug>/input/script.txt --lang <code> --model small。一致率は90%以上である必要があります;それ以下の場合、スクリプトとオーディオが異なることをユーザーに伝えます。
  • スクリプトなし:python tools/transcribe.py --project projects/<slug> --lang <code> --model small(低速マシンでは base、難しいオーディオでは large-v3)。

timeline/transcript.txt を確認し(その終了時刻がナレーションの長さに近いことを確認)、次に python tools/beats.py --project projects/<slug> を実行してビートシートとドラフトの story/shots.json を取得します。

ステージ4:ストーリー分解

references/style-bible.md(またはトゥーンキャストの場合は references/style-bible-toon.md)と references/story-breakdown.md を読みます。story/bible.md(ログライン、キャスト(各キャラクターに1つのシグネチャーカラー)、ムードとキーライトのあるロケーション、モチーフ、音楽計画、キャストが2D棒人間か3Dキャラクターかの指定)を作成します。scenes/cast.js を作成します。story/shots.json を書き換えます:連続したショット、フレーズの境界で0.1~0.2秒早くカット、新しいロケーションごとに establishing ショット、各ショットに具体的な scene 説明。ペーシング:9:16のショート動画は毎分30~40ショット(中央値1.5~2秒);長い16:9の解説動画は15~25ショット(中央値2~3.5秒)。channel.json → shotsPerMin が両方を上書きします。ユーザーに5~10行の計画サマリーを送信し、異議がなければ続行します。

ステージ5:スタイル選択

channel.json が style を固定している場合、それを使用し、ユーザーが要求しない限り比較グリッドをスキップします。 最も使用される1~2のセットと、代表的な3つのショット(2人以上のキャラクターがいるワイドショット、bigFace クローズアップ、データ/ブループリントまたは3Dショット)を構築します。その後、レンダリング:

node render.mjs --project projects/<slug> --styles dusk,midnight,golden,neon,storybook --at <t1>,<t2>,<t3> --scale 0.5

build/styles/style_grid.png を開き、スタイルごとに1行ずつ表示します:dusk(藤色の影、琥珀色のキーライト、クリーム色のリムライト)、midnight(冷たいネイビー、青白いリム、ソーダの常夜灯)、golden(暖かいオレンジとティール)、neon(深い黒、マゼンタとティール)、storybook(柔らかなパステル、低コントラスト)。選択を config.json → style に保存します。微調整の場合は、engine/styles.js の STYLES にカスタムエントリを追加し(ムードオーバーライドと grade(リフト/ガンマ/ゲイン、彩度、コントラスト、ビネット、グレイン、ブルーム))、その行を再レンダリングします。

ステージ6:すべてのショットを構築

references/engine-api.md と examples/reaction-time/scenes/ のサンプルシーンを一度読んだら。8~12ショットのバッチで作業します:

  1. scenes/sets/<location>.js(再利用可能で、GY = E.H * V(0.8, 0.68) と CX = E.W/2 に固定、壁、床、空をフレームの外側まで拡張)と scenes/shots/NN_<name>.js を書き、shots.json のIDに対して registerShot('<id>', {...}) を使用します。
  2. node render.mjs --project projects/<slug> --sheet --scale 0.5 を実行してコンタクトシートを生成します。すべてのスチルを開いて確認し、問題があれば修正してから次のバッチに進みます。
  3. すべてのショットが確認されたら、channel.json の設定でフル解像度で最終レンダリングを開始します。

ステージ7:サウンドデザイン

references/sound-design.md を読みます。音楽と効果音を適用します:

node render.mjs --project projects/<slug> --sound

これにより、out/<title>.mp4 が生成され、BGMとSFXがミックスされます。ユーザーが音楽ファイルを提供した場合は、それを input/ に配置し、config.json で参照します。

ステージ8:最終パッケージ

  • 最終MP4を確認し、必要に応じてキャプションを追加します。
  • out/ フォルダに、動画ファイル、サムネイル、説明文(出典付き)、チャプター情報を出力します。
  • YouTube Studio にアップロードするための手順をユーザーに提供します。

トラブルシューティング

  • レンダリングが遅い場合:解像度を下げるか、--scale オプションを使用します。
  • キャラクターが正しく表示されない場合:style-bible.md のキャラクターデザインルールを確認します。
  • 音声と映像の同期がずれている場合:タイムスタンプを再確認し、transcribe.py で再処理します。

関連スキル