Communitygithub.com

v01d3tr/slidegen-video

将用户的脚本(包含 [n] 幻灯片标记、[file] 媒体和 [description] 标记的 .txt 文件)和语音录音转换为逐字同步旁白的动画幻灯片视频,并以指定游戏的真实图标/美术资源进行样式设计。

slidegen-video 是什么?

该技能可将用户提供的脚本和语音录音,自动生成为带有动画效果的幻灯片视频。用户脚本使用方括号标记(如 `[n]` 表示幻灯片分页,`[file]` 插入媒体文件,`[description]` 指定需匹配的游戏内美术资源或角色形象),系统将语音录音通过 Parakeet TDT v3 模型进行高精度转写,实现逐字与旁白同步。视频风格严格围绕用户指定的游戏主题,通过模板系统(如 grimoire、parchment、arcane 等)和真实的游戏图标(来自 WeakThorr/wowinterfaceicons 等仓库)、美术资源(来自粉丝站点、wiki、官方资源库)进行渲染,避免使用任何 AI 生成的替代图像。流程包括:自动分页、资产搜索与匹配、6 种风格面板生成(用户需选择方向后才可渲染)、语音对齐、以及最终视频合成。整个处理在 GitHub 仓库 v01d3tr/claude-skills 的 slidegen/ 目录下完成,依赖 Playwright Chromium、ffmpeg 和 sherpa-onnx 等工具。该技能适用于制作游戏攻略、知识讲解或叙事类视频内容,尤其适合需要高度风格化视觉呈现的场景。

兼容平台✓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] — 用户附加的媒体文件;从旁白中的该点开始显示。
    • [any other text], 例如 [obrazek z WoW pokazujący Lich Kinga] — 描述:查找匹配的真实内容(参见资产)并从该点开始显示。
  • 游戏名称 — 视觉效果必须直接或间接参考该游戏;图标/美术资源必须来自该游戏(文件名如 ds_bronie 暗示 Dark Souls;从脚本确认)。
  • 语音录音(任何音频/视频)— 可能在脚本之前或之后到达;到达后立即转录。

硬性规则:在渲染任何视频之前,先展示 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、wiki、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": "<phrase>")。
  • 幻灯片起始:[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 的拼写。
  • 每张幻灯片一个实体(武器、职业、Boss、构建)→ 使用 feature 布局;当旁白提及角色/敌人/NPC 时,在其提示词处添加全尺寸的 figure(用户喜欢这样)。
  • 外观字段(theme、vars、bgImage、fonts)来自用户在步骤 4 中选择的方向。

Spec 格式(完整工作示例: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": "phrase","at": 12.5,{"at": "phrase", "offset": -0.3};"mark"(+ "markLead",默认 0.25 秒)。未提示的项目在标题后错开显示;保持屏幕上的顺序 = 列表顺序(如果后面的项目会更早提示,则使用 offset)。
  • 布局:hero(大标题 + 副标题)· icons(行内平铺,标签 + 说明;off: true 灰色 + 划线)· cards(图标可选,说明,徽章)· feature(feature: {icon,label,caption,tone,at} 大块 tile 居左 + 卡片居右;可选 figure: {src,label,caption,at} 在其提示时在右侧升起的高框人物肖像,--fig-pos = object-position)· meter(标记移动到每个卡片的 value 0–1,较早的卡片变暗;第二个 meter 幻灯片可以继续)· stats(大数字)· media(图像或剪辑;可选标题/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 <name>…(64×64,来自 WeakThorr/wowinterfaceicons 的约 14k 官方图标,非商业粉丝使用)。法师专精:奥术 spell_holy_magicalsentry,火焰 spell_fire_firebolt02,冰霜 spell_frost_frostbolt02;Boss 通常为 achievement_boss_*。名称不确定 → WebSearch " wowhead"。
  • 其他游戏 / 较大美术资源:python3 /home/claude/slidegen/assets.py search "<game> icons" "<game> item icons" "<game> assets" "<game> wiki" "<game> fan site" "<game> landing page" "<game> loading screens";assets.py readme owner/repo(官方转储 vs 粉丝制作);assets.py ls owner/repo <regex>;assets.py get owner/repo /home/claude/proj/art <path>…。粉丝 wiki / 粉丝站点 / 登陆页面仓库是截图、区域美术资源和角色渲染的最佳来源——使用多种语言的主题进行 grep(black|knight|caballero|rycerz)。也可使用 npm(curl -s "https://registry.npmjs.org/-/v1/search?text=<game>%20icons&size=20")。
  • 已知来源 — WoW:Jestokyzz/mod-loading-screen-16x9(88 张经典/TBC/WotLK 加载画面 1920×1080,粉丝重制,带边框 + 徽标),Zogmaw/encounter-journal-images。Dark Souls 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 = Black Knight,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 深色羊皮纸,职业渲染)。
  • 透明物品图标(Souls 风格):游戏全局 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%。不允许显示徽标。
  • 始终检查获取的每张图像,并确认它显示了主题。绝不允许生成/绘制作为游戏美术展示的替代品;绝不允许通过图像搜索游戏角色。
  • 未找到 → 最佳真实后备(区域美术、防具套装人物、卡片上的图标)+ 使用链接(WebSearch)列出缺口,以便用户附加文件。
  • 告诉用户美术资源的来源(仓库名称;当是粉丝站点/重制时说明),并且这是发布者的 IP,受粉丝内容条款约束。game-icons.net(gi:<name>,CC BY 3.0,需注明出处)仅用于通用概念。

4. 风格面板 — 6 种游戏风格方向,在任何渲染之前必须完成

构建 spec.boardThemes(最多 6 个){name, base, bgImage, fonts, vars};游戏全局 vars 保留在 spec.vars 中。已生效的集合:Dark Souls(在示例 spec 中——用户选择了 2 · Mapa Lordranu:羊皮纸 + Lordran 地图在 --bgart-op .17 + Marcellus SC)和 WoW(WoW 加载画面上的 Karazhan / Questlog / Nexus / Arena / Kirin Tor / Icecrown)。为每个游戏和主题构建一个新的集合。规则:

  • 方向 = base 结构 + 游戏衍生的调色板(vars)+ 可选的真实背景美术(bgImage,通过 --bgart-op/-blur/-bright/-sat/-size/-pos 调整)+ 可选字体。以游戏中的地点、派系、元素或 UI 部件命名。
  • 6 个中至少有 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 发送给用户,询问编号或混合方案。**停下来等待。**然后将选择的方向复制到 spec 顶层:theme = 基础,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;退出代码 3 = 部分完成 → 重新运行直到完成

即兴发挥没问题(对齐会跳过不匹配的单词);NOT FOUND 标记会得到来自 transcript.txt 的短语作为 "at"。一个繁忙的 1 分钟视频约在 40 秒内渲染;长篇论述主要是保持(约 25–35 分钟每 40 分钟)。Spec 编辑只重新渲染更改的部分(生成不会超过 90 秒)。

6. 交付

zip -j /home/claude/proj/out.zip /home/claude/proj/out.mp4 /home/claude/proj/build/*.spec.json /home/claude/proj/transcript.txt

然后通过 SendUserFile 发送 /home/claude/proj/out.mp4 和 /home/claude/proj/out.zip。同时粘贴一个短的渲染摘要(实际时长、幻灯片数量、使用的布局、来源的资产)。

故障排除标志

症状对策
语音不同步重新运行 align.py + script.py align;检查 voice.wav 采样率;调整 lead
字体未加载npm i -s @fontsource/<name>@5 并重新构建
图标未找到icons.py find <term>;尝试粉丝站点仓库
媒体幻灯片空白检查文件路径、clip 值(秒)、contain/fit

由 v01d3tr/claude-skills 提供,DVD-style game-video renderer

相关技能