Motion Diorama — 教育ビデオ制作スキル (v3.0 · 公開版)
基本原則: レンダリング前に確認し、その後に行うこと。 低コストで確認できるもの(タイムライン、スチルフレーム、テキスト幅)は、必ず先にパスしなければなりません。フル解像度レンダリングは、すべてのゲートが緑になった最後の一度だけ行います。
このファイルが核です。各モードのビジュアル詳細は
references/にあります — Mode Aはmode-a.md、Mode Bはmode-b.md、Mode Cはmode-c.md(このビデオの該当モードを、シーン構築前に必ず読むこと)。テストシナリオはevals/evals.mdにあります。scripts/内のスクリプトは、そのまま正確に実行すること — 機能を書き換えてはいけません。
固定された決定事項(スキル作成者による — 黙って変更しないこと;このスキルを使用して変更する場合は、意図的に変更すること)
- 3つのアクティブモード: Mode A(風景/歴史 + ライブマップバリアント)、Mode B(物体の分解 — 物体/機械の仕組み)、Mode C(解剖学 — 人体シリーズ)。モードはユーザーがビデオごとに開始プロンプトで選択します。セッションはフェーズ2の前にそのモードのリファレンスファイルを読みます。
- 目標: オーディエンスを構築すること。 デフォルトのクロージング = 結論(Mode A)/ コールバック(Mode C)+ フェードアウト。ビデオ内にシリーズカード/ラベルはなく、画面上にフェーズピルや位置インジケーターもありません(2026年11月13日、v2.8でのユーザー決定) — シリーズのアイデンティティはキャプションのみに存在します。コール・トゥ・バリューは、トピックが適切でユーザーがそのビデオで要求した場合にのみ、まれに使用します — 必須要素ではありません。販売CTAは禁止です。
- 数字/データ = ハイブリッド: 画面上の読み上げ(DOMオーバーレイ)がすべての数字の主要システムです。例外: ビデオごとに最大1つのゴールドの3Dヒーロー数字がシーン内に表示されますが、それはそのビデオのピーク数字のみです — そして同じ数字は必ず読み上げ/キャプションとしても表示されなければなりません。3Dバージョンは視覚的な強調であり、情報伝達手段ではありません。
- 最終尺は 30~60秒 で、音声に従います。
- 音声: このスキルは音声に依存しません — ユーザーが
public/narasi.mp3に提供する任意のMP3ナレーションを使用します。 - 音楽: ユーザーからのファイルは
public/musik.*に — 音楽を選んではいけません。 - 事実: ユーザーからの情報源が主要な参照であり、矛盾する場合は優先されます。セッションはウェブ調査で補完しても構いません。ただし、情報源を最終レポートに記載し、権威ある情報源(ジャーナル、機関、公式)を優先し、未検証の主張は必ず未確定としてマークすること — 推測を事実として提示してはいけません。
- 単一オペレーター: 1人。すべての成果物はセッション内のファイル(スチル、プレビュー、最終)として表示され、ダウンロード可能でなければなりません。
- 目標ペース: 1日1~2本のビデオ。効率性は設計上の要件です — スキャフォールド、プリミティブ、コンポーネントを再利用し、既存のものを再構築しないでください。
- ゲート — Mode Tinggalが公開版のデフォルト: セッションはユーザーの承認を待ちません。ゲート1(タイムラインサマリー)とゲート2(コンタクトシートスチル)は内部で実行されます: セッションは、このスキルの文書化された基準(バリデーターPASS + QCチェックリスト)に対して自身のフェーズ出力を評価し、最大2回の修正を試みてから続行します。決定はプロンプトの決定ブロックに従います(デフォルト: ナレーションが長すぎる場合は最大1.25倍の速度でテンポ調整、未検証の事実はレポートにマーク)。そのブロックで未回答の質問は、構築開始前に一度のメッセージでまとめて尋ねます — 途中で質問してはいけません。セッションは、ハードブロッカーの場合にのみ途中で停止できます: (a) 素材がないか壊れている、(b) トランスクリプトが作成不可能、(c) 最大テンポ調整後もナレーションが30~60秒の範囲外である。プロンプトが「Mode Tinggal: TIDAK」(いいえ)と明示している場合、クラシックゲートが適用されます — 2回のユーザー承認(フェーズ1後とフェーズ3後)と、証拠に基づくゲート2の緩和階段: 連続3回クリーンパス → シーンあたり1スチル、さらに3回 → 実績のあるシーンタイプではオプション。ゲート1は決して緩和されません。1回の主要なビジュアル修正で完全フォーマットに戻ります。すべての緩和は最終レポートに記録されます。
厳格な禁止事項
- シーンとしてAI画像/写真/2D/スプライト/外部テクスチャ/ダウンロードモデルを使用してはいけません。すべてのビジュアル = 手続き型Three.js 3Dジオメトリ。
- レターボックス禁止。カメラはネイティブ9:16。
- 動きは3D空間内のカメラのみ(本物のパララックス)。2D画像のズーム/パンで動きをシミュレートしてはいけません。
- 人間は、顔のない小さな暗いシルエットのみ。Mode Aの主被写体はクローズアップ禁止(風景のヒーロー動物/オブジェクトは最低8mのカメラ距離)— Mode Cではこの距離ルールは適用されません: ヒーロー臓器はフレームを埋めます。Mode Bでは、このルールはコンテキストステージのフレーミングにのみ適用されます — ラボステージのヒーローオブジェクトはフレームを埋めます(
references/mode-b.mdとreferences/mode-c.mdを参照)。 - すべてのシーンで1つのレンダラー、1つのマテリアルセット、1つのライトリグ。
- 単語数/ストーリーボードから尺を推測してはいけません。タイミングはオリジナル音声からのみ取得します(タイミングのセクションを参照)。
useFrame()、Math.random()、Date.now()、またはフレーム蓄積からのアニメーションは禁止 — すべての動きはuseCurrentFrame()と固定シードによる擬似乱数定数から導出されます。
タイミング — timeline.json が唯一の真実の情報源
public/narasi.mp3が存在することを確認します。存在しない場合: 停止し、ユーザーに通知します。音声が利用可能になる前にタイミングを決定してはいけません。- 以下の階層で単語ごとのタイムスタンプを取得します:
a. ユーザーが提供する場合、TTSのデフォルトタイムスタンプ(例: ElevenLabs with-timestamps)— 最も正確。
b. フォールバック Whisper: ラージモデルのみ、
language="id"を強制(自動検出しない)、Whisperは時間のみを提供 — 文のテキストはユーザーの公式スクリプトから取得し、トランスクリプト結果からは取得しない(インドネシア語ASRは数字や名前で誤認識しやすい)。 docs/timeline.jsonを以下のスキーマで作成します:
{
"fps": 30,
"audio_duration_s": 40.20,
"total_duration_s": 41.00,
"sentences": [
{"id": 1, "text": "…", "start_s": 0.00, "end_s": 3.68, "scene": 1}
],
"scenes": [
{"id": 1, "sentence_ids": [1, 2], "start_s": 0.00, "end_s": 6.44}
]
}
- マッピングルール: シーンの境界 = 次のシーンの最初の文の開始秒数。マッピングは文の内容に基づく — 尺を埋めるために文をグループ化してはいけません。実際のカットとタイムラインの差は0.3秒以下。
python3 scripts/validate_timeline.py docs/timeline.jsonを実行します。FAILの場合: タイムラインを修正し、繰り返します。FAILのまま続行してはいけません。- タイムラインサマリー(文の数、シーンマッピング、総尺)を作成し、以下の基準に対して自己評価します — これがゲート1です。Mode Tinggal: 停止しないでください。サマリーを最終レポート用に保存します。クラシックゲートモード: ユーザーに表示し、承認を待ちます。
total_duration_sは30~60秒でなければなりません。範囲外の場合: Mode Tinggal — プロンプトポリシーを適用します(長すぎる場合は最大1.25倍の速度調整、短すぎる場合はクロージングポーズを伸ばす)、レポートに記録します。それでも範囲外の場合、それはハードブロッカーです: 停止して報告します。クラシックモード: ユーザーに報告します — 黙ってカットやパッチを当ててはいけません。理由のない沈黙は禁止。クロージングでの0.3~1秒のポーズは許可され、合計に含まれます。
スタイルロック(要約 — 詳細は各モードの references/ にあり)
Mode A(詳細は references/mode-a.md)
- 半写実的なスタイリングされた3Dジオラマ: シネマティックな暖色パレット、固定された夕方のライトリグ、クリーンで滑らかなサーフェス、簡略化された背景。パレットはトピック/季節に合わせて調整可能。ライトリグとマテリアルは変更不可。
- トピックタイトル: 動くエスタブリッシングショットの上に、大文字のセリフタイポグラフィ。フック = ナレーションの最初の文(質問 / 神話への反論 / パラドックス)で、最初の約1.5秒以内にテキスト+音声+ビジュアルで提示。
- 字幕: 1単語ではなく、2~4単語のページ単位での単語ごとのカラオケ。アクティブな単語は太字、キーワードはアクセントカラー、下部の安全ゾーンに配置。
- データ読み上げ: ナレーションで数字が言及された瞬間にカウントアップするアニメーションカウンター + 小さなラベル + ポインターライン。後続の読み上げも同じスタイル。表示が許可される唯一の3Dテキスト: ピーク数字用の1つのゴールドヒーロー数字(固定された決定事項を参照)。
- カメラ: セグメント内での連続的な移動。ズームステップによる議論構造。事実のセグメント間のハードカットのみ、約0.1秒の黒フェードとして。
- ナレーション構造: システム/フローのトピックには「1つの流れを追う」を使用。1本のビデオで、デモンストレーションセグメントを持つ1つのトピックの2つの事実を含めることができます。
- クロージング: ビューティーショット + タイトル/時代のセリフ繰り返し + 結論文。黒にフェード。ビデオ内にシリーズのラベル/カードなし(v2.8)。(コール・トゥ・バリューは、このビデオで要求された場合のみ。)
Mode B — 物体の分解(詳細は references/mode-b.md)
- 2つの世界ステージ: Mode Aスタイルの暖色系コンテキストジオラマ(物体が生息地に完全な状態で表示) → 物体が分解される暗い技術グリッド背景のラボステージ。移行は連続ズーム(背景がフェード/アイリス)で、ハードカットなし。
- 1つのヒーローオブジェクトモデルが一度だけ手続き型で構築。爆発図と断面図は同じモデルから派生。
- タイトルカードなし(フック = コンテキストショットでのナレーションの最初の文)および永続的なHUDなし — ブレッドクラム、ズームカウンター、ミニマップ参照は破棄されます(リサーチ + v2.8の方向性による決定)。ナビゲーションは連続カメラ、リーダーラインラベル、瞬間的なフェーズタイトルから。
- 標準フェーズ: コンテキスト → ズーム + オブジェクトラベル → 分解(部品ラベルはインドネシア語 + 英語用語、ナレーションの順に出現) → 断面(プロセスがアニメーション + プロセス読み上げ) → 動作中(断面が動作、1つの流れを追う、プロセスラベル、セマンティックカラーコード化されたフローパーティクル) → 決定メカニズムのマクロ → カメラがズームアウトする際の一行原則ラベルのペイオフ。
- Mode Bのクロージング: 結論/原則の文 + 黒フェード。シリーズカード/ラベルなし(v2.8)。
Mode C — 解剖学(詳細は references/mode-c.md)
- ジオラマではない: 1つの光沢のある3Dヒーロー臓器が、暗い紫色のボケた虚空に浮かぶ。1つの臓器モデルが一度だけ構築され、すべてのシーンで使用。デフォルトのシリーズ名例: 「人体シリーズ」(あなたのシリーズ名に置き換えてください)。
- 絶対的なフローカラーコード: 青 = 酸素不足、明るい赤 = 酸素豊富 — このビデオ内でもシリーズ全体でも、決して逆にしてはいけません。細胞パーティクルは交換ポイントで、その文に正確に合わせて色が変わります。
- 必須の1つの流れを追う構造: カメラが1つのパケットを回路全体に導く。臓器 → システム → 顕微鏡 → 臓器 → 全身(シルエット)へのズームステップ。
- フック = 視聴者のリアルタイム参照 + 最初の1秒から臓器の視覚的鼓動と同期して動作するライブカウンター。セリフタイトルは約5~8秒後(フックの後)まで遅延され、事実の注釈が続きます。
- ステージピルやHUDなし(v2.8): フローの位置はカメラの移動から読み取れます。解剖学ラベルチップが臓器に貼り付き、その部分がアクティブになると点灯します。
- Mode Cのクロージング: アニメーション化されたファイナルカウンター + フックを反映するコールバック文。黒にフェード。シリーズカード/ラベルなし(v2.8)。グラフィックな血液描写や医療リアリズムは禁止。
テキストルール(重なり防止 — 改訂の第一位の原因)
- 読む必要のあるすべてのテキストはDOMオーバーレイ(Remotionコンポーネント)であり、WebGLキャンバス内のテキストではありません。唯一の例外: 固定された決定事項にあるハイブリッド3Dヒーロー数字 — それ以外の3Dテキストは禁止。
- すべてのテキストを、
@remotion/layout-utilsのmeasureText/fitTextで、フォントが読み込まれた後に測定します。fontSize = min(モードの制限、フィット結果)。最大幅はフレーム幅の90%。すべての辺に5%の安全マージン。プラットフォームの安全ゾーンを尊重(重要なテキストは上部±250px、下部±310pxを避ける)。 - テキストが読みやすさの下限サイズで収まらない場合: 2ページ/行に分割 — 読めなくなるまで縮小してはいけません。はみ出したままにしてはいけません。
- コントラスト: 明るい背景の上の明るいテキストには、暗いアウトライン/シャドウが必要。
- リーダーラインラベルも同じルールに従います。
音声
- ナレーションがマスタークロックです: すべてのシーン境界、キャプション、カウンター、カメラは
docs/timeline.jsonを読みます — 2番目のタイミングソースはありません。 - ユーザーファイルからの音楽は、ナレーションの下のベッドとして配置されます(シンプルなダッキング; 単語を覆い隠さない)。ユーザーからの音楽ファイルがない場合: 音楽をでっち上げてはいけません — ユーザーに通知します。
- 最終版は −14 LUFS にノーマライズ、ピーク ≤ −1 dB。
制作フロー(順序はスキップ不可)
- フェーズ0 — スキャフォールド: 既存のプロジェクトスキャフォールドを使用。レンダラー、カメラリグ、スタイルロック、プリミティブは書き換えません。リポジトリにRemotionプロジェクトがまだ含まれていない場合(初回プロダクション): このスキルパッケージリポジトリの
starter/フォルダからスキャフォールドを構築(動作が確認された正確なバージョンの依存関係を使用)、その後、既存のスキャフォールドとして扱います。 - フェーズ1 — タイムライン: タイミングのセクションに従う → バリデーターPASS → ゲート1(Mode Tinggalでは内部、クラシックモードではユーザー承認)。
- フェーズ2 — シーン構築
timeline.jsonとこのビデオのモードリファレンスファイル(references/mode-a.md、references/mode-b.md、またはreferences/mode-c.md)を読みます。 - フェーズ3 — スチルゲート: シーンあたり3つのスチル(シーン開始/中間/終了)+ コンタクトシートをレンダリング。Mode Tinggal: このモードのQCチェックリストに対してコンタクトシートを評価し、スチルフェーズ内で問題を修正(シーンあたり最大2回)、その後続行 — ユーザーを待たない。コンタクトシート + 評価リストを最終レポート用に保存。クラシックモード: 表示し、ユーザーの承認を待つ。スチルフェーズで修正 — ビデオで修正するよりもはるかに低コスト。
- フェーズ4 — プレビュー + セルフQC: 0.5スケールのプレビューをレンダリング、自身の出力に対して以下のQCを実行し、すべての問題を修正(変更されたシーンのみ再レンダリング)してから報告。
- フェーズ5 — 最終版: フル解像度で一度だけレンダリング。
bash scripts/check_output.sh out/<slug>-final.mp4を実行。ファイル + QCレポートをセッションに表示。
高速レンダリング(固定パイプライン)
- シーンごとにレンダリング:
out/scenes/scene-N.mp4。FFmpeg concat-c copyで結合(コーデック/解像度/fpsパラメータはシーン間で同一必須。一致しないと結合が壊れます)。 --concurrency= セッションのCPUコア数(nprocで確認)。デフォルトは使用しない。- プレビューは常に
--scale=0.5。フル解像度 1080×1920 はフェーズ5のみ。 - フレームあたりのコストを低く保つ: プリミティブジオメトリ、多数の要素にはインスタンシングなど。