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)。エンドツーエンドで実行する場合は、このファイルに従い、各ステージで必要なときにリファレンスを読み込んでください。
黄金律
- まず動画の言語を尋ねます。 他の質問、インストール、ファイル作成、編集の前に、動画の言語をユーザーに尋ねます(ステージ0)。以降のすべてのステップでその言語を使用します。ユーザーが書く言語でユーザーと会話します。
- ナレーションをそのまま保持します。 話し言葉を書き換えたり、追加、削除、並べ替えたりしないでください。各ショットは、画面に表示されている間に話されている言葉を説明します。
- 同じスタイル、新しい絵。 このスクリプトからセット、小道具、キャラクター、アクションを考案します。
examples/reaction-timeはAPIを学習するためだけに使用します。 - 言われていることを、文字通りかつ具体的に表示します。 抽象的な行は、ビジュアルメタファー、ダイアグラム、またはクローズアップのリアクションになります。
- ドラフト、確認、修正、そしてレンダリング。 完全なレンダリングの前に、自分でコンタクトシートとスチルを開いて(PNGを読んで)ください。レンダリングは遅く、確認は速いです。
- 3つのユーザーチェックポイント: セットアップの選択、レンダリングされたサンプルからのスタイル選択、および最終レンダリング前のプレビュー。ユーザーが不在の場合は、デフォルトを採用し、何を想定したかを述べて続行します。
- ファイルが真実です。 各動画は
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/フォルダに決して置かないでください。 - ストーリーに登場する人だけが画面に表示されます(ニュース/解説動画)。 チャンネルのマスコットやナレーター/ホストキャラクター(例:
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 |
3d | 3Dカートゥーンキャスト:白い平たい頭、洋ナシ型の体、細い手足 | rig3d.js、rig3d-cast.js(kind: '3d'、rig3d: true) | style-bible.md → 「2Dキャストまたは3Dキャスト」 |
toon | アウトラインのあるフラット2Dカートゥーン:丸い肌色の頭、豆型の体、棒状の手足、太いアウトライン、ラインの揺らぎ、コミックテキスト、ビジュアルギャグ、公人のカリカチュア;オプションで輝くトゥーンシェーディングされた3Dヒーロープロップ | toon.js、toon3d.js | style-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ショットのバッチで作業します:
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>', {...})を使用します。node render.mjs --project projects/<slug> --sheet --scale 0.5を実行してコンタクトシートを生成します。すべてのスチルを開いて確認し、問題があれば修正してから次のバッチに進みます。- すべてのショットが確認されたら、
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で再処理します。