Communitygithub.com

v01d3tr/slidegen-video

將使用者的腳本(包含 [n] 投影片標記、[file] 媒體和 [description] 描述的 .txt 檔案)與語音錄音,轉換成逐字同步旁白的動畫投影片影片,並以指定遊戲的真實圖示與美術風格呈現。

slidegen-video 是什麼?

這項技能可將文字腳本與語音錄音轉換為精美的動畫投影片影片。它會讀取包含特殊標記(如投影片分隔符號 `[1]`、嵌入媒體的 `[filename.mp4]`,以及描述提示的 `[描述性文字]`)的 .txt 腳本,並將其與語音錄音對齊。產出的影片會包含逐字同步旁白的動畫投影片,並從指定遊戲(如《魔獸世界》或《黑暗靈魂》)中取得真實的美術資源與圖示。這在建立以遊戲為主題的教學、評論或解說影片時特別有用。該技能由 GitHub 上 `v01d3tr/claude-skills` 儲存庫中的 `slidegen/` 資料夾提供支援,結合了 Python 腳本(用於分詞與對齊)和 Node.js 渲染器(使用 Playwright 與 ffmpeg)。一路走來,它會先在使用者自己的內容上產生六種遊戲風格的方向供使用者選擇,再進行任何渲染,從而確保最終影片符合使用者想要的視覺主題。它也負責處理資產獲取、智慧型投影片版面配置,以及根據使用者的腳本與語音錄音進行精確的提示時間調整。

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

在你喜歡的 AI 中提問

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

說明文件

指令稿 + 語音 → 動畫投影片影片(slidegen)

來自使用者(Michał)的輸入:

  • script.txt — 完整的旁白文字(可能直接貼在訊息中)。方括號標記:
    • [1]、[2]… — 投影片幀:投影片 n 從 [n] 執行到 [n+1]。由使用者選擇的硬邊界。如果腳本中沒有,則按主題分割(每個投影片一個想法,約 10–40 秒)。
    • [boss.mp4]、[mapa.png] — 使用者附加的媒體檔案;從旁白的那個點開始顯示。
    • [任何其他文字],例如 [obrazek z WoW pokazujący Lich Kinga] — 描述:找到相符的真實內容(請參閱資源)並從該點開始顯示。
  • 遊戲名稱 — 外觀必須直接或至少間接參考此遊戲;圖示/美術必須來自此遊戲(檔案名稱如 ds_bronie 暗示黑暗靈魂;從腳本中確認)。
  • 語音錄音(任何音頻/視頻)— 可能在腳本之前或之後到達;一旦到達就立即轉錄。

硬性規則:在渲染任何影片之前,在使用者自己的內容上顯示 6 種遊戲風格的視覺方向並等待他們的選擇(步驟 4)。看板只需要腳本。

程式碼:GitHub v01d3tr/claude-skills,資料夾 slidegen/(那裡的 README 列出了檔案)。script.py 標記 → 章節 → 時間 · align.py Parakeet TDT v3 → words.json · spec.json 由 Claude 編寫 · render.mjs Playwright Chromium + ffmpeg(僅捕獲移動的視窗,在其他位置保存,快取區段,看板)· template.html 主題 + 版面配置 · icons.py 官方 WoW 圖示 · assets.py 來自 GitHub 的遊戲美術。此技能本身的原始碼在同一個儲存庫中的 skills/slidegen-video/SKILL.md。

1. 設定(每個工作階段一次;如果 /home/claude/slidegen/render.mjs 已存在則跳過)

  1. 使用 add_repo 工具附加儲存庫(擁有者 v01d3tr,儲存庫 claude-skills;僅在將推送程式碼變更時設定 access: "push"),並依照工具指示將其克隆到 /home/claude/claude-skills。
  2. 安裝:
cp -r /home/claude/claude-skills/slidegen /home/claude/slidegen && cd /home/claude/slidegen && npm install
pip install -q --break-system-packages sherpa-onnx soundfile numpy
mkdir -p /home/claude/models && cd /home/claude/models && curl -sSL https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8.tar.bz2 | tar xj

如果無法存取儲存庫且使用者附加了 slidegen.zip,則將其解壓縮到 /home/claude/ 而不是。Playwright + Chromium 已預先安裝。從 shell 中,HuggingFace、Wowhead、wikis、Fandom 和遊戲 CDN 被封鎖;GitHub(git、API 搜尋、發行版)、npm 和 PyPI 可以運作。

2. 讀取腳本

mkdir -p /home/claude/proj && cd /home/claude/proj && cp "<script upload>" script.txt   # 或寫入貼上的文字;加上使用者附加的任何媒體檔案
python3 /home/claude/slidegen/script.py split script.txt   # 章節、字數、約略持續時間、媒體/描述標記、缺少的檔案

缺少媒體檔案 → 要求使用者附加它們(同時繼續)。如果錄音已經存在,現在就執行步驟 5 的 align.py + script.py align:它會顯示哪些腳本部分實際上被說出來了 — 不要將未說出的內容放在投影片上。

3. 規劃投影片、尋找資源、編寫 spec.json

使用者偏好先規劃:在打磨之前,發送一個簡短的大綱(投影片 n → 標題、版面配置、關鍵項目、媒體),除非他們說直接進行。大綱可以與風格看板(步驟 4)一起發送。

  • 每個 [n] 幀一張投影片。幀內的 [file]/[description] 標記成為從該詞開始的媒體投影片;如果剪輯結束後幀持續超過約 8 秒,則在其後添加一個內容投影片("at": "<片語>")。
  • 投影片開始:[3] 使用 "mark": "3",檔案使用 "mark": "m:boss.mp4",描述則按順序使用 "mark": "d:1"…(由 script.py 列印的鍵)。如果沒有 [n] 標記,則使用 "at": "<主題的前幾個詞>"。
  • 項目在敘述者提到它們的詞上提示:"at": "<1–3 個獨特的詞>"(模糊匹配;從投影片的開頭搜尋)。選擇 ASR 能正確識別的詞(檢查 transcript.txt),而不是被弄亂的專有名詞。
  • 標題 ≤ 約 26 個字元(自動縮小),說明 ≤ 約 35 個,每行圖示 ≤ 5 個,卡片 ≤ 4(有圖片時 3 個)。波蘭文需使用正確的變音符號;投影片總結,絕不轉錄。從腳本中拼寫名稱,絕不從 ASR。
  • 每個投影片一個實體(武器、職業、首領、構建)→ feature 版面配置;當旁白提到角色/敵人/NPC 時,在該提示處添加其全身 figure(使用者喜歡這個)。
  • 外觀欄位(theme、vars、bgImage、fonts)來自使用者在步驟 4 中選擇的方向。

規格格式(完整工作範例:slidegen/examples/dark-souls-bronie/spec.json):

{
  "series": "Dark Souls · najlepsze bronie PvE",
  "theme": "parchment", "vars": { "--accent": "#8c2a17" }, "bgImage": "art/Mapa_Lordran.webp", "fonts": ["marcellus-sc/400.css"],
  "boardThemes": [ /* 6 個方向,步驟 4 */ ],
  "audio": "voice.wav", "words": "words.json", "marks": "marks.json", "output": "out.mp4", "lead": 0.12,
  "slides": [
    { "mark": "1", "section": "1/4 Wstęp", "kicker": "Dark Souls · PvE", "title": "Najlepsze bronie", "layout": "icons",
      "items": [ { "icon": "icons/Zweihander.png", "tone": "fire", "label": "Zweihander", "caption": "siła" } ],
      "note": { "at": "według stylu", "text": "podział według stylu gry" } },
    { "mark": "3", "kicker": "Ulubieniec speedrunnerów", "title": "Black Knight Halberd", "layout": "feature",
      "feature": { "icon": "icons/Black Knight Halberd.png", "tone": "danger", "label": "BK Halberd", "caption": "quality / siła" },
      "figure": { "src": "art/black-knight-figure.jpg", "label": "Czarny Rycerz", "caption": "Darkroot Basin", "at": "czarnego rycerza" },
      "items": [ { "at": "czarnego rycerza", "icon": "icons/Black Knight Helm.png", "tone": "shadow", "label": "Drop z Czarnego Rycerza", "caption": "rzadki drop" } ] },
    { "mark": "m:boss.mp4", "layout": "media", "src": "boss.mp4", "caption": "Walka z bossem", "audio": true, "volume": 0.3, "clip": [12, 30] },
    { "mark": "d:1", "layout": "media", "src": "art/icc_raid.jpg", "kicker": "Raid", "title": "Icecrown Citadel", "kenburns": true },
    { "mark": "4", "layout": "meter", "items": [ { "at": "levelowanie", "value": 0.14, "tone": "nature", "label": "Levelowanie", "caption": "prosty i bezpieczny" } ] },
    { "at": "talenty", "layout": "stats", "items": [ { "at": "dziesiątym", "label": "10", "caption": "pierwszy punkt" } ] },
    { "at": "podsumowując", "layout": "hero", "kicker": "Podsumowanie", "title": "Szukamy magów", "subtitle": "serwer PvP, Horda" }
  ]
}
  • 提示形式:"at": "片語"、"at": 12.5、{"at": "片語", "offset": -0.3};"mark"(+ "markLead",預設 0.25 秒)。未提示的項目在標題後交錯進入;保持螢幕上的順序 = 列表順序(如果後面的項目會較早提示,請使用 offset)。
  • 版面配置:hero(大字標題 + 副標題)· icons(一行圖塊,標籤 + 說明;off: true 灰色並加刪除線)· cards(可選圖示、說明、徽章)· feature(feature: {icon,label,caption,tone,at} 大圖塊在左側 + 卡片在右側;可選的 figure: {src,label,caption,at} 高幀肖像在其提示處從最右側升起,--fig-pos = 物件位置)· meter(標記移動到每個卡片的 value 0–1,較早的卡片變暗;第二個 meter 投影片可以繼續)· stats(大數字)· media(圖片或剪輯;可選的 title/kicker;"fit": "full"、"contain": true、"kenburns": true;剪輯:"clip": [s,e]、"audio": true + volume(預設 0.35)將剪輯聲音混合在語音下,否則靜音;"mediaAt" 延遲它)。
  • tone:arcane、fire、frost、nature、holY、shadow、danger、neutral。

資源 — 來自指定遊戲的真實內容

  • WoW 圖示:python3 /home/claude/slidegen/icons.py find frostbolt lichking;icons.py get /home/claude/proj/icons <名稱>…(64×64,來自 WeakThorr/wowinterfaceicons 的約 14k 官方圖示,非商業粉絲使用)。法師專精:奧術 spell_holy_magicalsentry、火焰 spell_fire_firebolt02、冰霜 spell_frost_frostbolt02;首領通常是 achievement_boss_*。不確定名稱 → WebSearch "<法術> wowhead"。
  • 其他遊戲 / 較大的美術:python3 /home/claude/slidegen/assets.py search "<遊戲> icons" "<遊戲> item icons" "<遊戲> assets" "<遊戲> wiki" "<遊戲> fan site" "<遊戲> landing page" "<遊戲> loading screens";assets.py readme owner/repo(官方轉儲 vs 粉絲製作);assets.py ls owner/repo <正規表達式>;assets.py get owner/repo /home/claude/proj/art <路徑>…。粉絲 wiki / 粉絲網站 / 登陸頁面儲存庫是螢幕截圖、區域美術和角色渲染的最佳來源 — 使用多種語言的主題進行 grep(black|knight|caballero|rycerz)。也可以使用 npm(curl -s "https://registry.npmjs.org/-/v1/search?text=<遊戲>%20icons&size=20")。
  • 已知來源 — WoW:Jestokyzz/mod-loading-screen-16x9(88 個經典/TBC/WotLK 載入畫面 1920×1080,粉絲重製,帶邊框 + 標誌),Zogmaw/encounter-journal-images。黑暗靈魂 1:SlendyMawn/DarkSoulsItemIcons(所有 DSR 物品圖示,透明 PNG 約 185 px,Weapons/、Armor/、Consumables/…),ozankasikci/dark-souls-wiki(assets/images/{areas,armor,bosses,npcs,weapons,shields,rings,items};armor/*-set.jpg = 套裝中的全身圖,例如 black-knight-set.jpg = 黑騎士,180×342 → 放大 3 倍 Lanczos + 輕微銳化),LeaGaj04/dark-souls-hub(public/:營火 4K 44.jpg、Mapa_Lordran.webp、gwyn.jpg、artorias.jpg、solaire.jpg、OrnsteinSmough.jpg),ABDUSSALAM0005/dark-souls-ui(src/background.png 暗色羊皮紙,職業渲染)。
  • 透明物品圖示(黑暗靈魂風格):遊戲範圍的 vars "--icon-crop": "0%"、"--icon-pad": "7%"、"--icon-fit": "contain"、"--tile-bg": "radial-gradient(circle at 50% 42%,#2e2a25 0%,#141210 70%,#0a0908 100%)"、"--tile-border": "#4d463c"。WoW 圖示保留預設值(8% 邊框裁剪)。
  • 帶遊戲邊框/標誌的圖片作為媒體投影片:使用 PIL 預先裁剪到美術帶(1920×1080 WotLK 畫面:crop((437,340,1482,928)) → 1152×648);作為 bgImage 使用 --bgart-size: 200% auto; --bgart-pos: 50% 70%。不得顯示任何標誌。
  • 始終讀取每個獲取的圖片並確認它顯示了主題。永遠不要生成/繪製一個冒充遊戲美術的替代品;永遠不要對遊戲角色進行 image_search。
  • 未找到 → 最佳的真實備案(區域美術、護甲套裝人物、卡片上的圖示)+ 列出差距並附上連結(WebSearch),以便使用者可以附加檔案。
  • 告知使用者美術的來源(儲存庫名稱;說明何時為粉絲網站/重製版)以及這是發行商在粉絲內容條款下的智慧財產權。game-icons.net(gi:<名稱>,CC BY 3.0,署名)僅用於通用概念。

4. 風格看板 — 6 種遊戲風格方向,在任何渲染之前必需

構建 spec.boardThemes(最多 6 個){name, base, bgImage, fonts, vars};遊戲範圍的變數保留在 spec.vars 中。已使用的集合:黑暗靈魂(在範例規格中 — 使用者選擇了 2 · Mapa Lordranu:羊皮紙 + Lordran 地圖,--bgart-op .17 + Marcellus SC)和 WoW(Karazhan / Questlog / Nexus / Arena / Kirin Tor / Icecrown 在 WoW 載入畫面上)。為每個遊戲和主題建立一個新的集合。規則:

  • 方向 = base 結構 + 遊戲衍生的調色板(vars)+ 可選的真實背景美術(bgImage,使用 --bgart-op/-blur/-bright/-sat/-size/-pos 調整)+ 可選字型。以遊戲中的地點、陣營、元素或 UI 部分命名。
  • ≥ 4 個方向使用真實遊戲美術作為背景或模仿可識別的遊戲 UI 部分(任務日誌、庫存、地圖、載入畫面邊框)。所有 6 個方向必須明顯不同(置中/左對齊、淺色/深色、不同的美術)。
  • 使用繁忙美術的淺色基礎:--bgart-op 約 .17,較深的 --muted;設定 --fcap-color(功能說明)為深色強調色 — 色調顏色是為深色卡片設計的。
  • 字型僅使用 latin-ext(波蘭文):ls /home/claude/slidegen/node_modules/@fontsource/<f>/files | grep -c latin-ext > 0。可以:Cinzel、Marcellus SC、Pirata One、Cormorant Garamond、Oswald、Rajdhani、Inter。不可以:IM Fell English SC、Orbitron。其他:npm i -s @fontsource/<f>、"fonts": ["<f>/400.css"]、設定 --title-font/--label-font。
  • 基礎(template.html 中的 body[data-theme=…]):grimoire 暗色暖金 Cinzel 置中 · parchment 淺色紙張,深紅標題,深色卡片 · arcane 靛藍/青綠輝光,Rajdhani · esports 木炭色,Oswald,左對齊,標籤 kicker · codex 淺色編輯風格 Cormorant,左對齊 · frostforge 冷鋼藍,白冰 Cinzel。如果遊戲需要,可以添加一個基礎。

在 2 個最具代表性的投影片上執行(不同的版面配置;如果腳本依賴媒體投影片,則添加一個):

cd /home/claude/slidegen && node render.mjs /home/claude/proj/spec.json --board 1,3   # 沒有錄音也能工作

首先讀取 proj/build/board_*.jpg(溢出、文字覆蓋美術、標誌洩漏、錯誤圖示、低對比度),修正,然後 SendUserFile 兩者 + 大綱,要求一個數字或混合。停止並等待。 然後將選擇的方向複製到規格頂層:theme = base,vars = {...spec.vars, ...direction.vars}、bgImage、fonts。

5. 對齊錄音,渲染

cd /home/claude/proj
ffmpeg -v error -y -i "<recording upload>" -vn -ac 1 -ar 44100 voice.wav
python3 /home/claude/slidegen/align.py voice.wav words.json          # 約 0.1× 即時;寫入 transcript.txt
python3 /home/claude/slidegen/script.py align script.txt words.json  # marks.json;檢查 "low confidence" / "NOT FOUND"
cd /home/claude/slidegen
node render.mjs /home/claude/proj/spec.json --cues                    # 所有時間;修正 "Cue not found" / 奇怪的模糊匹配
node render.mjs /home/claude/proj/spec.json --preview 12.4,95.2       # 每個投影片最豐富的時刻 → build/preview_*.jpg,讀取它們
node render.mjs /home/claude/proj/spec.json --budget 540              # 前景,超時 600000;exit 3 = PARTIAL → 重新執行直到完成

即興發揮是可以的(對齊會跳過不匹配的詞);NOT FOUND 標記會從 transcript.txt 中取得一個片語作為 "at"。一個繁忙的 1 分鐘影片約在 40 秒內渲染;長時間的談話主要是保持(每 40 分鐘約 25–35 分鐘)。規格編輯只會重新渲染已變更的部分。

相關技能