Communitygithub.com

funi-ai/demo-video

從使用者的真實螢幕錄影中,製作出產品展示、商店預覽、App Store 標題/搜尋影片以及循環片段(GIF 循環)。使用本地 ffmpeg 進行修剪、加速、縮放、加框、加入字幕與旁白。模型僅添加非產品的元素:旁白(Eleven v3,土耳其語用 Gemini TTS)、音樂與 UI 音效。

demo-video 是什麼?

此技能專為 Claude Code 等 AI 代理設計,能將使用者的真實螢幕錄影轉換為高品質的產品展示影片。它遵循 Apple App Store 指南(2.3.4),僅對錄影進行裁剪、加速、縮放、加框、加入字幕和旁白,絕不重新生成或「增強」使用者介面,確保畫面真實呈現。技能支援多種目標平台與格式:包含網站展示(16:9)、App Store 預覽影片、App Store 標題/搜尋結果影片(iOS 27)、Google Play 宣傳影片、Product Hunt 發布影片、以及用於更新日誌的無聲循環片段或 GIF。其核心運作依賴一個 `cut.json` 檔案,用來定義錄影素材、場景順序與輸出變體,並透過本地的 `democut.py` 腳本與 ffmpeg 進行處理,所有裁切與調整都是免費且可重複的。在生成任何素材前,技能會先透過「裁切卡」(cut card) 向使用者展示場景列表,並在獲得明確確認後才開始生成旁白與最終影片,確保創作過程完全可控且符合使用者需求。

相容平台✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/demo-video

在你喜歡的 AI 中提問

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

說明文件

展示影片

產品展示、商店預覽或功能循環片段,皆基於使用者的真實螢幕錄影。介面絕不會被重新生成:錄影會被裁剪、加速、縮放、加框、加入字幕與旁白。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" preflight
    
    若 blockers 不為空、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 規則

  1. 使用使用者的語言回覆。旁白、say 台詞與螢幕上的文字保持原有語言;模型提示詞使用英文。路徑、ID 和欄位名稱保持原樣。
  2. 不要在對話中顯示 JSON、濾波器圖譜、請求 ID 或工具操作描述。每個長時間步驟最多顯示一行狀態訊息。
  3. 提問配額: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 秒;展示影片開啟旁白,循環、標題或搜尋影片關閉旁白;除非要求否則關閉音樂;字幕作為獨立側載檔案;使用剪輯而非溶解轉場;除非商店或社群媒體目標要求,否則不使用裝置邊框。
  4. 「裁切卡」(cut card) 是一個硬性停止點。 展示場景列表(時間、發生的事件、台詞、長度),並在獲得「是」的確認前,不進行任何生成或渲染。沉默不等於同意,對舊版本的同意也不等於對當前版本的同意。
  5. 先有旁白,再處理畫面。 為每個場景生成語音,讓 time 測量其長度,然後根據它裁剪畫面。絕不要透過猜測一句話需時多久來確定場景時間(references/narration-and-audio.md)。
  6. 交付前先查看。 檢查最終檔案的預覽海報幀和連環圖,並檢查任何 GIF 的第一幀。即使驗證通過,但顯示錯誤畫面的展示影片仍然是錯誤的。
  7. 事實與隱私資訊來自使用者。 評分、計數、獎項、客戶名稱和標誌僅在使用者提供時才出現。如果某一幀顯示真實數據,解決方案是重新錄製,而不是模糊處理;直接說明這一點。
  8. 成本: 剪輯、幀、循環和每次檢查都是 0 美元。在進行任何生成之前,根據前置檢查的門檻進行評估並應用:低於 announce_above_usd → 執行並說明;不超過 confirm_above_usd → 一行說明後執行;高於 → 需明確確認。絕不憑記憶報價。
  9. 有限度的重試: 每個步驟最多 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每部影片一張底圖,無文字
沒有本地 ffmpegfal-ai/ffmpeg-api/* 在 references/routing-utility.md 中每次呼叫幾分錢,作為備用而非預設方案

打破平局與陷阱:

  1. 介面絕不生成、重新設計樣式、重新構圖或「增強」。 video-reframe、video-edit 和放大工具會重新繪製 UI 文字:它們僅適用於生成的素材,而非螢幕錄影。
  2. 縮放比例為原始畫面的分數,透過 grab --grid 或 sheet --grid 讀取;hold 用於顯示細節,push 用於引導視線一次,pull 用於揭示上下文一次(references/editing.md)。
  3. 商店預覽不同於結尾較短的展示影片:它是擁有自己場景子集的獨立變體。
  4. Play 商店和 Product Hunt 需要 YouTube URL,而非檔案:交付檔案並告知由誰上傳。
  5. 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 節)。
  6. 手機錄影需要使用手機邊框;time 會拒絕比例差異超過 30% 的組合。
  7. 僅當 can.burn_captions 為 true 時才燒錄字幕;否則提供側載檔案,或明確告知使用付費字幕路線。
  8. 使用者指定了模型 → 在即時檢查後使用該模型。

工作流程

  1. 接收資料。 目標、用途、錄影素材、品牌。讀取使用者指定的每個檔案。然後,對每個錄影素材:
    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 desktop
    
    回應包含尺寸、fps、時長、音訊、任何內嵌的上下黑邊以及該比例適配的目標。小於目標尺寸或顯示真實數據的錄影,現在就要求重新錄製,而不是在剪輯之後(references/recording-tips.md)。
  2. 檢查素材。
    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 --grid
    
    閱讀連環圖。dead_spans 和 keep_spans 是候選項,而非最終剪輯:靜止畫面有時正是重點。對任何要縮放的畫面使用 grab --at <s> --grid。
  3. 裁切卡。 按順序列出場景:ID、來源入/出點、速度、縮放、觀眾看到的內容、語音說的話、長度;然後是變體、要生成的內容、需要使用者提供的內容以及假設條件。展示它,暫停,等待「是」的確認(references/editing.md)。
  4. 旁白,測量後再處理(僅當展示影片有配音時)。計算價格並按照 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
    
  5. 撰寫剪輯設定。 使用寫入或編輯工具編輯 .genmedia/projects/<slug>/demo-video/cut.json:scenes、audio、variants。所有欄位說明請參考 references/cut-json.md。裝置邊框來自 launch-graphics layers(references/frames-and-loops.md)。
  6. 檢查。
    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)或說明你保留它們的原因。
  7. 建構。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    Bash 超時 600000 毫秒。場景按內容快取:修訂版僅重新渲染更改的部分(--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
    
  8. 檢查結果。 讀取預覽海報幀,然後是完成檔案的連環圖,接著是 GIF 的第一幀:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    檢查前 3 秒、縮放的幀(是否清晰?)、最後一幀(是否穩定?)、所有幀是否包含私人數據,並逐字檢查提示文件。
  9. 驗證並交付。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    檢查:精確尺寸、fps、平台視窗內的時長、編解碼器與設定檔、位元組限制、音訊配置、測量到的響度與真實峰值,以及循環目標的接縫(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

…(以下省略)

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

相關技能