Community程式設計與開發github.com

gbax316/make-ai-short

建立一個完整的 GENERATIVE-pixels 垂直短片(1080×1920,約 35-40 秒)——由 fal 影片模型(預設 Seedance 1.5 Pro)驅動的鎖定角色動畫,搭配哲學/敘述性 VO,並在 Remotion 中合成含字詞同步字幕、音效試聽、以及無縫幀 0==最後一幀循環。當使用者想要「製作 AI 影片短片」、「製作 AI 短片」、「製作藍人影片」或任何像素來自影片模型(非 TSX 動畫或分層拼貼)的短片時使用。

make-ai-short 是什麼?

這是一個用於從頭到尾生成 AI 短片的技能,其核心像素由影片模型產生,而非傳統的 TSX 動畫或分層拼貼。它專為 1080×1920 的垂直格式、約 35-40 秒的長度而設計,並內建三個嚴格規則:絕不重複從文字生成角色(使用已鎖定的 character.json 和 character.png 作為參考)、在產生任何內容之前明確陳述成本(基於 fal 定價 API)、以及透過強制結束幀條件來確保影片無縫循環。此技能支援 fal 和 kie.ai 作為影片模型提供商,並處理從腳本、語音生成、起始幀、影片片段、合成、字幕、口型同步到音效的最終混音等整個工作流程。它適用於 Claude Code、Cursor 等工具,並且是 shorts-director 技能調用引擎的一部分,用於處理新短片。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gbax316/shorts-director/tree/main/.claude/skills/make-ai-short

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

make-ai-short — 生成式短片,從頭到尾

像素來自影片模型;Remotion 僅合成片段 + 字幕。已在 藍人 #1「The Door」上驗證。是 /make-short(100% TSX)的兄弟技能——遵循相同紀律,加上三個 TSX 從未需要的閘門:產生前先說明成本、角色已從 character.json 鎖定、透過結束幀條件固定循環。

所有操作在儲存庫根目錄執行。需要在 .env 中有 FAL_KEY(片段 + 圖片)和 ELEVENLABS_API_KEY(語音)。

三條鐵律

  1. 絕不重複從文字產生角色。 ai-shorts/<char>/character.json + character.png 是鎖定的參考。需要該角色的每一張靜止圖片都使用 gen_image.py --ref character.png;每一個片段都是從已包含該角色的影格進行圖片轉影片。如果角色表尚未存在,則在進行任何其他步驟之前,建立一個(並讓使用者過目)本身就是一個步驟。
  2. 花費前先說明成本。 估算而非報價:Seedance 1080p 無音頻 = h×w×24×dur/1024 tokens × $1.2/1M ≈ $0.0583/s(fal 定價 API 驗證於 2026-07-14 — 完整表格請見 ai-shorts/IDEAS.md,包含 Wan/Veo-Lite 陷阱)。總是以 generate_audio:false 執行 — 語音由 ElevenLabs 處理,音效由我們的 SFX 管線負責。
  3. 透過約束而非運氣循環。 鏡頭 1 的真正幀 0(從片段中提取,而非提示圖片)是循環目標。最終鏡頭將其作為 end_image_url(Seedance/Kling)傳遞,並且合成在最末約 10 幀內穩定回到該精確靜止影格(remotion/src/shots/ai-1/Ai1Door.tsx 中的 LoopSettle 模式)。

成品目錄結構

ai-shorts/<name>/
  script.md · beats.json      — 與 /make-short 相同的契約(含實際字詞時間的 vo[])
  character.json              — 鎖定的參考(+ video_model 區塊 = 所選模型)
  shots/NN-slug.png           — 每個鏡頭的起始幀(gen_image.py --ref character.png [--ref scene])
  shots/NN-slug.json          — gen_clip 附帶資訊(model, payload, request id)
  shots/upload-urls.json      — fal 儲存網址(上傳可在不同重試間重複使用)
  voice/ · sfx-plan.json · output/                                          [voice/output gitignored]
remotion/src/shots/ai-N/      — 合成 + vo.gen.ts
media/projects/<name>/        — 用於 staticFile() 的片段拷貝(已提交 — 像素不可重現;shots/*.mp4 工作拷貝被 gitignored)

執行順序(語音優先於像素)

  1. 腳本 — script.md + beats.json。鉤子(Hook)在第 0 幀構成;中心論點應想要循環(藍人 #1:「到達是神話」→ 結尾 = 走向同一扇門)。約 80-100 字,2.5-2.7 wps 時間區間。絕不加號召性結尾(CTA outro) — 以主要事件結束,循環就是結尾。
  2. 語音優先 — python tools/gen_voice.py --beats ... --emit-ts remotion/src/shots/ai-N/vo.gen.ts(語音和模型來自 .env,或者當系列需要敘述者時(例如 George JBFqnCBsd6RMkjVDRZzb 搭配 eleven_v3 標籤),來自 beats.json 的 "voice" 區塊;在產生任何片段之前,依照 make-short 階段 4 處理 LINE CHECK 旗標)。實際字詞時間決定鏡頭時間區間;Seedance 接受整數 4-12 秒持續時間,因此鏡頭長度從時間區間向上取整。對話(兩個或更多角色): beats.json 中的 "cast" 將每個說話者映射到其 character.json(使用其 "voice" 區塊),每個 VO 行在其 "who" 中指定說話者,並使用 --pack 0.3 根據其實際長度將各行首尾相連,而不是將其擠壓到估計的時間區間中。每個角色一個語音存在於其 character.json 中,沒有其他地方。對話中的口型: 影片模型不知道誰在說話;它會讓聽眾說話,凍結說話者並將笑聲拉長到下一句。在片段之後,執行 python tools/mouth_sync.py ai-shorts/<name>(beats.json 中的 "shots" 為每個片段提供其全局起始時間和長度;每個 character.json 中的 "mouth" 區塊提供側邊、半徑、區域、樣式和 keep_above)。它會擦除模型的口型並根據語音軌道的音量繪製每個角色自己的口型。以相同方式 QA:每半秒檢查兩個臉部與誰在說話。一行內動作的變化(先笑,然後說話)是兩個片段,第二個從第一個片段在剪輯處的影格開始。然後逐幀掃描每個有口型的片段:超過片段中位數四倍的尖峰是剪輯、快速手勢或帶有鬼影特徵的兩幀變形;在該鏡頭的 "hold" 中列出變形影格並重新執行,使跳躍表現為乾淨的剪輯。
  3. 起始幀 — 每個鏡頭一個,使用 python tools/gen_image.py --model pro --aspect 9:16 --ref character.png(+ 當位置/道具必須跨鏡頭匹配時,鏡頭 1 的場景靜止圖作為第二個參考)。在任何影片呼叫之前對每個 PNG 進行 QA — 這是修正漂移成本最低的時候。
    • 注意手部、服裝細節、比例 — 在重試時於提示中明確命名它們。
    • 幾何形狀必須可走(鏡頭 6 的教訓,花費 2 次重試):使用結束幀固定時,起始幀必須讓動作透過向前走動來「達到」結束狀態 — 如果結束幀的角色比起始幀更接近鏡頭,模型會產生一個複製體。讓角色在起始時比結束狀態更大/更近,以便向前移動將其縮小到結束狀態。
  4. 片段 — 先說明總推導成本,然後並行為每個鏡頭執行 python tools/gen_clip.py(--set image_url=<fal storage url> --set 'duration="N"' --set resolution=1080p --set generate_audio=false,最後一個鏡頭加上 --set end_image_url=<frame0 url>)。透過 bakeoff_clip.upload_ref 上傳參考一次;將網址保留在 shots/upload-urls.json 中。 上述 fal 格式是此檢查點的預設值(CLIP_PROVIDER=fal,.env 中的 FAL_VIDEO_MODEL)。 如果使用 kie.ai(--provider kie): 欄位名稱遵循 kie 模型,而非 fal。對於 bytedance/seedance-2:--aspect none --set first_frame_url=@ai-shorts/<name>/shots/NN-slug.png --set duration=N --set resolution=1080p --set generate_audio=false,最後一個鏡頭 --set last_frame_url=@<frame0.png>。@path 上傳本地檔案(kie 保留 24 小時,因此 upload-urls.json 的重複使用僅在一天內有效)。成本:kie.ai/pricing,非 fal 表格;執行時會列印使用的點數。bakeoff_clip.py 仍然僅限 fal。 每個片段帶有以下提示:精確的角色短語 + "整個鏡頭中場景內精確只有一個角色"(複製體是頭號失敗原因) + 鏡頭移動 + "無變形" + 樣式行。
  5. 片段 QA,逐幀檢查 — 每個片段的起始/中間/結束條狀圖 + 最終片段最後一幀與循環目標的並排比較。重試失敗的片段(說明重試成本);一個 5 秒 1080p 的重試約為 $0.29 — 比起產生一個複製體來說很便宜。
  6. 合成 — 在單一時間軸上依序排列的 OffthreadVideo,約 8 幀交叉淡入淡出重疊(片段比其時間區間長約 1 秒 — 這就是緩衝空間),根層級的 Captions + ProgressBar,尾部的 LoopSettle 溶解。將最終片段複製到 media/projects/<name>/。執行 npm run gen,在邊界和關鍵幀處使用 frames.mjs,讀取每個 PNG,然後使用 --scale=1 進行 render-all 並混合 voice.wav。
  7. 音效 — /suggest-sfx 流程。Gappy-VO 校準(藍人 #1): VO 間隙中的音效線索無需遮罩和閃避 — 它們需要比密集敘述表格 約 7-8 dB 更低(間隙呼嘯聲 -9..-13,而非 -3..-5)。使用 volumedetect RMS 對照語音平均值參考進行驗證;主要層級可能與語音層級相近。試聽混音等待使用者的耳朵(硬閘)。
  8. 儲存回饋 — 記錄 used_in、beats.json 實際時間(gen_voice 寫入它們)、提交附帶資訊、最終報告中的成本分類帳。

完成標準 =

每個片段每個影格中的角色保持一致(已逐幀 QA) · 循環已驗證(最後一幀與幀 0 並排比較) · 基於實際字詞時間的字幕 · 每次花費前已說明成本並在之後彙總 · 音效試聽已渲染,等待使用者耳朵 · 無 CTA 結尾。 · 對口語和螢幕文字進行了 tools/check_text.py 清潔檢查 · 使用 tools/export_phone.py 製作了手機拷貝 · 在 LESSONS.md 中有註明日期的條目(如果該經驗教訓改變了運作方式,技能也以一般條款更新)。

Individual skills in this repo

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

gbax316/shorts-director

Directs a faceless vertical short from idea to finished, mastered file, and gets better with every run. Picks a format, writes the episode in a writers' room (three premises judged as the buyer), voices it, gates on an animatic, then decides beat by beat how each moment is made: drawn in code in Remotion, a cut-out from a generated still, a generated clip, or one of the engine tracks. Modes: series, writers-room, produce, sound, finish, bakeoff, effects (/effects), improve (the learning loop after every short). Formats so far: character skit with dialogue and synced mouths, photoreal mini documentary with sourced figures. Triggers on "make a short", "next episode", "make a video about X", "faceless video", "reel for this offer". Do NOT trigger for editing an existing video file, for a pure code-drawn explainer with no writers' room (make-short), or for collage (make-vox).

gbax316/vidtsx-2d-generator

Generate production-ready 2D TSX video files for VidTSX (Remotion-based) from a shot, scene, or video description. Use whenever the user wants to create or generate a VidTSX video, a 2D TSX shot or scene, an animated clip, title card, or rendered motion graphic — including when they describe a visual animation they want built, or say "make a shot", "build this scene", "generate the TSX", or "turn this into a video". Covers the mandatory file structure and composition config, dimension presets (horizontal/vertical/square), six style presets (minimalist, memphis, neo-brutalism, glassmorphism, neon, corporate), and the hard rules that keep renders from crashing, covering frame-based animation only (no useState/useEffect/setTimeout), strictly monotonic interpolate ranges, Easing.bezier not wrapper syntax, and the chroma-js and @remotion/paths import gotchas. Not for 3D/three.js compositions, general React work, or editing video files.

相關技能