promoshot について
promoshotは、PromoShotの.promoプロジェクトを作成、確認、レンダリングするヘッドレスエンジン兼MCPサーバーです。CLI、アプリ、ヘッドレス環境で共通のプロジェクト形式を使いたいエージェントや制作者向けです。
主な機能
- 01レイヤーとキーフレームの作成・編集
- 02プロジェクトファイルの検証と確認
- 03静止画・フレーム・GIF・動画のレンダリング
- 04メディア、シーン、無音区間の分析
- 05字幕とナレーションの生成
- 06編集コマンドの一括適用
活用シーン
- 01画像や動画素材からプロモーション動画を作成
- 02キーフレームでレイヤーをアニメーション化
- 03ヘッドレス環境でプロジェクトをレンダリング
- 04タイムライン構成前に素材を確認
MCP 対応
promoshot-mcpはstdioで通信し、プロジェクトの作成、確認、レンダリング用ツールを提供します。レンダリングはpromo CLIに委ね、共通のレンダリングインターフェースとして利用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/garalex/promoshot-mcp:v0.4.7ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/garalex/promoshot-mcp:v0.4.7stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
promoshot
動作を見る: demo.md — 技法のプロンプトと自由形式のクリエイティブブリーフを、それぞれスキルと MCP だけを与えた新しいエージェントに渡し、その結果を手作業で作成した参考例と並べています。デモ一式は demos/ にあります。
PromoShot
(App Store)
を支えるレンダリングエンジンであり、そのプロジェクト形式をオープンに実装したものです。.promo プロジェクトはフォルダーで、metadata.json とメディアファイルで構成されます。このワークスペースには、プロジェクトを検証、調査し、静止画、画像シーケンス、または音声をミックスした mp4 にレンダリングするために必要なものがすべて含まれています。アプリは不要で、アプリに搭載されているものとバイト単位で同一のコンポジターを使用します。
設計の要は、形式そのものがインターフェースであることです。アシスタント、スクリプト、または人が metadata.json を作成すると、エンジンはどこでも同じようにレンダリングします。Mac および iOS アプリ(Metal + VideoToolbox)、このリポジトリの CLI、GPU のないヘッドレス Linux マシン(lavapipe 上の wgpu、サブプロセスとしての ffmpeg)のいずれでも同じです。この形式には、ひとつの真実を示す 3 つの側面があります。4 つの検証済みレシピを備えたオーサリング用サブセット(promo schema)、ドキュメント全体(--full)、パーサー自身の構造体から生成される型のみの JSON Schema(--types)です。そしてバリデーターが実行するパーサーはレンダラーが使用するパーサーと同じなので、「検証できる」とは「レンダリングできる」ということです。
もうひとつの PromoShot ではありません
これは Alexander Garmash による PromoShot のオープンエンジン(および App Store アプリ)です。画面収録、動画、写真向けの、レイヤー/キーフレーム/タイムラインを備えた本格的なエディターです(Mac 版があり、iPhone と iPad でも同じ .promo プロジェクトを開けます)。
スクリーンショットをテンプレート動画に変換する、同じような名前の App Store アプリ(たとえば「PromoShot: Screenshot to Video」)とは異なります。キーフレーム、マスク、GPU コンポジット、オープンな .promo 形式をお探しなら、こちらです:promoshot.app · App Store。
製品情報/PAD
一般向けアプリ:promoshot.app · App Store。ソフトウェアディレクトリでは、次の PAD 4.0 ファイルを取り込めます。
https://raw.githubusercontent.com/GarAlex/promoshot/main/promoshot.pad.xml
Crates
| Crate | 担当する機能 |
|---|---|
promo-model | 形式:ワイヤー構造体、マイグレーション、パレットのロール、schema.md |
promo-timeline | タイムライン計算:キーフレーム、トリム、アタッチメント、待機、検証 |
promo-gpu | wgpu コンポジット:四角形、境界線、レターボックス、ベクター、色変換 |
promo-text | キャプションのシェイピングとエフェクト(cosmic-text) |
promo-engine | プレビュー/エクスポートのオーケストレーション、フレームキャッシュ、メモリー管理、PCM ミキサー |
promo-media | デコーダー/エンコーダーのトレイトレジストリ、ffmpeg サブプロセスバックエンド+適合性テストスイート |
promo-editor | ドキュメントの編集語彙:取り消し機能付きコマンド、ウィザードの配置、テーマルール。promo_apply と promo_slideshow の基盤 |
promo-cli | promo — コマンドラインからプロジェクトをレンダリング |
promoshot-mcp | エージェント向けの stdio 経由 MCP サーバー |
ビルドと検証
./check-all.sh # fmt, clippy -D warnings, all tests, release build
動画のレンダリングには、PATH 上に ffmpeg(および ffprobe)が必要です。フレームは GPU 上でコンポジットされ、そのままパイプで渡されます。ffmpeg が行うのはデコードとエンコードだけです。ヘッドレス Linux マシンでは、GPU として mesa-vulkan-drivers(lavapipe)があれば十分です。
CLI
cargo build --release -p promo-cli # -> target/release/promo
promo schema # authoring subset + recipes; --full, --types
promo validate <project> [--strict] # "NOT OK" lists what will not render; --strict exits 1 on any finding
promo inspect <project> # canvas, layers, missing media, undefined colours
promo upsert-keyframe <project> --args '{"layer":"bg","time":2,"zoom":1.2}'
# the MCP authoring tools as verbs (init, upsert-layer,
# upsert-keyframe, apply, slideshow, explain, diff)
promo still <project> --out f.png --time 2.5
promo frames <project> --out frames/ --fps 30 --from 0 --to 4
promo video <project> --out out.mp4 --fps 30
任意のプロジェクトコマンドに --json を追加すると、機械処理向けの出力になります。標準出力にはエラーを含む単一のオブジェクトが出力され、終了コードは変わりません。
promo video はアプリと同じ方法でサウンドトラックをミックスします。トリミングとメディアのカット、フレームの保持、ピッチを維持した速度変更、キーフレームによる音量調整、ナレーションを際立たせてその下のすべての音を小さくするダッキング、そしてプロジェクトに残すオーディオトラックのみを使用します。
ヘッドレスレンダリングはクリーンです。ウォーターマークはなく、ライセンス、シリアル番号、キーを求められることもありません。(Mac および iOS アプリでは、無料プランのレンダリングにウォーターマークが付きます。これは App Store の Pro プランに関するもので、こちらには影響しません。)
MCP サーバー
promoshot-mcp は stdio 経由で Model Context Protocol を使用するため、あらゆる MCP クライアントからプロジェクトの作成、確認、レンダリングができます。レンダリングコードは持たず、すべてのレンダリングは promo に委ねられます(実行ファイルの隣、PATH 上、または --promo で指定した場所から検索します)。これにより、CLI が唯一の契約として保たれます。
エージェントを接続する
必要なのは、MCP サーバー(ツール)とスキル(ワークフロー)の 2 つです。 どちらも特定のベンダーに依存しません。エージェントがこのリポジトリを自動で見つけることはありません。
アプリは PromoShot 3.0 以降でこのエンジンが書き出したファイルを開けます。App Store 版の 2.3.1 は minReaderVersion 17 までのプロジェクトを読み込みます(ネストされたコンポジションと 3D には対応していません)。また、--mcp-stdio では起動できません。
1. ビルドする(またはしない)
cargo build --release -p promo-cli -p promoshot-mcp
# binaries: target/release/promo target/release/promoshot-mcp
scripts/install-local.sh # …and on PATH, linked from target/release,
# so every later build is what runs
Rust ツールチェーンがない場合は、Releases からビルド済みの 2 つの実行ファイルを入手するか(linux-x64、macos-arm64。各リリースアセットの sha256 はリリースに記載されています)、イメージを取得してください。
docker pull ghcr.io/garalex/promoshot-mcp — どちらにも promo と promoshot-mcp が含まれています。
両方を PATH に追加するか、サーバーに --promo を渡してください。動画のレンダリングには ffmpeg/ffprobe も PATH 上に必要です。続いて promo skill install を実行すると、エージェントスキルがマシン上のすべてのエージェントツールが参照する共有フォルダー ~/.agents/skills(Codex、Gemini CLI、Cursor、GitHub Copilot、Grok Build)と、独自のフォルダーのみを参照する各ツールのフォルダー(Claude Code、Antigravity)にインストールされます。promo skill を実行すると内容が表示されます。
2. MCP(ツールに必須)
Claude Code/Cursor/あらゆる mcp.json:
{
"mcpServers": {
"promoshot-headless": {
"command": "/ABS/PATH/target/release/promoshot-mcp",
"args": ["--workspace", "/ABS/PATH/Promo", "--root", "/ABS/PATH/Promo"]
}
}
}
--workspace は新しいプロジェクトの保存先です。--root はサーバーが操作できるプロジェクトを制限します。両方を同じフォルダーに指定すると、すっきりと設定できます。どちらも省略可能です。--log <file> を指定すると、各ツール呼び出しについて、日時、ツール名、所要時間(ミリ秒)、結果を 1 行ずつ追記します。これはセッションごとの記録用で、デモページもここから作成されます。
クライアントごとのワンライナー:
# Claude Code
claude mcp add promoshot-headless /ABS/PATH/target/release/promoshot-mcp
# Grok Build
grok mcp add promoshot-headless -- /ABS/PATH/target/release/promoshot-mcp \
--workspace /ABS/PATH/Promo --root /ABS/PATH/Promo
grok inspect # confirms the server registered
# Docker — the host needs nothing but docker (details below)
docker build -t promoshot-mcp .
# then command: docker, args: ["run","-i","--rm","-v","/ABS/PATH/Promo:/projects","promoshot-mcp"]
PromoShot 3.0 がインストールされた Mac では、アプリもサーバーとして動作します。同じツールを使い、ユーザーが開いているドキュメント、取り消し、承認を利用できます。PromoShot の「設定」で「自動化」をオンにしてから、アプリ自体を登録してください。クライアントの起動時にアプリが起動します。
claude mcp add promoshot -- "/Applications/PromoShot.app/Contents/MacOS/PromoShot" --mcp-stdio
「設定」▸「自動化」には、この Mac 固有のパスを含むコマンドと、URL を指定するクライアント向けの URL 形式が表示されます。promoshot はアプリを、promoshot-headless はバイナリを指すため、両方を並行して登録できます。両方がある場合、スキルはどちらを使うか確認します。
3. スキル(ワークフロー)
どこでも同じファイルを使用します:skill/SKILL.md。
REPO=https://github.com/GarAlex/promoshot
git clone --depth 1 $REPO /tmp/promoshot
# Claude Code (Grok Build also scans this folder)
mkdir -p ~/.claude/skills/promoshot
cp /tmp/promoshot/skill/SKILL.md ~/.claude/skills/promoshot/SKILL.md
# Grok Build explicit path
mkdir -p ~/.grok/skills/promoshot
cp /tmp/promoshot/skill/SKILL.md ~/.grok/skills/promoshot/SKILL.md
# OpenAI Codex / many others
mkdir -p ~/.agents/skills/promoshot
cp /tmp/promoshot/skill/SKILL.md ~/.agents/skills/promoshot/SKILL.md
# Cursor project (in the repo the user is editing, not this engine repo)
mkdir -p .cursor/rules
cp /tmp/promoshot/skill/SKILL.md .cursor/rules/promoshot.md
# or: mkdir -p .agents/skills/promoshot && cp SKILL.md there
指示を読み込めるエージェントには、このファイルを直接渡せます。このスキルが想定するのは、これらのツール(または CLI)のみです。
4. 確認 — エージェントにレンダリングを依頼します:
examples/ProductCard.promo を 3 秒時点の静止画にレンダリングしてください。
promo_validate を 1 回、promo_render_still を 1 回実行すると、デバイス枠付きのアプリデモがパスとして返されます。そこからは、「 のプロモーションを作って」という依頼が、スキルの教えるワークフローになります。
ツール
ツール:promo_schema(オーサリング用サブセットと、検証済みの4つのレシピ。
promo_schema_fullはフォーマット全体です。promo_schema_typesは、
型のみを含むJSON Schemaとして生成されたフォーマットです。$schemaによる
エディターの自動補完用に、docs/promo.schema.json
にも同じものがチェックインされています)、promo_validate、promo_inspect
(各レイヤーをIDとともに一覧表示します。これは編集ツールが受け取る
ハンドルです)、promo_render_still、promo_render_frames、
promo_render_video、promo_render_gif、promo_proxy、
promo_workspaceです。素材を扱うツールとして、promo_media_probe、
promo_media_turntable(モデルを周囲から見たもの)、promo_media_filmstrip
(SOURCEクリップのコンタクトシート。各セルの時刻付き)、
promo_media_silences(無音区間とその逆区間)、promo_media_scenes
(シーンの切り替わりと、その間のショット)があります。これにより、
エージェントは素材を使って構成する前に、映像の内容を把握できます。
編集ツールの3つ組は、promo_init、promo_upsert_layer、
promo_upsert_keyframeです。プロジェクトを作成し、配置を指定して画像/動画/
キャプションのレイヤーを追加し、アニメーションを設定します。配置のキーフレームを
2つ指定するとプッシュインになり、ビューポートのキーフレームはKen Burns効果に
なります。指定した短いIDはそのまま使用され、名前のないものには正規UUIDが
割り当てられ、ピクセルサイズが記録されます。また、コンポジションはレイヤーを
常に覆う状態を保ちます。デバイスのフレームもヘッドレスで焼き込まれます。
アプリが描画するものと同じスラブです。promo_slideshowはウィザードです。
画像やクリップを入力すると、クラシック、カルーセル、ストア掲載用の
スライドショーが完成します。任意のスライドに付けたキャプションは、
画像とともに保存されるレイヤーになります。promo_applyは語彙全体に対応し、
編集コマンド(削除、移動、任意のレイヤーの更新、任意のキーフレームの
アップサート、リソースのパッチ適用)をまとめてアトミックに適用します。
コマンドスキーマも併せて提供されます。promo_explainは、ある時刻に
レイヤーがその位置にある理由を説明し、promo_diffはプロジェクトを最後に
確認してからの変更点を示します。promo_transcribeは音声からキャプションの
下書きを作成します。promo_voicesはプロバイダーの音声を一覧表示し、
promo_speakは本人のプロバイダーキーを使ってナレーションを合成します。
キーがなくても、ローカル音声を使って合成できます。レシートを使って、
変更のないテキストは再利用されます。オーサリングツールはコンポジションの
サムネイルをインラインで返すため、レイヤーの配置ミスをその場で検出できます。
ツールはフォーマット独自のパーサーを通じて通常のmetadata.jsonを書き込みます。
スキーマが引き続き信頼できる情報源となり、手動編集も第一級の操作として
扱われます。レンダリングの出力先は、既定ではプロジェクトの隣にある
<Name> Exports/で、書き込んだパスを返します。バイト列は返しません。
すべて省略可能なフラグ:--workspace <dir>(promo_workspaceが指す場所。
指定がない場合は$PROMOSHOT_WORKSPACE、それもない場合はXDGデータディレクトリ)、
--root <dir>(このツリー外のプロジェクトを拒否)、--promo <path>。
ナレーションキー
ナレーションの合成には本人のプロバイダーアカウントを使用し、キーがエージェントを 経由することはありません。キーを受け取るツールも、キーを表示するツールも ありません。OSのキーチェーンに一度だけ登録します。macOSではKeychain、 LinuxではSecret Service(GNOME Keyring、KWallet)、Windowsでは Credential Managerを使います。
promoshot-mcp key set openai # reads the key from stdin: paste, then Ctrl-D
promoshot-mcp key status # where each provider's key comes from, never the key
promoshot-mcp key remove openai
プロバイダー:openai、elevenlabs、google。キーは標準入力から読み取られるため、
シェル履歴、設定ファイル、引数リストには残りません。
キーチェーンがない環境(DockerイメージやCIランナーなど)では、Docker、
Kubernetes、CIシステムがシークレットを受け渡す方法と同じく、シークレット
ファイルからキーを読み取ります。/run/secrets/OPENAI_API_KEY
(同様にELEVENLABS_API_KEY、GOOGLE_API_KEY)、または
OPENAI_API_KEY_FILEで指定したパスを使います。docker inspectや
同じユーザーのすべてのプロセスから読み取れる環境変数ではなく、
モード0400のファイルを使用します。
docker run -i --rm \
-v "$HOME/.secrets/openai:/run/secrets/OPENAI_API_KEY:ro" \
-v /path/to/your/projects:/projects promoshot-mcp
エージェントは計画を立てる前に確認できます。{"check": true}を指定して
promo_speakを呼び出しても費用は発生せず、プロバイダーごとにキーの有無と、
実際に呼び出した場合に合成される内容が報告されます。実際に呼び出す際は、
保留中のすべてのナレーションについて、購入前にキーを確認します。また、
料金が発生した時点で各レシートを書き戻すため、途中で失敗しても次の呼び出しで
二重に支払うことはありません。キーはURLではなくリクエストヘッダーで送信され、
ログに記録されることもありません。
ローカル音声 — キー不要
local プロバイダーは、local-tts を使ってこのマシン上で音声を合成します。Apache-2.0 ライセンスの英語音声モデルなので、音声を公開できます(macOS のシステム音声などは個人利用に限ってライセンスされています)。キーもアカウントも不要で、料金もかかりません。一度ダウンロードすれば、以後ネットワーク接続は不要です。音声パッケージを一度インストールします。
promoshot-mcp voices list # packages, sizes, licences, what is installed
promoshot-mcp voices install kokoro-en-q8 # 106 MB: 28 voices, US and UK, the best English
promoshot-mcp voices install kitten-nano-en # 31 MB, 8 voices
すべてのファイルは、固定コミットの Hugging Face または GitHub にある固定のアップストリーム URL から取得され、パッケージが表示される前に SHA-256 との照合が行われます。パッケージは、macOS では ~/Library/Application Support/PromoShot/Voices、Linux では ~/.local/share/promoshot/voices、または PROMOSHOT_VOICES の指定先に保存されます。PROMOSHOT_VOICES_MIRROR には、最初に試すミラーを指定します。
スクリプトでは、"speech": {"text": "…", "provider": "local", "voiceID": "kokoro-en-q8/af_heart"} のように指定します。local プロバイダーを指定した promo_voices は、アップストリームの試聴評価が高い順に、すべての ID を一覧表示します(af_heart、af_bella、af_nicole、bf_emma、…)。イギリス英語の音声は、アメリカ英語の発音で読み上げます。古い Kokoro パッケージに対してインストールを再実行すると、モデルを再ダウンロードせずに不足している音声が追加されます。音声ファイルは .wav 形式です。英語辞書は、知らない単語を推測せずに拒否します。多くの場合、製品名がこれに当たります。プロジェクトごとに一度、Resources/pronunciations.dict に CMU 形式で発音を登録してください。
PROMOSHOT P R OW1 M OW0 SH AA2 T
辞書にない単語は、既知の単語に分割して推測します(YouTube、ChatGPT)。頭字語の場合はスペルアウトし(API)、または辞書で学習した小規模モデルが推測します。promo_speak は、推測した単語をすべて、そのまま貼り付けられる行として一覧表示します。そのファイルで発音を固定または修正し、promo_speak をもう一度呼び出してください。ファイルを編集すると、プロジェクトのローカル音声テイクが再合成されます。
Docker
イメージには、サーバー、CLI、ffmpeg、ソフトウェア Vulkan、フォントを含むレンダリング環境全体が入っているため、クライアント側のホストには何も必要ありません。
docker build -t promoshot-mcp .
{
"mcpServers": {
"promoshot-headless": {
"command": "docker",
"args": ["run", "-i", "--rm",
"-v", "/path/to/your/projects:/projects",
"promoshot-mcp"]
}
}
}
キー不要のナレーションを使うには、イメージに音声ボリュームを割り当て、一度だけパッケージをインストールしてください。以降の実行では、そのパッケージが読み込まれます。
docker run --rm -v promoshot-voices:/voices --entrypoint promoshot-mcp \
promoshot-mcp voices install kokoro-en-q8
上記の args に "-v", "promoshot-voices:/voices" を追加してください。
プロジェクトはマウント先に保存され、promo_workspace は /projects を返します。すべてのサンプル はイメージに組み込まれているため、マウントなしでも動作を確認できます。まず ProductCard.promo をレンダリングしてください。デバイスの枠が付いたアプリのデモでは、製品プロモーションの作成方法を学べます。server.json は、公開イメージ(ghcr.io/garalex/promoshot-mcp)用の MCP Registry マニフェスト(io.github.GarAlex/promoshot)です。GitHub の MCP Registry は、mcp-publisher publish の実行後にこのフィードを取り込みます。
mcp-name: io.github.GarAlex/promoshot
スキルはドリフトテスト済みです。テストによって、サーバーに実在するツール一覧と一致することが確認されるため、存在しないツールを教えることはありません。
Mac アプリには独自の MCP サーバー(設定 → 自動化)が組み込まれており、共通のツール名に加えて、エディターを開く機能や音声合成など、アプリ固有の機能も備えています。オーサリング用の 2 つの機能、センス、型スキーマは、ヘッドレス環境を優先しています。
セッションの流れは次のとおりです。3 件のリクエストを送り、検証済みプロジェクトとレンダリング済みフレームを受け取ります(このページの上部にあるフレームも、まさにこの方法で作成しました)。
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"promo_validate","arguments":{"project":"examples/LinuxSmoke.promo"}}}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"promo_render_still","arguments":{"project":"examples/LinuxSmoke.promo","time":5.5}}}
{"id":2,"result":{"content":[{"type":"text","text":"ok — nothing the renderer would quietly correct"}]}}
{"id":3,"result":{"content":[{"type":"text","text":"wrote examples/LinuxSmoke Exports/still-5.5s.png (1280x720 at 5.50s)"}]}}
すべてのプラットフォームで共通のエンジン
同じプロジェクトを macOS(Metal、VideoToolbox)と、何もない Linux コンテナー(lavapipe のソフトウェア Vulkan、GPU なし、ffmpeg)でレンダリングした場合、240 フレームの動画全体で SSIM は 0.983 でした。目に見える違いはフォントです。キャプションが問いかけ、2 つのフレームが答えています。
ぜひお試しください。examples/ には、promo_schema の各レシピに対応した実行可能なプロジェクトが用意されています(各 metadata.json がそのレシピそのもので、テストで固定されています)。デバイスの枠が付いたプロダクトカードから、9:16 への再スタンプまで含まれています。また、あらゆる機能を盛り込んだ LinuxSmoke.promo もあります。
promo video examples/ProductCard.promo --out card.mp4
プロジェクトの作成
まず promo schema を実行します。概要は次のとおりです。プロジェクトフォルダーには
metadata.json と Resources/ が含まれます。ID は一意の文字列です(短い略称でもかまいません。アプリでは記述されたとおりに保持されます)。レイヤーは、キーフレーム(保持してからイージング)、配置ルール、トランジション、パレット名で指定した色(@accent)を使って、リソースをタイムラインに配置します。レンダリング前に検証してください。レンダリングされない、または効果のない内容がある場合は、結果は NOT OK から始まります(読み取り側がないフィールド、本来意図した名前のフィールド、その位置では効果のない値、メディアの欠落など)。続いて、色名の未定義も含め、レンダラーが暗黙に調整する内容が示されます。
mkdir -p Demo.promo/Resources
# write Demo.promo/metadata.json, copy media into Resources/
promo validate Demo.promo --strict && promo still Demo.promo --out look.png --time 1
または、MCP サーバーにひな形の作成を任せ(promo_init、
promo_upsert_layer)、"$schema" を
docs/promo.schema.json に指定して、エディターの自動補完を利用します。
不変条件とプラン
SPECS.md— テストで固定される不変条件です。
バージョン
リリースは 1.0 までは 0.MINOR.PATCH です。MINOR は、新しいフォーマット段階(より高い minReaderVersion)、新しいツール、またはユーザーやエージェントが気づくような動作変更の際に上げます。PATCH は修正のみの場合に上げます。すべての GitHub リリースには、バイナリの生成ノートとビルドの来歴情報が付属し、リリースは最長でも週に 1 回です。0.3.0 はこのルールに基づく最初のリリースです。リーダーは段階 47 に対応しています(0.2.x では、段階 19〜47 の追加中に 11 日間で 79 回のパッチリリースが行われました。数字が何も意味していなかったため、このルールで改善します)。
ライセンス
Apache-2.0。このエンジンを基盤とする PromoShot アプリケーションは、別個のプロプライエタリ製品です。
長いソース向けのプロキシ
promo proxy <project> は、各動画リソースについて、パッケージ外のキャッシュ($PROMO_PROXY_DIR が設定されていればその場所、そうでなければプラットフォームのキャッシュディレクトリ内の promoshot/proxies)に、ティア 1 のプロキシ(長辺 960 px、すべてのフレームをキーフレーム化)を作成します。still、frames、gif、video は --proxy auto|on|off を受け取ります。auto(既定値)は出力の長辺がプロキシに収まる場合に、作成済みのプロキシを読み込みます。on は不足しているプロキシを先に作成し、off はソースを読み込みます。フルサイズのレンダリングでは常にソースを読み込みます。MCP ツールも同じ proxy 引数を受け取ります。promo_proxy でプロキシを作成します。
マーカーとチャプター
プロジェクトには markers を含めることができます。これは出力タイムライン上の名前付きの時点です。kind: "chapter" のマーカーは、エクスポートした mp4 のチャプターリスト(プレーヤーのチャプターメニュー)に書き込まれます。inspect ですべてのマーカーを一覧表示できます。
オーディオエフェクト
動画またはオーディオのリソースには audioEffects を含めることができます。リスト順にミックス前に適用される compressor と 1 バンドの eq、およびリソース全体を目標ラウドネス(ITU BS.1770 LUFS、無音部分はゲートで除外)に合わせて、チェーンの最後に一定のゲインを適用する normalize です。アプリのエクスポートとライブプレビューには同じエフェクトが適用され、コアはすべてのホスト向けに normalize のゲインを計算します。
クロマキー
動画または画像のレイヤーには chromaKey を含めることができます。これは色、許容範囲、ソフトネスを指定します。コンポジターでは、レイヤーのグレーディング、境界線、マスクの適用前にプレートが透明化されるため、すべてのホストで同様に、グリーンスクリーンのクリップをあらゆる映像の上に合成できます。
モデル
model 種別のリソースは、Resources/ 内にある glTF 2.0 バイナリ(.glb)です。model 種別のレイヤーは、PBR ライトパスを通して、レイヤーと同じサイズのテクスチャに描画します。そこからはほかの画像と同じで、配置、不透明度、トランジション、マスク、エフェクト、接地影がすべて適用されます。キーフレームには camera(ヨー、ピッチ、ロール、境界半径単位の距離、視野角)と light が含まれます。リソースの materials は、スロット名を色に割り当てます。パレット名も使えるため、@accent を指定するとテーマに合わせて本体の色が変わります。また、オブジェクト形式では仕上げも指定できます。ファイル本来の設定に対して metallic と roughness(それぞれ 0…1)を指定すれば、同じ本体をこのプロジェクトではクロームに、次のプロジェクトではマットにできます(段階 32)。さらにおすすめなのが、仕上げの WORD(段階 44)です。chrome、brushed、anodized、gloss、satin、matte、rubber、ceramic、lacquer、paper、glass、frosted を指定すると、それぞれを表す数値、コート、粒子、透過、屈折にエンジンが展開するため、反射を手作業で調整する必要はありません。画面では、この語が画像の上に重なるコートになります。ステージでは、ガラスが背後の本体を屈折させます。ライティングの既定値はテーマから取得します。シーンの environment(studio、sunset、night。段階 35。あるいは段階 46 では、プロジェクト内のパノラマを指定する resourceID。本体に映り込む世界の画像です)が、金属に映り込みます。ファイルの法線マップとメタリック・ラフネステクスチャも適用されます。段階 29。組み込みのデバイス本体(phone、tablet、tablet-portrait、laptop。promo device)は、Body と Screen スロットを備えた .glb ファイルとして生成されるため、デバイスのショットもモデルです。モデルには、ファイルではなく、読み込み時にエンジンが構築する recipe も指定できます。まずは本体としてのテキストです。3D 空間に実際の文字を置き、Face と Side スロットを備え、ほかの本体と同様にライティングと仕上げを適用します(段階 34)。デバイス本体も作成できます。また、パーツで構成される本体も作成できます。ボックス、球体、円柱、トーラス、回転体、押し出し形状をそれぞれスロットの下に配置し、位置、回転、スケールを指定します。描画と同じように、SVG と同様の方法で作成できます(段階 37)。同じ stage を指定するレイヤーは、1 つのカメラを通して 1 つの深度バッファに描画されます。モデルは depth に、画像はビルボードとして配置され、最初のメンバーの配置がシーン全体に適用されます(段階 30)。members、カメラ、ライトを独自のキーフレームに持つ stage 種別のレイヤーを、ステージそのものにすることもできます(段階 33)。同じ画像を、ステージの所有関係を明記して表現します。ステージの floor の語(段階 45)である matte、satin、glossy、mirror を指定すると、最も低い位置にある本体の下に平面が置かれ、キーライトの影、本体が触れる部分の暗がり、ステージの映り込みを受け止めます。映り込みは、ぼかしが徐々に弱まります。ステージレイヤーの下にあるものが透けて見えるため、テーブルにはプロジェクト独自の背景が表示されます。ライトのキーフレームで影は動きますが、床はそのままです。
本体にまとわせる画像
スロットの画像は、既定ではスクリーンです。スマートフォンのスクリーンショットに適した、ライティングなしで、サイズに合わせて表示される画像です。バインディングに "mode": "surface" を指定すると、代わりに画像や動画を、ライトと仕上げが適用されるスロットの色としてまとわせます。repeat でタイル状に並べ、offset で位置をずらします。画像が透明な部分からはスロット本来の色が見えるため、ラベルを花瓶に貼ったり、箱にプリントを施したり、キーライトや環境光の陰影がそのまま加わる光沢のある壁で動画を再生したりできます。段階 38。
パーティクル
particles 種別のリソースはファイルではなくレシピです。エミッター、レートまたはバースト、寿命、速度、重力、風、ドラッグ、乱流、寿命に応じたサイズと色、形状を描画レイヤーで再生します。すべてのパーティクルは、誕生時刻とシードから閉形式で決まるため、どのフレームも単独でレンダリングでき、すべてのホストで同じ結果になります。段階36。
パスリソースにはステージ内のルートを設定できます(段階40)。ステージの半径で表した3Dポイントを、メンバーまたはカメラのmotionPathがたどります。2Dモーションパスと同様に、2つのキーフレーム間に正確にフィッティングされます。カメラのtarget(中心、前方、メンバー、またはポイント)で、移動中にどこを見るかを指定します。内側を見続けるスパイラルも、1つのルートと1つのキーフレームで表せます。
ステージ内のパーティクルはモーフです(段階39)。レシピで2つのボディを指定し、1つ目の表面をサンプリングします。描画メンバーのprogressキーフレームが0から1へ進むにつれて、ポイントが飛び出し、2つ目のボディに集まります。キューブからポイントが弾けて、単語の形に落ち着くような表現です。faces: trueを指定したパーツボックスには6つのスロットがあり、各面に1枚ずつ画像を割り当てます。キューブはこの方法で作成できます。
側面のあるテキスト
旧形式:以下のキャプションのdepthは、フラットコンポジターの2.5Dです。実際に側面のあるタイトルは、ステージに立つテキストボディです(段階34)。バリデーターは旧形式にも対応しています。引き続きレンダリングできます。
キャプションスタイルにはdepthを設定できます。文字の下に複製を重ね、少しずつ奥へずらして暗くすることで、側面のある立体的な文字に見せます。オフセットを選ぶだけで実現できる、2Dのクラシックな押し出し表現です。リビールでは、現れる各パーツを同じ方法で押し出します。キャプションのtiltX/tiltYキーフレームで、デバイスフレームと同じカメラを使った遠近感のある傾きを付けられます。側面も文字の表面と一緒に傾きます。リビールのflip、tumble、slideモードでは、各単語がそれぞれの軸に沿って現れます。キーフレームを使わず、1つのルールで動きを付けるタイポグラフィです。
ポインターを追う
Macレコーダーで作成した動画にはpointerが含まれ、録画独自の時間と座標で、ポインターの移動先とクリック位置を記録します。ポインターを表示するレイヤーにfollowを指定すると、ビューポートは元動画の1/zoomの範囲を表示するウィンドウになり、平滑化されたポインターを追います。クリックするたびに、リングが描画され、広がりながらフェードします。キーフレームではなくルールで決まるため、録画を再トリミングしても、どのホストでも正確に追従します。
画像エフェクト
レイヤーにはeffectsを設定できます。blur(円形、またはblurAngleに沿った方向性のあるぼかし)、明るい部分へのglow、四隅に向かうvignette、フィルムのgrain、アンシャープ処理のsharpenを、コンポジターでレイヤー固有のピクセルに適用します。ぼかし、グロー、ビネットはキーフレームトラックにも対応しているため、フォーカス送りや脈動するグローも、カラーグレーディングと同様に変化させられます。5つのトランジション(blurDissolve、zoom、flash、glitch、dip)も同じ処理パスを使います。以前からあるフェード、ワイプ、スライド、プッシュ、スケールと同様に、レイヤーの端やリソースの切り替え時に適用できます。動画レイヤーの切り替え先にはコンポジションを指定できます(段階47)。切り替えでは、次の動画がこれらのカットを通して、sourceTimeで指定した位置、またはコンポジションの現在の時刻から再生されます。同じキーフレームで、時計を持つあらゆる要素(動画、音声、コンポジション、スプライト)の再生を制御できます。sourceTimeでシークし、playbackで一時停止と再開を行い、音声も追従します。
.cubeによるルック
lut種別のリソースはResources/内の.cubeファイルです。レイヤーのadjustments.lutResourceID(およびlutAmount)で、レイヤー固有のカラーグレーディングの後にコンポジターで適用します。すべてのホストで同じ三線形ルックアップが行われます。
ProResとアルファ
promo video … --codec prores422|prores4444 --out x.movはProResを書き出します。--alphaを指定すると、プロジェクトを背景なしでレンダリングし、フレームのアルファをProRes 4444で保持します(still/framesで--alphaを指定すると、透過PNGが生成されます)。アルファを含むソース(ProRes 4444、アルファ付きWebM、PNGシーケンス)は、プリマルチプライド形式でデコードされ、透明度を保って合成されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。