스크립트 + 음성 → 애니메이션 슬라이드 영상 (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같은 파일 이름은 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가 있으면 건너뜀)
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은 사전 설치되어 있습니다. 셸, HuggingFace, Wowhead, 위키, 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": "<topic의 첫 단어>"를 사용합니다. - 항목은 내레이터가 이름을 지정하는 단어에서 큐됩니다:
"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": "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}큰 타일 왼쪽 + 카드 오른쪽; 선택 사항figure: {src,label,caption,at}큐에서 오른쪽 끝에 솟아오르는 키 큰 프레임 초상화,--fig-pos= object-position) ·meter(마커가 각 카드의value0–1로 이동, 이전 카드는 희미해짐; 두 번째 미터 슬라이드는 계속 가능) ·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 <name>…(64×64, ≈14k 개의 공식 아이콘,WeakThorr/wowinterfaceicons에서, 비상업적 팬 사용). 마법사 전문화: 비전spell_holy_magicalsentry, 화염spell_fire_firebolt02, 냉기spell_frost_frostbolt02; 보스는 종종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>…. 팬 위키 / 팬 사이트 / 랜딩 페이지 저장소는 스크린샷, 지역 아트 및 캐릭터 렌더링의 가장 좋은 소스입니다. 여러 언어로 주제를 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/: 모닥불 4K44.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%사용. 로고는 표시되지 않을 수 있습니다. - 가져온 모든 이미지를 항상 읽고 주제를 보여주는지 확인하십시오. 게임 아트로 제시된 대체물을 생성/그리지 마십시오. 게임 캐릭터를 image_search하지 마십시오.
- 찾을 수 없음 → 최상의 실제 대체물(지역 아트, 방어구 세트 피규어, 카드의 아이콘) + 사용자가 파일을 첨부할 수 있도록 링크(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(예시 사양에서 — 사용자가 2 · Mapa Lordranu를 선택함: 양피지 + Lordran 지도 --bgart-op .17 + Marcellus SC) 및 WoW(카라잔 / 퀘스트로그 / 넥서스 / 투기장 / 키린 토 / WoW 로딩 화면의 Icecrown). 게임과 주제별로 새로운 세트를 빌드합니다. 규칙:
- 방향 = 기본 구조 + 게임에서 파생된 팔레트(
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하고 번호 또는 혼합을 요청합니다. 멈추고 기다리십시오. 그런 다음 선택한 방향을 사양 최상위 레벨에 복사합니다: 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; 종료 3 = PARTIAL → 완료될 때까지 재실행
애드립은 괜찮습니다(정렬이 일치하지 않는 단어를 건너뜀); NOT FOUND 마크는 transcript.txt의 구문과 함께 "at"를 얻습니다. 1분 분량의 비디오는 ~40초 만에 렌더링됩니다. 긴 대화는 대부분 홀드입니다(40분당 ≈25-35분). 사양 편집은 변경된 슬라이드만 다시 렌더링합니다.
6. 전달
.mp4 및 .txt(스크립트에 기반한 자막 파일)를 사용자에게 보냅니다. 비디오를 2~3번 시청하고, 만족스러우면 마무리하고, 그렇지 않으면 구체적인 수정 사항을 묻습니다.