Sticky Director — AI映画監督プレイブック は何をしますか?
このリポジトリは、ローカルアニメーション&無声映画エンジンです。リグされた黒いシルエットのキャラクター(グレーのフーディー着用)が、写真(例:Google Flow画像)の前で演技し、音楽、環境音、カメラワーク、キャプションが付きます。MCPツール(.mcp.json で sticky-studio → node mcp-server.js を登録)または CLI(node cli.js …)を通じてディレクションします。どちらも自動的に server.js を起動し、キャンバス操作でスタジオが開きます(ディスプレイがない場合はヘッドレスChromium)。
必ず絶対ファイルパスを渡してください。以下のすべてのIDは検証されます。未知の値は
warningsとして返され、適用されません。必ず警告を確認してください。
Antigravity からの実行:
sticky-studioMCPツールが利用できない場合は、リポジトリルートからCLIを使用してください。すべてのMCPツールにはCLIの双子(下記テーブル)があり、node cli.js snapshot <t> <abs.png>でPNGを書き出し、それをビジョンで開けます。すべてのコマンドは自動的にスタジオサーバーを起動します。
ツール (MCP) ↔ CLI
| MCPツール | CLI | 機能 |
|---|---|---|
sticky_status | node cli.js status | モード、アスペクト比、尺、BPM/拍数、接続タブ、シーン一覧を表示 |
sticky_get_project | node cli.js get-project [out.json] | フラットなエージェント形式でプロジェクト全体を取得(シーン、fxMarkers、mediaCards、audio.beats/strongBeats、背景 + lightProfile) |
sticky_load_audio | node cli.js load-audio <path> --mode silent | 音楽/ナレーションを読み込み → {duration, bpm, beats[], strongBeats[]} を返す |
sticky_import_photos | node cli.js import-photos <p1> <p2> … [--auto-build] | 写真を登録 → [{bgId, name, path, width, height, lightProfile}] を返す |
sticky_apply_template | node cli.js template <id> [--no-photos] | 音声と写真にフィットした無声映画のストーリーボードを読み込む |
sticky_set_project | `node cli.js set-project <file.json | '{…}'>` |
sticky_update_scene | `node cli.js update-scene <index | id> '{…}'` |
sticky_split_scene | node cli.js split <timeSec> [--no-snap] | 指定時刻で分割(最も近いビートにスナップ:±0.35秒) |
sticky_add_fx | node cli.js add-fx <type> <timeSec> [--duration s] | カメラパンチ / SFX / card を追加 |
sticky_render_frame | node cli.js snapshot <timeSec> [out.png] | 正確なフレームをPNGで出力(MCPでは画像としても返す) |
sticky_export_mp4 | node cli.js export | リアルタイムレンダリング → exports/sticky_video_*.mp4(60 fps H.264 + AAC) |
get_status、get_project、set_project、update_scene は スタジオタブが開いていなくても動作します。projects/live_state.json を読み書きし、スタジオが接続時にそれを読み込みます。
リファレンスID
感情 (10種類)
| ID | 用途 |
|---|---|
neutral | デフォルト、穏やか |
happy | 温かみ、安堵、小さな成功 |
tired | 午前3時、燃え尽き、疲労 |
crying | 悲嘆、崩壊(silentMouth: quiver と組み合わせる) |
angry | フラストレーション |
shocked | パニック、気づき |
skeptical | 疑問、横目 |
confused | 「?」な瞬間 |
excited | ハイテンション(星の目) |
deadpan | 虚無感、無感覚 |
ジェスチャー (18種類) — gesture
| ID | 説明 | 最適なビュー |
|---|---|---|
pocket | フーディーのポケットに手を入れる(デフォルトのくつろぎスタイル) | any |
idle | リラックスした腕(歩くときに振る) | any |
talking | 音声に反応するハンドビート(ナレーション時) | front |
explain | 両手のひらを広げる | front |
point_screen | 横を指す(メディアカードに向かって) | front |
point_viewer | カメラを指す | front / 3/4 |
crossed | 腕を組む | front |
facepalm | 手で顔を覆う | front |
hands_head | 両手を頭に(パニック) | front |
shrug | 肩をすくめる、手のひらを上に | front |
wave | 手を振る挨拶 | front |
typing | 机に座ってタイピング(机とスツールが描画される) | 自動 3/4–サイド |
slouch_lonely | 深く前かがみ、頭を垂れ、ゆっくりとした重い呼吸 | front / 3/4 |
heavy_sigh | 4.5秒のサイクル:吸気 → ホールド → 崩れる(自動呼吸フォーリー) | front / 3/4 |
check_phone_dark | 光るスマホを保持;顔とフーディーに青色の光の円錐 | front / 3/4 |
sit_curb_hug_knees | 地面に座って膝を抱え、頭を下げる | 自動 3/4 |
look_back_horizon | 立ち、景色を見つめ、風がフーディーをなびかせる | back / 3/4 |
pull_hood_up | アクション:後ろに手を回してフードをかぶる(シーン開始から約2.3秒) | front |
ボディ & ポーズのキー
| キー | 値 |
|---|---|
pose | rig(関節あり、デフォルト)・v1スプライト:front, bust, side, back |
view | front, threeQuarter, side, back |
hoodUp | true / false(フードはすべてのビューに描画;背面ビューはデフォルトでアップ) |
walkSpeed | 0 静止 ・ 0.1–1.0 歩行 ・ 1.1–2.5 ジョギング → 全力疾走 |
walkDir | left, right |
walkInPlace | true(その場で歩く)/ false(フレーム内を移動、画面外に出ると反対側から出現) |
wind | 0..1(裾、ドローストリング、フード) |
silentMouth | closed(デフォルト)・ sigh ・ quiver(泣く/不安) |
handLeft, handRight | auto, relaxed, open_palm, pointing, fist, holding_prop, in_pocket |
prop | none, phone, mug, mic, controller, book |
spineLean, headTilt, headNod | 度(≈ −25〜25;headNod + は下を向く) |
ikPins | `{ rightHand |
x, y, scale, flipX | 位置 0..1(x 0.5 = 中央;y ≈ 0.55 = 下3分の1に立つ)、サイズ(1 = デフォルト)、ミラー |
motion | breathe(サイレント時のデフォルト)、talk_bounce、walk、shake(震え)、float、none |
emotion | 上のテーブルを参照 |
背景 — background
ビルトイン:paper_sketch、cozy_night、rainy_window、streetlight(真夜中の街灯)、classroom(夕日の机)、dark_spotlight、rooftop_dusk、green_screen。
写真:sticky_import_photos が返す bgId を使用するか、または絶対パスの写真パスを background に直接入れても構いません(自動でインポートされます)。
写真カメラ & 深度
| キー | 値 |
|---|---|
kenBurns | none、push_in、pull_out、drift_left、drift_right、breathing(写真は100%、キャラクターは30%動く → パララックス) |
foreground | none、bokeh、rain_streaks、window_reflection |
camera | static、zoom_in、zoom_out、pan_right、handheld(kenBurns の上に適用) |
atmosphere | dust(音楽のビートで光る)、rain、none |
dutchScene / spotlightScene | シーン全体の傾いた地平線 / 背景が60%暗くなる |
ライトマッチ(写真調和) — lightMatch
true = 推奨(tint 0.35, rim 0.55, exposure 0.5)・ false = オフ ・ 数値 0..1 = 全体の強さ ・ または { tint, rim, exposure, side }。side は auto(写真から自動) | left | right | back(逆光、両エッジ)。
すべての写真シーンで true を使用してください。 夕日や逆光の地平線では rim(0.7–0.9)を上げ、look_back_horizon では side: "back" を使用します。
トランジション(シーンの入り方) — transitionType、transitionDur(0–2秒)
cut ・ dissolve(両方のショットをライブでレンダリングしブレンド) ・ fade_black(時間経過、孤独) ・ fade_white(フラッシュバック、気づき、希望)。シーン0で dissolve または fade_black を使うと、黒からフェードインします。fadeOutEnd: true で映画の最後を黒にフェードアウトします。
アンビエントBGM(連続、シーンごと) — ambientBed、ambientVol 0..1
| ID | ムード |
|---|---|
none | — |
rain_window | 柔らかな雨 + 遠くの雷(足音も濡れた感じに) |
night_wind | 孤独な真夜中の風 |
vinyl_crackle | 温かみのあるローファイノイズ |
clock_ticking | 60BPMの残響のあるチクタク:午前3時、不眠、虚無感 |
heartbeat | 深くこもった心拍:不安、パニック |
crowd_muffle | ローパスされたざわめき:人混みの中の孤独 |
FXマーカー — sticky_add_fx / fxMarkers: [{type, timeSec, …}]
- カメラパンチ:
snap_zoom(1.0→1.25倍、顔にバネのようにズーム)、dutch_tilt、shake、spotlight(+duration、intensity0..3、dir±1(ダッチ用)) - SFX / フォーリー (10種類):
whoosh、pop、vine_boom、record_scratch、shutter、typing、footstep_wet、heavy_sigh_breath、phone_vibrate、door_close_echo(+volume) - シーンには
transitionSfx(カット時に再生されるSFX)とfoley: true(各かかと着地時に自動で足音 + ため息呼吸;サイレントモードではデフォルトでオン)も設定可能 - メディアカード:
type: "card"で、card: {kind: image|meme|post|note, text, imagePath, side: auto|left|right, hold, size}
プロジェクトレベルのキー(sticky_set_project)
| キー | 値 |
|---|---|
mode | silent(音楽のみ、口は決してリップシンクしない)・ voiceover |
aspectRatio | 16:9 ・ 16:9-letterbox(2.35:1シネマバー) ・ 9:16(Shorts / Reels / TikTok、720×1280) |
fadeOutEnd | true または秒数 |
masterAmbientVol | 0..1 |
captionStyle | cinematic(無声映画のセリフ体)、pop、karaoke、classic、off、または `{mode, highlight, position: bottom |
snapToBeats | デフォルト true:カットは最も近いビートにスナップ |
scenes | フラットなシーンオブジェクト。タイミング:すべてのシーンに start/end を与えるか、どちらも与えずに duration / weight(音楽に合わせて分散)を使用 |
fxMarkers | 上記参照 |
mediaCards | `[{sceneIndex |
テンプレート — sticky_apply_template
loneliness_3am(暗闇でスマホ → フードをかぶった雨の散歩 → 縁石にひざを抱えて座る → 夜明けの地平線) ・ social_anxiety(隅で前かがみ + 群衆のつぶやき → 心拍でパニック → 外に出て風に当たる → 安堵のため息) ・ burnout(机でタイピング → 時計で虚ろなまなざし → 黒にフェード → 雨の散歩) ・ discipline(疲れた起床 → フードをかぶる → 1.2倍ジョギング → 2.0倍で日の出へ全力疾走)。
ディレクションワークフロー
- 見て、聴く。 ユーザーの写真をビジョンで確認し(画像ファイルを読む)、感情のアーク(例:孤立 → 限界点 → 解放 → 希望)を決定します。
sticky_load_audio {path, mode: "silent"}で音楽を読み込み、duration、bpm、strongBeats(最適なカットポイント)に注意します。 - 写真をインポートしてマッピングする。 ストーリー順に
sticky_import_photos {paths: [...]}を実行します。各lightProfile(tone暖かい/冷たい、brightness、lightFrom)を使用してビートを選択します。暗く冷たい部屋はcheck_phone_dark/slouch_lonely+clock_tickingに適しています。雨の通りはフードをかぶったpocketの散歩 +rain_window+rain_streaksに適しています。夕日とスカイラインはlook_back_horizon(背面ビュー、lightMatch {rim: 0.8, side: "back"})+night_windに適しています。 - ストーリーボードを構築する。 1回の
sticky_set_project呼び出しで:mode: "silent"、captionStyle: "cinematic"、fadeOutEnd: true、そして写真ごとに1シーン。各シーンにbackground(パスまたはbgId)、gesture、emotion、view、hoodUp、kenBurns、lightMatch: true、ambientBed、transitionType(最初のシーンはfade_black、ほとんどはdissolve1.0–1.5秒、時間の飛躍にはfade_black、希望への転換にはfade_white)、短い詩的なsubtitle(8語以下、または空)、そしてweightを強調のために設定します。いくつかのfxMarkers(phone_vibrate、door_close_echo、感情のピークにsnap_zoom)を追加します。結果のwarningsを確認します。 - 視覚的に検査する。 2~3の重要なタイミングで
sticky_render_frameを実行:最初のシーン内(フェード後、約1.5秒)、映画の中盤、クライマックスで。キャラクターが完全にフレーム内に収まり地面に立っていること(y、scale、xを調整)、リムと色合いが写真に合っていること(lightMatchを調整)、キャプションが読めてカードに隠れていないこと、顔がカードで隠れていないことを確認します。sticky_update_sceneで修正し、再レンダリングします。 - 書き出す。 ユーザーの準備ができたら
sticky_export_mp4で書き出します。所要時間は映画の長さ+エンコード時間程度です。mp4Pathを報告します。
感情的な無声短編のためのテイストガイド
- ショットは少なめで長めに(4~8秒)。
strongBeatsでカットします。heavy_sighとslouch_lonelyは少なくとも1サイクル以上(≥ 4.5秒)の余裕を持たせます。 hoodUp: true= 引きこもり / 雨 / 不安;フードを下ろす = 開放感、安堵。walkSpeedは憂鬱な散歩には 0.4–0.6、決然としたジョギングには 1.2、クライマックスの全力疾走には 2.0+ のみ使用します。- 感情と口をペアにします:
crying+quiver、tired+sigh。サイレントモードでは決してtalkingを使用しません。 - シーンごとに1つのアンビエントベッドを 0.4–0.8 の音量で使用します。カットに合わせてベッドを変更し、新しい場所を示します。
9:16の場合は、x≈ 0.5、scale0.9–1.1 を維持します。キャプションとカードは自動的に位置が調整されます。
ストーリーボードの例
{
"mode": "silent", "aspectRatio": "16:9-letterbox", "captionStyle": "cinematic", "fadeOutEnd": true,
"scenes": [
{ "title": "3 AM", "background": "/abs/photos/bedroom.jpg", "gesture": "check_phone_dark", "emotion": "tired",
"kenBurns": "push_in", "lightMatch": true, "ambientBed": "clock_ticking", "transitionType": "fade_black", "transitionDur": 1.2, "subtitle": "3:07 AM." },
{ "title": "雨の散歩", "background": "/abs/photos/street.jpg", "gesture": "pocket", "view": "threeQuarter", "hoodUp": true,
"walkSpeed": 0.55, "walkInPlace": false, "x": 0.25, "foreground": "rain_streaks", "ambientBed": "rain_window",
"lightMatch": true, "transitionType": "dissolve", "transitionDur": 1.2, "weight": 1.2 },
{ "title": "夜明け", "background": "/abs/photos/sunset.jpg", "gesture": "look_back_horizon", "view": "back", "wind": 0.6,
"lightMatch": { "rim": 0.8, "side": "back" }, "kenBurns": "pull_out", "ambientBed": "night_wind",
"transitionType": "fade_white", "subtitle": "それでも太陽は昇ってきた。" }
],
"fxMarkers": [ { "type": "phone_vibrate", "timeSec": 0.8 } ]
}