Phone-portal reel(フォーンポータルリール)
概要
9秒、9:16のプロダクト広告。1台の三脚固定フレームで、3つのビートで構成:
- ポータルドロップ(約4.3秒)。 片手がスマホを持ち、もう一方の手でスワイプ。スワイプごとに商品が画面外に飛び出し、下の棚にビートに合わせて着地。最後にヒーロー商品が、音楽の一瞬の停止後に落下。
- ストップモーションシャッフル(約2.7秒)。 ハードカットで手とスマホが消え、商品がライン全体を16分音符ごとに1コマずつ回転。4拍目で静止。
- ロゴ表示(約2秒)。 6~8フレームでワードマークがフェードインし静止。音楽のみ、音声なし。
カメラ映像は一切不要。1枚の生成写真をレイヤー(セット、スマホと持つ手、スワイプする手)に分解し、コードでアニメーション。商品は実際の3Dモデルで、スマホ内と部屋で同じカメラでレンダリングされるため、ガラスを越えて1つのオブジェクトとして通過します。
基準: 実際の撮影と見分けがつかないこと。私たちが経験した失敗はすべて、誰かが1フレームで見抜いた連続性の破綻でした。納品ファイルは実寸で、すべての接触モーメントを確認してください。
必要なもの
| 必要なもの | 用途 |
|---|---|
OPENAI_API_KEY | プレートとマスター用の gpt-image-2、写真を維持する編集用の gpt-image-1.5(input_fidelity: high) |
ELEVENLABS_API_KEY | 音楽(music_v2_5)と効果音 |
HyperFrames CLI(npx hyperframes)、three.js r169 | フレームエンジンとレンダリング |
ffmpeg、Python 3(numpy opencv-python-headless pillow openai) | スクリプト |
スクリプトは環境変数、またはカレントフォルダやその上位フォルダにある .env ファイルからキーを読み取ります。キーを出力することはありません。各実行のOpenAI費用(スクリプトが推定値をログ出力)とElevenLabsクレジットを報告してください。
実際の手でスマホをスワイプする映像を三脚で撮影できる場合は、その映像を手に使用してください。偽造するのが最も難しい部分です。
ゲート:各段階で承認を得てから次へ
- ブリーフとビートシート。 ブランド、4~6個の商品(ヒーローは最後、セットを補完する色)、セット、および拍が整数のフレーム数になるテンポ。30 fpsの場合、112.5 BPMは16フレーム、120 BPMは15フレーム、90 BPMは20フレーム。すべての着地を音楽のグリッド(拍または半拍)に合わせ、間には置かない。ドロップ数については
references/build.mdのセクション1を参照。 - ルック。 プレート、マスター(手とスマホ)、適合カメラでの3Dプロダクトの最初のレンダリング、エンドカードを3つのフォントペアで設定したもの。すべて1枚のシートに。
- モーションテスト。 1回のスワイプと1回のドロップを納品品質でレンダリングし、1フレームずつチェック。ほとんどの失敗はここで発覚。
- ビルド、次にサウンド、最後に最終確認。
ビルド
references/build.md に従ってください。すべての手順と、実際に機能した数値が記載されています。順番に:
- プレート(空のセット)を生成し、次にマスター:プレートに両手と空白のスマホを追加した1つの編集。マスターがフレームです。 すべてのクリーンプレートはこれから作成されます。
- マスターからレイヤーを切り出し、画面のコーナー、画面下端、指先、手首を測定。
- 3Dカメラを棚の端にフィットさせる。
- エンジンを構築。
example/studio/(参考ビルド:紅茶ブランド、5つの箱)をコピーし、プレートに合わせて定数を再測定。コードのみを含む。画像、フォント、ラベルアート、three.jsファイルは自身で用意。商品が箱以外(瓶、ボトル、缶、ガラス製品など)の場合は、最初にbuild.mdの「その他の商品」を参照。 - 最初に音楽を作成し、ビートを測定。次に着地をグリッドに固定し、効果音を追加してミックス。
- レンダリング後、以下のチェックを実行。
演出を台無しにしたルール
| 現象 | 修正方法 |
|---|---|
| 商品がスマホの下に数フレーム遅れて現れる | ガラスの両側で1つの3Dオブジェクトにする。各スワイプを着地フレームから逆算:最下点が端に達したフレームから、スクロール速度で重力落下 |
| 商品が手の後ろに落下する | 画面の下端より下では、ベゼルと指より前に描画 |
| 商品がスマホの下に数フレームぶら下がる | 端で重力が支配する。ページのグライドに追従させ続けない |
| スワイプが写真のスライドに見える | 手首からフリックし、前腕は固定。手首の角度を調整して指先をページと一緒に動かす。スワイプは毎回異なる |
| フレームが静止画に見える | 保持するスマホは1.5~2ピクセル動き、押下ごとに沈む。壁は決して動かない |
| スマホ内に暗い線が移動する | フィードにページ区切りなし。ゴーストは低く抑える |
| 時計やジュエリーが手首で滑る | マスターでは素手を依頼。紛れ込んだ場合はすべてマスクし、scripts/blend-edit.py で除去 |
| カットがディゾルブになる | すべてのカット、スワップ、静止をフレーム全体で決定。シャッターサンプル内部では決して行わない |
| ラベルがコピーの櫛状に印刷される | 商品落下中は48サブフレーム、それ以外は10サブフレーム、シャッター0.38フレームを使用 |
| 生成編集がマスク外のものを動かした | マスク編集は尊重されない。編集を登録後、マスク内部のみ適用 |
| ドスンという音が箱より先に鳴る | 各テイクを最大アタックの4 ms前にトリミングし、そのアタックに合わせる |
完全なリストと原因は references/lessons.md にあります。
送信前の確認
- 納品ファイルの各接触モーメントでの実寸クロップ:各スワイプの最初のフレーム、商品が端を通過する瞬間、各着地、カット、腕がフレームから去る瞬間。
python3 scripts/sync-sheet.py final.mp4 --audio sound/stems/sfx.wav:各ヒットが指定フレームに合っていることを確認。bash scripts/check-final.sh final.mp4 1080x1920:-14 LUFS ±1、トゥルーピークが-1 dBTP以下であることを確認。
スクリプト
| スクリプト | 機能 |
|---|---|
scripts/openai-image.py OUT.png "prompt" [--edit IN.png --mask M.png --fidelity high] | 画像を生成または編集し、トークンと推定コストをログ出力 |
scripts/blend-edit.py crop / blend | 1領域のマスク編集を準備し、結果を登録してマスク内部のみ適用 |
scripts/elevenlabs.py spec.json OUTDIR | 仕様から音楽とエフェクトを生成、キャッシュ、クレジットをログ出力 |
scripts/beats.py bed.mp3 | 音楽のテンポ、ビートグリッド、最初のダウンビートを検出 |
scripts/sync-sheet.py VIDEO --audio sfx.wav または --cues cues.json | 各サウンドヒットの前後5フレームを1枚のシートに表示 |
bash scripts/check-final.sh VIDEO [WxH] | サイズ、fps、長さ、ラウドネス、トゥルーピークをチェック |
各スクリプトは --help でオプションを表示。example/README.md に参考ビルドのマップがあります。