Communitygithub.com

vitozev/phone-portal-reel

用於製作手機直式產品短片(Instagram Reels、TikTok、YouTube Shorts),畫面中手滑過手機,每個產品便從螢幕掉落到真實場景,或任何「手機傳送門」、「滑出掉落」或「掉出螢幕」廣告,尤其適合沒有實際攝影畫面、場景、手與產品都需生成的情況。

phone-portal-reel 是什麼?

這個 AI 技能專門用來生成「手機傳送門」風格的短影音廣告,在 9:16 直式畫面中,透過手滑手機讓產品從螢幕掉出,落在下方層板上。技能涵蓋三階段流程:產品掉落、停格動畫與 Logo 停留,全程無需實際攝影,而是將一張生成圖片分層(場景、手機與持機手、滑動手)並以程式動畫呈現,真實 3D 模型則在手機內外由同一相機渲染,達成跨越螢幕的視覺一致性。支援平台包括 Claude Code、Cursor 等命令列工具,透過 HyperFrames CLI(three.js)、OpenAI(gpt-image-2 與 gpt-image-1.5)生成圖片、ElevenLabs 製作音樂與音效。技能提供詳細的建構流程、常見失敗原因與對應修正,並在每個階段設有檢查點(brief、look、motion test、build)與最終驗證腳本(同步表、音量真峰值檢查),確保成品能通過專業檢視。

相容平台~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/vitozev/claude-skills/tree/HEAD/skills/phone-portal-reel

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

手機傳送門短片

概述

一個 9 秒 9:16 的產品廣告,拍攝於單一鎖定腳架畫面,分為三個節拍:

  1. 傳送門掉落(約 4.3 秒)。一隻手拿著手機。另一隻手滑過螢幕,每一次滑動就將一個產品從螢幕掉落到下方的架子上,落在節拍點上。主力產品在音樂突然停頓後最後掉落。
  2. 停格動畫序列(約 2.7 秒)。一個硬切移除手機與手。產品在整條線上輪流出現,每個十六分音符一個靜止幀,維持在第四拍。
  3. Logo 停留(約 2 秒)。字標在 6 到 8 幀內淡入並靜止。僅有音樂,無配音。

沒有實際攝影畫面。一張生成的圖片被切割成圖層(場景、手機與持機手、滑動手)並以程式動畫處理。產品是真實 3D 模型,由同一部相機在手機內和房間內渲染,因此它作為一個物體跨越玻璃。

標準: 它要能被當作真實拍攝。我們遇到的每一次失敗都是某人在單一幀中發現的連續性破綻。請以全尺寸檢視交付檔案的每一個接觸時刻。

你需要

需求用途
OPENAI_API_KEYgpt-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 點數。

如果有人能拍攝真實的手在腳架上滑手機的畫面,請使用那段影片來製作手部。這是最難偽造的部分。

關卡:每個階段需獲得確認才能繼續

  1. 簡報與節拍表。 品牌、4 到 6 個產品(主力產品最後,使用與場景互補的顏色)、場景,以及一個節拍為整數幀數的節奏。在 30 fps 下,112.5 BPM 對應 16 幀,120 BPM 對應 15 幀,90 BPM 對應 20 幀。將每個落地點放在音樂的網格上,落在正拍或半拍上,絕不能落在之間。關於掉落數量,請參閱 references/build.md 第 1 節。
  2. 視覺風格。 場景圖、主圖(手與手機)、在已設定相機中 3D 產品的第一版渲染,以及以 3 種字體組合設定的結尾卡,全部放在同一張版面上。
  3. 動態測試。 一次滑動與一次掉落,以交付品質渲染並逐幀檢查。大多數失敗會在此顯現。
  4. 建構,然後聲音,然後最終版。

建構

請遵循 references/build.md。其中包含每一步驟以及可運作的數字。順序如下:

  1. 生成場景圖(空場景),然後主圖:將場景圖進行一次編輯,加入雙手與空白手機。主圖就是基礎幀。 每個乾淨場景圖都從它製作。
  2. 從主圖切割圖層,並測量螢幕角落、螢幕底部邊緣、指尖與手腕。
  3. 將 3D 相機對齊架子邊緣。
  4. 建構引擎。複製 example/studio/(參考建構:一個茶品牌,五個盒子)並重新測量其常數以符合你的場景圖。它只包含程式碼:請自備圖片、字體、標籤藝術與 three.js 檔案。如果產品不是紙盒(如果是罐子、瓶子、易開罐、玻璃容器),請先閱讀 build.md 中的「其他產品」。
  5. 先製作音樂並測量其節拍。然後將落地點鎖定在網格上,加入音效並混音。
  6. 渲染,然後執行以下檢查。

破壞幻覺的規則

出現情況修正方法
產品比手機慢幾幀才出現它在玻璃兩側是同一個 3D 物體。從每個落地的幀數回溯處理每次滑動:從其最低點到達邊緣的幀數開始,它以滾動速度在重力下掉落
產品掉在手後面在螢幕底部邊緣以下,將其繪製在邊框和手指前方
產品在手機下懸掛幾幀重力在邊緣接管。不要讓它繼續跟隨頁面的滑動
滑動看起來像滑動照片從手腕發力並保持前臂僵硬。調整手腕角度使指尖與頁面一起移動。沒有兩次滑動是相同的
畫面看起來像靜止圖手持手機有 1.5 到 2 像素的漂移,並在每次按壓下稍微下沉。牆壁從不移動
一道暗線穿過手機動態消息中沒有頁面分隔線。保持任何殘影低調
手錶或首飾在手腕上滑動在主圖中要求裸露手腕。如果不小心出現,遮罩整個區域並使用 scripts/blend-edit.py 移除
切換變成溶解決定整個幀上的每個切換、交換和靜止,絕不在快門樣本內部進行
標籤列印成複製梳齒狀在產品掉落時使用 48 個子幀,其他情況使用 10 個子幀,搭配 0.38 幀快門
生成的編輯移動了遮罩外的東西遮罩編輯不會被尊重。先註冊編輯,然後只取遮罩內的內容
砰的一聲在盒子之前響起將每個片段修剪到其最大攻擊音前 4 毫秒,並對齊該攻擊音

完整列表(含原因)在 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 "提示詞" [--edit IN.png --mask M.png --fidelity high]生成或編輯一張圖片,並記錄 token 與估計成本
scripts/blend-edit.py crop / blend準備一個區域的遮罩編輯,然後註冊結果並只取遮罩內的內容
scripts/elevenlabs.py spec.json OUTDIR根據規格生成音樂背景與效果,快取它們並記錄花費的點數
scripts/beats.py bed.mp3找出音樂背景的節奏、節拍網格及第一個強拍
scripts/sync-sheet.py VIDEO --audio sfx.wav 或 --cues cues.json在一個版面上顯示每個音效撞擊點前後共五幀
bash scripts/check-final.sh VIDEO [WxH]檢查尺寸、fps、時長、響度與真實峰值

每個腳本以 --help 執行可查看選項。example/README.md 對應參考建構。

相關技能