IA Content Maker — ホワイトラベル動画生成機
このスキルは、エージェントを説明動画チャンネルの全チームに変えます。脚本、 アート、キャラクターの切り抜きとリギング、音声、アニメーション、BGM、 レンダリング、サムネイル、字幕。すべての動きは コード(フレームごとにキャンバスレンダリング)で記述されます。AIが生成した動画は使用しません。
ホワイトラベル: チャンネルのアイデンティティ(パレット、フォント、線、カード、トランジション、リズム、ナレーター)
は、チャンネルごとに一度コードによってランダムに生成され、dna.json に保存されます。
同じスキルを使っても、2つのチャンネルは異なる見た目になります。
エンジンは特定のパレットやフォント、テーマに依存しません。
任意のターミナルコマンドを実行できるエージェント(Claude Code、Codex、Gemini CLI、Cursor…)で動作します。
完全な元の仕様は referencia/especificacao-original.md にあります。このファイルは、
実践によって検証されたフローと変更点を記載しています。矛盾がある場合、このファイルが優先されます。
0. 作業の前に:ワークスペースを見つけるか作成する
コードはワークスペース(engine/、dna.json、videos/、library/ フォルダを含むディレクトリ)内で実行されます。
- 既存のワークスペースを探す(
engine/mv.pyと同じ階層にdna.jsonがあるかどうか;ユーザーが場所を指定する場合もあります)。 - 存在しない場合:
bash <skill-folder>/scripts/setup.sh [folder](デフォルトは~/ia-content-workspace)を実行。 venv、Kokoro、faster-whisper、Playwright/Chromium、OpenCV をインストールします。Python ≥3.10 と ffmpeg が必要です。 - ワークスペースはあるがスキルが新しい場合:同じ
setup.sh <workspace>を実行してください。engine/とtemplates/だけが更新され、dna.json、videos/、library/は決して更新されません。
以下のコマンドはすべてワークスペース内で、.venv/bin/python(以降は py)を使用して実行します。
1. チャンネルのセットアップ(一度だけ)
- 以下を確認する:チャンネル名(なければ、DNA抽選後にそれに合った名前を5つ提案する)、
主要フォーマット(縦型か16:9か)、利用可能な音声(無料のKokoro、ElevenLabs/その他、または自分で録音した音声)、
既存の
dna.jsonがあるかどうか(あればワークスペースにコピーする)。 py engine/mv.py dna—os.urandomのシードでDNAを抽選し、競合する組み合わせを解決し、 色のコントラストを検証し、dna.jsonとバックアップを保存し、フォントをダウンロードします。カードを表示する (py engine/mv.py cartao)。ユーザーは特定の要素を固定(--lock traço=indice)したり、 再抽選(py engine/roll_dna.py --reroll <traço>)できます。手動で要素を選択しないでください。dna.jsonに名前を保存 →channel.name。- 画像モデルを使わないアートルート:"Chunky rounded-square heads" という線のみがコード内に描画されています
(
engine/art/characters.py)。抽選で別の線が出た場合、または--lock build=3で固定した場合は、_head/_torso/_legsに従ってcharacters.pyに新しい線を実装するか、画像モデルを使用します。 - セットアップ後、チャンネルのDNAは固定されます。各動画では、動画固有の要素のみが再抽選されます。
2. 各動画 — ワークフロー
ユーザーの開始コマンド:「動画を作って:[テーマ]、[長さ]」(または "make a video: …")。
| # | ステップ | コマンド | ユーザーに表示して一時停止? |
|---|---|---|---|
| 1 | 動画フォルダ作成 + 動画固有の抽選(脚本の形式、フック、動機、サムネイルレイアウト、強調) | py engine/mv.py novo <slug> | — |
| 2 | videos/<slug>/script.txt に脚本(プレーンテキスト) + プラン数値(単語数、場所、キャラクター数) | ファイル作成 | はい:脚本+選択項目を表示し、OKを待つ |
| 3 | art.json + テーマに応じた新しいplates/tilesを engine/art/plates.py と tiles.py に作成 | ファイル作成 | — |
| 4 | アート → 切り抜き → リギング | py engine/mv.py arte <slug> | アートのコンタクトシートを表示 |
| 5 | 音声 + 単語タイミング | py engine/mv.py voz <slug> | 長さとwhisperの誤差を報告 |
| 6 | video.json + videos/<slug>/shots/01_story.js のショット(templates/shots_modelo.js をベースに) | ファイル作成 | — |
| 7 | コンタクトシート(2秒に1フレーム)→ 修正 → 繰り返し | py engine/mv.py contato <slug> | — |
| 8 | レンダリング + 音声 + QC | py engine/mv.py render <slug> | — |
| 9 | サムネイル | py engine/mv.py capa <slug> | — |
| 10 | ログ + 納品(動画、サムネイル、ハッシュタグ付き字幕) | py engine/mv.py log <slug> | はい:納品完了 |
コンタクトシート/スチル/レンダリングで --formato paisagem を指定すると1920x1080で生成され、デフォルトは縦型1080x1920です。
特定の時点を確認するには:py engine/mv.py stills <slug> 0,3.2,10.5。
2.1 サイズ(長さに応じたスケーリング)
- 単語数:Kokoro pt-BR(速い、1.0でも)で毎分約205語。遅い音声では約175語。
- 場所:分数 ×
pace.places_per_min(DNAから)。縦型では約3秒ごとにカット(毎分約20ショット)。 〜30%が大きなplate(キャラクターあり)、残りはクローズアップのtile(1クワッドあたり4つ)。 - 主要キャラクター:3分未満で1〜2人、3分以上で2〜3人。
- チャプター(脚本内の
##行):2分未満ではなし。5分までで3〜4、10分までで5〜8。 - レンダリング:
--partes 4(デフォルト)。3分以上の動画:4〜6パート。
2.2 縦型(Reels/TikTok/Shorts)— 検証済みデフォルト
- 冒頭とエンディングのジングルなし: 音声はフレーム0から始まります。
video.jsonにtitleもoutro_plateもなし。 (16:9ではDNAのジングルを使用。) - フレーム0は決して空にしない: フックはすでに画面に表示されている必要があります(write/numberでは
t0 = sh.start - 0.4)。 - すべてのショットは
sh.vert({ vw, vf })を呼び出します —referencia/motor.mdを参照。 - 字幕は縦型のみに焼き付けます(1〜3単語、発話されている単語を強調)。16:9には字幕はありません。
- セーフゾーン:右側50〜80%の高さ(アプリのボタン)と下部15%には重要なものを配置しない。 HUDは左側に、動機カウンターは右上に配置します。
- フックと構成:
referencia/retencao.mdに従ってください(保持率で検証済み)。
3. スタイルルール(譲歩不可)
- フラットベクター、輪郭線なし、最大1つの影(同じ色でより暗いもの)、グラデーションなし、 テクスチャなし、絵文字なし、チャンネルロゴなし、実在の人物の写真なし。
- 色:パレットの5色 +
dna.jsonの11のコードカラーのみ。ショット内ではENGINE.C.<cor>、ENGINE.font(px)、ENGINE.rgba(hex, alpha)を使用 — 固定のhexやフォント名は使用しないでください。 コード内のアートではROLE["ice"|"stone"|"pine"|"coal"|"berry"]を使用します(任意のパレットから計算された役割)。 - テキストは世界内のオブジェクト(黒板、看板、甲羅、カード、画面)にのみ表示 — 場所が情報を伝えられる場合は、 アートの上にカードを単独で配置しないでください。plateの空欄に書き込みます。
- 1秒以上静止状態は禁止。すべてのキャラクターは呼吸、まばたき、自分のセリフに合わせて演技します
(指さし、紹介、肩をすくめる、喜ぶなど)。DNAの
pace.new_thing_every_sごとに何か新しいものが必要です。 - 連続する2つのショットで同じ場所を使用してはいけません。ズームは元のピクセルの1.33倍以下。
- エントリーはスプリング/ポップ/パフ効果を使用し、単純なフェードは使用しません。間違ったアイデアには赤いバツ印。
4. アート
コードルート(デフォルト、無料): plates と tiles は engine/art/plates.py と tiles.py 内のSVG関数で、
(svg, meta) を返します。Plates: 1920x1080(世界座標)、空、中央に自由な床、meta には floor_y、blanks(コードが書き込む場所)、
portals(≥ 400 px、トランジションのズーム用)、anchors を含みます。Tiles: オブジェクトのクローズアップ、1クワッドあたり4つ
(make_art.py が白いガターで2x2を組み立て、切り抜き、metaを変換します)。マップ: 投影された経度/緯度の輪郭(pacific_map、brazil_map を参照)。
キャラクター: art.json 内の各キャラクターの辞書(パレットからの色、キャラクター間で変化する肌の色)。
画像モデルルート(オプション): referencia/especificacao-original.md(<art> セクション)のスタイルコアを使用して画像を生成し、
videos/<slug>/art/ に同じ名前で保存します。グリッド(*_grid.png)上で矩形を測定して meta JSONを記述します。
パイプラインの残り(切り抜き、リギング、アニメーション)は同じです。
シートはクロマキー背景(緑 #00B140、またはパレットに緑がある場合はマゼンタ)で、前面は腕なし。
5. 音声
- デフォルト:Kokoro(
mv.py voz)、DNAのナレーターテーブルからの音声、速度 1.0〜1.1(テンポ変更は不可)。 - より自然:既存のオーディオファイルを指定 →
py engine/mv.py voz <slug> --wav arquivo.wav(自分の声、ElevenLabs、Chatterbox…)。 脚本は話されるテキストと一致している必要があります。whisperがすべてを再同期します。 - 「速射砲」感を減らす:
--pausa-max 0.35 --pausa-manter 0.28。 voice.pyは、単語の5%以上が聞き取れなかった場合に失敗します — 音声をやり直してください。強制しないでください。
6. レンダリング前のチェック(コンタクトシート)
レンダリング前に修正する:空のまたははみ出した看板、顔の上のテキスト、黒い境界線、浮いている足、
連続する同じ場所、DNAの間隔の2倍以上新しいものがない区間、空のフレーム0、縦型で端で切れたテキスト、
DNAから外れたもの(フォント、色、カード、トランジション)。
レンダリング後、QCは計画外の1フレームのジャンプを指摘します — それぞれ調査します(stills)。
オーディオ:ゲートは音声が音楽+効果音より15dB以上大きいこと、背景が1%未満のフレームで最も大きいことを要求。
出力は-14 LUFS、ピーク-1 dB。
7. 納品
- 動画:
videos/<slug>/<slug>_vertical.mp4(または16:9では<slug>.mp4)とサムネイル。 - 字幕の準備完了:1行目=フック、2〜3文でテーマのキーワード(検索は字幕を読みます)、 コメントを促す質問、最大5つの関連ハッシュタグ(Instagramの制限)。
- 簡略化された事実や歴史のポピュラーバージョンについて注意を促す。
mv.py log <slug>— 動画固有の抽選は、過去5件の形式/フック/動機/サムネイルの繰り返しを防ぎます。
8. エンジンは動画ごとに改善される
バグや制限? engine/ 内を修正し(動画のファイルだけではなく)、教訓をスキルの referencia/licoes.md に記録します。
大きなパッチの前にショットのバックアップを取ります。長時間のレンダリング:再実行可能なパートに分割します。
参考文献
referencia/motor.md— ショットのAPI(S、sh.*、キャラクター、ポーズ、縦型カメラ)。referencia/retencao.md— フック構造、最終呼びかけ、リズム。referencia/licoes.md— 壊れたものすべてとその修正方法。referencia/especificacao-original.md— 完全な仕様(DNAの要素、リギング、アニメーション、サウンド)。workspace/exemplos/— 2つの完全な動画:el-nino(縦型、神話と現実)とprimeiro-cartao(16:9、時系列の物語)。 学習または再構築するには:videos/にコピーし、mv.py arte+mv.py contatoを実行します(words.jsはすでに準備されています)。