Communitygithub.com

danbaruka/ai-video

從一個小型的 video.json 檔案,以簡潔、動畫風格的白色樣式製作短直式影片(TikTok、Reels、YouTube Shorts,30 到 90 秒),使用極少 token。

ai-video 是什麼?

這個技能能讓開發者或創作者透過一個 JSON 檔案,自動化生成專業級短影片。它支援三種模式:「Generated」模式會加入免費的神經網路語音與動態設計;「Images」模式則能將截圖、照片或網頁放入仿真的 iPhone、瀏覽器或全螢幕展示;「Filmed」模式則可為人物談話影片加上字幕與動畫場景。技能會自動撰寫腳本、生成語音、逐字同步字幕、為每個場景製作動畫、添加音樂和音效,並檢查文字是否溢出畫面,最後輸出 MP4 檔案。此技能支援英文、法文等多種語言,且 token 消耗極低(約 65,000 tokens 即可完成一支 60 秒影片),適合快速批量製作影片、無臉影片、動畫解說或帶有動畫字幕的內容。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danbaruka/claude-code-ai-video/tree/main/skills/ai-video

在你喜歡的 AI 中提問

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

說明文件

ai-video 是做什麼的?

一部影片就是一個 video.json 檔案:包含語音要說的句子,以及針對每個強烈想法,從 16 種場景目錄中選出的一個場景。 scripts/make.mjs 腳本會處理所有其他事情。千萬不要手動撰寫 HTML、CSS 或動畫程式碼。唯一的例外是某個時刻值得一個自訂視覺效果(類型為 html)。

點子 ─► 腳本(句子) ─► video.json ─► make.mjs ─► 連絡表(審閱) ─► --rendu ─► MP4 + 封面 + 貼文文案

JSON 鍵名是法文(phrases、texte、scene、voix、marque……),場景類型也是如此(titre、chiffre、liste……)。請完全按照此技能中顯示的內容撰寫。語音說的文字可以是任何語言。

第一次製作影片之前(只需一次)

sh <skill>/scripts/install.sh      # 檢查 node ≥ 18、ffmpeg、python3;在 <skill>/.venv 中安裝 edge-tts

<skill> 是此檔案所在的資料夾。第一次執行會下載 HyperFrames(透過 npx)、GSAP 和標誌。之後所有內容都會被快取。

工作流程

  1. 一句話的主題。 如果使用者沒有提供,建議 3 個主題並讓他們選擇。
  2. 腳本。 閱讀 references/writing.md:有效的鉤子、結構、長度。
    • 目標是 9 到 14 個句子,以及 110 到 170 個單字。
    • 大約每秒 2.7 個字,句子間隔 0.35 秒:130 個字約為 50 秒。
  3. 檔案。 在使用者的專案中撰寫 videos/<id>.json。格式如下,完整目錄在 references/scenes.md。將媒體檔案放在 videos/medias/。
  4. 建構。 node <skill>/scripts/make.mjs videos/<id>.json 會產生語音、頁面、檢查和連絡表,但不進行渲染(約 1 分鐘)。
  5. 審閱。 只開啟一張圖片:videos/rendus/<id>-planche.jpg。
    • 它會顯示第一幀,然後是每個場景結束時的畫面(在其所有元素都到達後),最後是片尾卡。
    • 修正 JSON 並再次執行命令。語音會被快取:只會重新製作有變更的句子。
  6. 渲染。 加上 --rendu。45 秒的影片約需 1 分鐘。你會得到:
    • videos/rendus/<id>.mp4;
    • -couverture.jpg,即封面,也就是第一幀;
    • <id>.txt,包含標題、字幕、主題標籤和置頂留言。
  7. 發布。 閱讀 references/publishing.md,了解依目標國家/地區的發布時間、發布節奏和字幕。未經使用者明確同意,切勿發布任何內容。

節省 token:重要的規則

這個技能很省錢,因為模型每部影片只需撰寫 60 到 120 行 JSON,而不是 250 到 400 行的 HTML 和動畫程式碼。在盲測中,一個全新的代理程式用大約 65,000 個 token(包含閱讀此技能的時間)就完成了一支 60 秒的影片。要保持這樣的效果:

  • 不要開啟 make.mjs、lib/*.mjs、style.css 或產生的 index.html。場景目錄就足夠了。只有在命令失敗且錯誤訊息不足時才開啟程式碼。

  • 只在對應的步驟閱讀參考文件:

    步驟參考文件
    撰寫腳本writing.md
    選擇場景scenes.md
    語音、影片素材或螢幕截圖modes.md
    發布publishing.md

    不要在對話中重複閱讀已經讀過的參考文件。

  • 只檢視一張連絡表,而不是螢幕截圖。 檢查影片時,只看一次 <id>-planche.jpg。不要每秒抓取一幀,也不要逐幀檢查 MP4。

  • 相信檢查。 命令會執行 HyperFrames 檢查(溢出文字、隱藏文字、執行時期錯誤)並用幾行文字總結。

    • "aucun débordement, aucune erreur" 表示一切正常。
    • ✗ 行必須總是修正。
    • ⚠ 行值得閱讀:如果它影響文字則進行修正。
  • 批次處理只需一個命令。 先撰寫好 N 個檔案。然後在背景執行 node make.mjs videos/a.json videos/b.json … --rendu,等待它完成,不要觀看其輸出。

  • 原地編輯。 要修正某些東西時,只變更 JSON 中有問題的句子或場景。不要重寫整個檔案。

  • 無需尋找素材。 標誌(logo:bitcoin、logo:metamask……)和 45 個圖示(icone:cle……)都已內建。只有在使用者要求時才在網路上搜尋圖片。

video.json 格式

{
  "id": "wallet-key",
  "titre": "Your crypto is not in your wallet",
  "langue": "en",
  "voix": { "nom": "en-US-AndrewMultilingualNeural", "debit": "+4%" },
  "marque": { "nom": "BDan", "visuel": "icone:etincelle" },
  "prononcer": { "USDT": "U S D T" },
  "phrases": [
    { "texte": "Your crypto is not in your *wallet*.",
      "scene": { "type": "titre", "lignes": ["Your crypto", "is not in", "your *wallet*"], "visuel": "icone:portefeuille" } },
    { "texte": "The key fits in *twelve words*.",
      "scene": { "type": "chiffre", "valeur": "12", "apres": "words", "au": "twelve", "couleur": "accent" } },
    { "texte": "It's called the recovery phrase." }
  ],
  "fin": { "texte": "I'm BDan.", "sous": "Let's talk new tech.", "audio": "medias/signature.wav" },
  "publication": { "titre": "…", "legende": "…", "hashtags": ["crypto"], "commentaire": "…" }
}
  • phrases[].texte:語音要說的文字,逐字對應。

    • *word* 標記強調詞:它會以彩色斜體顯示,在說話時脈動,並且鏡頭會推進到該詞。
    • 每個句子最多使用一個。
  • scene:開始一個新場景。

    • 沒有 scene 的句子會延續前一個場景,這會留下閱讀時間。
    • 在 filmed 模式中,沒有場景的句子會顯示臉部;在那裡,"scene": "suite" 會延續場景。
  • au(「在」):元素會在句子的那個詞出現,例如 "au": "Ledger"。

    • 沒有 au 時,元素會自行平均分佈:當元素數量與句子數量相同時,每個句子一個;否則以均等間隔出現。
  • 視覺效果,無論場景使用何種:"logo:binance"、"icone:cadenas"、"emoji:🔑",或路徑如 "medias/screenshot.png"(.svg 檔案會被內嵌)。

  • voix:語音。nom 是語音名稱,debit 是速度。fichier 指向你自己的錄音。

  • langue:預設為 "fr"。英文設為 "en",並搭配一個英文語音。

  • marque:左下角的小品牌膠囊。nom 是品牌名稱,visuel 是其標誌。

  • prononcer:發音形式。它們會改變語音說某個詞的方式,但絕不會改變螢幕上顯示的文字。

  • fin:片尾卡,包含 marque 標誌、texte 和 sous(副標題)。

    • audio 會在卡片上播放錄製的結尾語音。
    • 沒有 audio 時,卡片會停留 2 秒,靜音。
  • titre:檔案中影片的名稱。YouTube 標題則放在 publication 中。

  • 可選項:

    鍵效果
    musique一個音樂檔案,在語音下方降低音量
    couleurs顏色,例如 {"accent": "#2f6bff", "accent2": "#5fa3ff"}
    sons: false轉場時沒有咻聲
    blanc句子之間的靜音時間,預設為 0.35 秒
    pause在某個句子之後額外的靜音
    sousTitres: false不加字幕
  • 句子 1 一定有一個場景。 第一幀是人們在動態消息中看到的封面,所以使用一個簡短、引人入勝的 titre。

16 種場景(參數和範例在 references/scenes.md 中):

要展示…類型
鉤子、一句有力話語titre
一個數字(價格、紀錄、百分比)chiffre
2 到 6 個要點、工具或提示liste
一個 2 到 5 個步驟的方法etapes
A 對比 B、前 / 後、迷思 / 事實duel
品牌、貨幣、應用程式logos
應用程式截圖或螢幕錄影telephone
一個網站、一個頁面navigateur
一張照片,以卡片或全螢幕顯示image
一段對話(AI、客服、詐騙)chat
一個危險、一個詐騙、一個好消息alerte
一個趨勢、一個數字比較graphique
一個命令、一個安裝terminal
某人的引言citation
一個概念及其解釋carte
值得一個自創視覺效果的時刻html

變化場景。

  • 為每個強烈想法分配一個專屬場景:每部影片 6 到 10 個場景。
  • 不要連續兩次使用相同類型,並且從一部影片到下一部要改變類型的順序。
  • 固定的風格不能變成模板。如果連續三部影片共享相同的場景序列,觀眾會流失。

三種模式(詳細資訊在 references/modes.md)

  • Generated:你只需要 JSON。
    • 語音是 edge-tts:免費、無需金鑰、支援多種語言。
    • 設定 voix.nom 來更換語音或口音。
  • Images:你的螢幕截圖和照片會放入 telephone、navigateur 或 image,從 videos/medias/ 讀取。
    • 錄製或克隆的語音放在 "voix": { "fichier": "medias/voice.wav" }。
    • 它會在本機轉錄(whisper)並與你的句子同步。
  • Filmed:設定 "rush": "medias/clip.mp4"。剪輯的音訊就是語音。
    • 沒有場景的句子會顯示臉部,字幕在底部。
    • 場景會在其想法的持續時間內覆蓋整個畫面。
    • 根據轉錄稿撰寫句子:技能會逐字同步它們。

渲染前的檢查清單

  • 句子 1 清楚地陳述主題,且其標題在一秒內可讀。
  • 每個專業術語都在同一個句子或下一個句子中解釋。
  • 每個句子最多有一個強調詞,並有 6 到 10 個不同類型的場景。
  • 數字來自真實、已驗證的來源。當數字來自他人時,chiffre 場景會帶有 source。
  • 連絡表已審閱,檢查結果乾淨,且沒有留下「mot introuvable」(找不到單字)的警告。
  • 結尾提供一個留下的理由(接下來會發生什麼、一句值得記住的話),而不是一個模糊的問題。
  • 展示品牌是為了討論它們,絕非暗示合作關係。
  • 虛構對話帶有 "mention": "Exemple fictif",或英文的 "Example"。

當問題發生時

訊息處理方式
voix : … edge_tts執行 sh <skill>/scripts/install.sh
mot « x » introuvableau 必須重複其場景句子中的一個詞,且拼寫一致
logo « x » introuvable提供一個檔案("medias/x.svg"),或試試不帶空格的品牌名稱
文字溢出縮短文字,或切換到更寬的場景(carte 或 liste 而不是 duel);不要碰 CSS
某個詞發音錯誤將其加入 prononcer,例如 {"Ledger": "Ledjer"}

相關技能