指令稿 + 語音 → 動畫投影片影片(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 已存在則跳過)
- 使用 add_repo 工具附加儲存庫(擁有者
v01d3tr,儲存庫claude-skills;僅在將推送程式碼變更時設定access: "push"),並依照工具指示將其克隆到/home/claude/claude-skills。 - 安裝:
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(標記移動到每個卡片的value0–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/:營火 4K44.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 分鐘)。規格編輯只會重新渲染已變更的部分。