展示影片
產品展示、商店預覽或功能循環片段,皆基於使用者的真實螢幕錄影。介面絕不會被重新生成:錄影會被裁剪、加速、縮放、加框、加入字幕與旁白。Apple 對預覽影片也適用相同規則 (2.3.4:允許應用程式本身的螢幕錄影、旁白與疊加元素)。一個 cut.json 檔案包含所有錄影素材、排序好的場景與變體;democut.py 會利用本地的 ffmpeg 將它轉換為最終檔案,且重新剪輯是免費的。
步驟 0 — 前置檢查
每次會話執行一次:
python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
kind: "ffmpeg_missing"→ 無法進行本地剪輯。告知使用者,並提供references/routing-utility.md中的付費工具路線,或要求使用者安裝 ffmpeg。絕對不要臨時使用其他工具代替。- 確認
can.burn_captions(libass)、can.duck(sidechaincompress)、can.webm。缺少的功能會改變你能承諾的內容,但絕不能更改你聲稱的項目。 - 僅當需要生成內容(旁白、音樂、音效、配音、背景底圖)時才執行:
若command -v genmedia python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflightblockers不為空、CLI 缺失或版本低於 0.7.0 → 執行/genmedia-skills:setup。若金鑰缺失 → 使用者需自行執行genmedia setup或匯出FAL_KEY;等待使用者操作。絕對不要讀取、列印、要求或輸入金鑰。保持config.announce_above_usd和config.confirm_above_usd(預設值為 0.50 和 2)。 - 優先恢復先前工作:若
.genmedia/projects/<slug>/demo-video/cut.json已存在 → 從該處繼續,絕不為相同產品建立第二個剪輯任務。
UX 規則
- 使用使用者的語言回覆。旁白、
say台詞與螢幕上的文字保持原有語言;模型提示詞使用英文。路徑、ID 和欄位名稱保持原樣。 - 不要在對話中顯示 JSON、濾波器圖譜、請求 ID 或工具操作描述。每個長時間步驟最多顯示一行狀態訊息。
- 提問配額:2 個,一次一個,附上標籤選項,僅當答案缺失時提問:
- Q1 關於錄影素材,當沒有提供檔案時:詢問素材路徑,並提供
references/recording-tips.md中的簡短錄製指南。沒有預設的素材。 - Q2 關於輸出用途,當請求未明確說明時:A 網站展示 (16:9) · B App Store 預覽 · C App Store 標題或搜尋結果影片 · D Google Play 宣傳 · E Product Hunt 發布影片 · F 無聲循環或 GIF。可選擇多個;一個剪輯任務即可滿足所有需求。 其他所有選項皆使用你交付時的預設值:展示影片 60 秒,商店預覽 20 秒,App Store 標題或搜尋影片 12 秒,循環片段 6 秒;展示影片開啟旁白,循環、標題或搜尋影片關閉旁白;除非要求否則關閉音樂;字幕作為獨立側載檔案;使用剪輯而非溶解轉場;除非商店或社群媒體目標要求,否則不使用裝置邊框。
- Q1 關於錄影素材,當沒有提供檔案時:詢問素材路徑,並提供
- 「裁切卡」(cut card) 是一個硬性停止點。 展示場景列表(時間、發生的事件、台詞、長度),並在獲得「是」的確認前,不進行任何生成或渲染。沉默不等於同意,對舊版本的同意也不等於對當前版本的同意。
- 先有旁白,再處理畫面。 為每個場景生成語音,讓
time測量其長度,然後根據它裁剪畫面。絕不要透過猜測一句話需時多久來確定場景時間(references/narration-and-audio.md)。 - 交付前先查看。 檢查最終檔案的預覽海報幀和連環圖,並檢查任何 GIF 的第一幀。即使驗證通過,但顯示錯誤畫面的展示影片仍然是錯誤的。
- 事實與隱私資訊來自使用者。 評分、計數、獎項、客戶名稱和標誌僅在使用者提供時才出現。如果某一幀顯示真實數據,解決方案是重新錄製,而不是模糊處理;直接說明這一點。
- 成本: 剪輯、幀、循環和每次檢查都是 0 美元。在進行任何生成之前,根據前置檢查的門檻進行評估並應用:低於
announce_above_usd→ 執行並說明;不超過confirm_above_usd→ 一行說明後執行;高於 → 需明確確認。絕不憑記憶報價。 - 有限度的重試: 每個步驟最多 3 次修復嘗試,每次必須有變更;違反內容政策的請求絕不原樣重新提交;帶有請求 ID 的任務將被恢復,絕不重新提交。
發現防護欄
scripts/video-surfaces.json 是一個帶有日期的快取(verified_on 由 democut.py specs 讀取):null 表示該數字未從官方頁面讀取,絕不要憑記憶填寫。當商店拒絕某個檔案時,以官方頁面為準,並修正該行。
在會話中首次對某個端點進行付費呼叫之前:
genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
status 必須為 active;欄位、枚舉和限制來自 schema。若非 active → 轉向 references/routing-audio.md 中該任務的下一層級。絕不要用提示詞代替端點 ID 來執行 genmedia run。新的發行版本位於供應商命名空間下,而不僅是 fal-ai/。
路由
| 需求 | 方式 | 原因 |
|---|---|---|
| 修剪、加速、縮放、加框、拼接、疊加、混音、音量調整、GIF、檢查 | democut.py (本地 ffmpeg) | 精確、免費、可重複;產品的像素絕不經由模型處理 |
| 在不觀看的情況下檢查錄影或結果 | democut.py analyze, sheet, grab; frames.py sheet | 使用檢測器和連環圖,取代猜測 |
| 旁白 | fal-ai/elevenlabs/tts/eleven-v3;土耳其語:fal-ai/gemini-3.1-flash-tts | 預設 TTS;土耳其語路徑需經 schema 驗證 |
| 背景音樂、UI 音效 | elevenlabs/music/v2.5 (精確長度), fal-ai/elevenlabs/sound-effects/v2 | 可控制長度;每秒成本低廉 |
| 逐字精確的字幕時間碼 | fal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captions | 字級時間戳記 |
| 為完成檔案進行其他語言配音 | fal-ai/elevenlabs/dubbing | 每種語言一次 API 呼叫 |
| 裝置邊框、結尾卡片、精確的螢幕圖文 | /genmedia-skills:launch-graphics (layers,合成的 PNG) | 文字在精確位置合成,絕不生成 |
| 加框裝置後的背景底圖 | bytedance/seedream/v5/pro/text-to-image | 每部影片一張底圖,無文字 |
| 沒有本地 ffmpeg | fal-ai/ffmpeg-api/* 在 references/routing-utility.md 中 | 每次呼叫幾分錢,作為備用而非預設方案 |
打破平局與陷阱:
- 介面絕不生成、重新設計樣式、重新構圖或「增強」。
video-reframe、video-edit和放大工具會重新繪製 UI 文字:它們僅適用於生成的素材,而非螢幕錄影。 - 縮放比例為原始畫面的分數,透過
grab --grid或sheet --grid讀取;hold用於顯示細節,push用於引導視線一次,pull用於揭示上下文一次(references/editing.md)。 - 商店預覽不同於結尾較短的展示影片:它是擁有自己場景子集的獨立變體。
- Play 商店和 Product Hunt 需要 YouTube URL,而非檔案:交付檔案並告知由誰上傳。
- App Store 標題或搜尋結果影片(iOS 27 創意資源)是其獨立的無聲循環變體:
appstore-header-video(3840x1646) 或appstore-search-video(3:2),30 或 60 fps,5-30 秒,一個核心概念,每個場景 2 秒或更長,結尾回到開頭。Apple 沒有列出通用影片;靜態圖片是launch-graphics的工作(references/surfaces.md第 1a 節)。 - 手機錄影需要使用手機邊框;
time會拒絕比例差異超過 30% 的組合。 - 僅當
can.burn_captions為 true 時才燒錄字幕;否則提供側載檔案,或明確告知使用付費字幕路線。 - 使用者指定了模型 → 在即時檢查後使用該模型。
工作流程
- 接收資料。 目標、用途、錄影素材、品牌。讀取使用者指定的每個檔案。然後,對每個錄影素材:
回應包含尺寸、fps、時長、音訊、任何內嵌的上下黑邊以及該比例適配的目標。小於目標尺寸或顯示真實數據的錄影,現在就要求重新錄製,而不是在剪輯之後(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Product>" --target web-16x9 python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktopreferences/recording-tips.md)。 - 檢查素材。
閱讀連環圖。python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --griddead_spans和keep_spans是候選項,而非最終剪輯:靜止畫面有時正是重點。對任何要縮放的畫面使用grab --at <s> --grid。 - 裁切卡。 按順序列出場景:ID、來源入/出點、速度、縮放、觀眾看到的內容、語音說的話、長度;然後是變體、要生成的內容、需要使用者提供的內容以及假設條件。展示它,暫停,等待「是」的確認(
references/editing.md)。 - 旁白,測量後再處理(僅當展示影片有配音時)。計算價格並按照
references/narration-and-audio.md一次性提交一批任務,每個場景一個檔案,然後讓數字決定畫面:python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json - 撰寫剪輯設定。 使用寫入或編輯工具編輯
.genmedia/projects/<slug>/demo-video/cut.json:scenes、audio、variants。所有欄位說明請參考references/cut-json.md。裝置邊框來自launch-graphics layers(references/frames-and-loops.md)。 - 檢查。
在渲染前修復所有錯誤:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>scene_shorter_than_voice(拉長區間、降低速度或刪減台詞 — 絕不加速語音)、duration_out_of_range(針對商店目標)、wrong_size、fps_not_allowed、transition_too_long、frame_aspect_mismatch、overlay_invisible。對警告採取行動(如創意資源影片上的quick_cut、fast_motion、narration_muted)或說明你保留它們的原因。 - 建構。
Bash 超時 600000 毫秒。場景按內容快取:修訂版僅重新渲染更改的部分(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>--scene <id>、--force)。然後處理字幕和循環:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6 - 檢查結果。 讀取預覽海報幀,然後是完成檔案的連環圖,接著是 GIF 的第一幀:
檢查前 3 秒、縮放的幀(是否清晰?)、最後一幀(是否穩定?)、所有幀是否包含私人數據,並逐字檢查提示文件。python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3 - 驗證並交付。
檢查:精確尺寸、fps、平台視窗內的時長、編解碼器與設定檔、位元組限制、音訊配置、測量到的響度與真實峰值,以及循環目標的接縫(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>loop_seam)。然後是交付訊息。修訂:編輯剪輯設定,重新建構,再次驗證。
交付
<Product> 展示影片:genmedia-output/<slug>/demo-video/
主影片 16:9:web-16x9/<slug>.mp4 (1920x1080, <n> 秒) · 海報 web-16x9/<slug>-poster.png
App Store 預覽:appstore-iphone/<slug>.mp4 (886x1920, <n> 秒, H.264 High, AAC 256k) <僅在已建構時顯示>
App Store 標題/搜尋影片:appstore-header-video/<slug>.mov (3840x1646, <n> 秒, <fps> fps, 無聲循環) · 可在 App Store Connect 中選擇的海報幀時間點:<t> 秒 <僅在已建構時顯示>
Play 商店宣傳 / Product Hunt:使用相同的主影片 — 兩個平台都需要 YouTube URL,因此請上傳並貼上連結 <僅在已建構時顯示>
循環片段:loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · 第一幀 <slug>-loop-first.png <僅在已建構時顯示>
字幕:<variant>/<slug>.srt, .vtt (<language>) <僅在已建構時顯示> · manifest.json
你的錄影,未經修改:已裁剪,<在等待處加速>,縮放至 <區域>,<放入繪製的裝置邊框中>。介面中沒有任何部分被重新生成。
為你選擇的設定:<長度, 場景數, 旁白開/關, 音樂, 字幕, 邊框, 比例適配 — 所有使用者未設定的預設值>
商店備註:<每條適用的簡短說明:App Store 預覽影片為 15-30 秒,每種裝置最多 3 部,僅限螢幕錄影 (2.3.4) · 標題和搜尋影片以靜音循環播放(搜尋影片永不解除靜音),在 iOS 27 和 iPadOS 27 或更高版本上顯示,其海報幀一旦批准即固定 · Play 商店宣傳片僅自動播放前 30 秒 · Product Hunt 圖片(包括 GIF)保持在 3 MB 以下,GIF 在滑鼠懸停時播放>
已生成項目:<無,美金 0 | 旁導 <n> 行 (<model>), 音樂,預計美金 <x>> · 所有檔案均為本地檔案;沒有上傳任何內容。
下一步:指定一個場景以及要更改的內容(入/出點、速度、縮放、台詞);重新剪輯是免費的。
翻譯時保持路徑、尺寸和螢幕上的文字不變。
錯誤
| 訊號 | 處理方式 |
|---|---|
kind: "ffmpeg_missing" | 沒有本地 ffmpeg。告知無法在此進行剪輯;提供 fal ffmpeg-api 路線(references/routing-utility.md)或要求使用者安裝。 |
source_changed | 錄影素材被移動或更改。使用 source add --replace,然後重新檢查每個入/出點:舊的時間碼已無參考價值。 |
來自 time 的 check_failed | 每一項都指出一個場景和一個數字。修正剪輯設定;只要錯誤存在,就不進行渲染。 |
scene_shorter_than_voice | 拉長區間、降低 speed 或刪減台詞。絕不能加速語音來適應。 |
duration_out_of_range | 超出了官方時長視窗(App Store 預覽 15-30 秒,標題和搜尋影片 5-30 秒)。僅對該變體刪除或縮短場景。 |
wrong_size、fps_not_allowed、fps_too_high | 變體的尺寸或 fps 不符合其設定行。刪除覆蓋設定或選擇該行接受的數值(specs)。 |
來自 validate 的 loop_seam | 循環在重新開始時跳動。結束在起始狀態或保持相同區域,重新建構,再次驗證。 |
frame_aspect_mi |
…(以下省略)