animation-studio: 아이디어 → 대본 → 음성 → 안전한 렌더링 → MP4
이 파일은 라우터입니다. 네 가지 큰 질문을 하고, 하드웨어를 확인한 후, 작업에 필요한 파일만 로드합니다:
content/<pack>.md (글쓰기 및 정확성 규칙) + styles/<style>.md (외관; JSON 블록은 엔진이 읽는 프리셋) + engines/<engine>/README.md (렌더링 방법). 공유 도구는 shared/에 있습니다.
스킬 폴더(SKILL_DIR) 찾기 = 이 파일이 포함된 폴더입니다. Claude Code는 이를 스킬의 기본 디렉토리로 표시합니다. 다른 에이전트의 경우: 읽으라고 지시받은 SKILL.md의 폴더입니다. 항상 "$SKILL_DIR/shared/..."와 같이 따옴표로 경로를 감싸 도구를 호출하세요(경로에 공백이 포함되는 경우가 많음). Python 3.10+(python3, python 또는 py -3)을 찾아 PY라고 부릅니다. setup_check.py --install 이후에는 출력된 venv python을 사용하십시오.
작업 목록을 사용자에게 계속 알려주십시오. 모든 산출물은 사용자의 작업 폴더 내 videos/<slug>/에 작성하십시오(slug = 짧은 소문자-하이픈 이름). 평이한 언어로 설명하십시오.
이 버전에서 작동하는 것
| 부분 | 상태 |
|---|---|
| 콘텐츠 팩 | ✅ 성경 (content/bible.md) · ✅ 기술 (content/tech.md) · ✅ 일반 스토리/광고 (content/general-story.md) · ✅ 수학/교육 (content/education-math.md) |
| 스타일 | 엔진 A: ✅ 스틱맨 · ✅ 플랫 2D · ✅ 동화책 · ✅ 화이트보드 · ✅ 모던 벡터 — 엔진 B: ✅ Manim (+ 화이트보드/모던 벡터 색상) — 엔진 C: ✅ 툰 3D — 엔진 D: ✅ 시네마틱 3D |
| 엔진 | ✅ A py2d (Python 2D) · ✅ B Manim (LaTeX 선택 사항) · ✅ C 툰 3D (느림: 티어 제한) · ✅ D Blender (Eevee 미리보기, Cycles 최종 렌더링 POWER) |
| 포맷 | ✅ 9:16 · ✅ 16:9 · ✅ 1:1 · ✅ 4:5 |
| 자막 | ✅ 항상 .srt + 스타일이 적용된 번인 및 단어 강조 (shared/captions.py) |
| 음성 | ✅ 사용자 녹음 · ✅ Piper TTS (shared/voice.py, 무료, 오프라인) |
| 음악/SFX | ✅ 합성 (shared/sound.py) · ✅ 사용자 소유 라이선스 음악 파일 |
| 편집기 프로젝트 | ✅ Kdenlive · ✅ Shotcut · ✅ DaVinci Resolve (FCPXML) · ✅ Blender VSE · 🧪 OpenShot (실험적) · ✅ 편집기 팩 (CapCut, 모든 편집기) |
| 브랜드 키트 | ✅ 저장된 브랜드 (사용자 폴더), 워터마크, 로워 서드, 브랜드 엔드 카드, 모든 스타일에 브랜드 색상 적용 (shared/brand.py, docs/branding.md) |
| 소프트웨어 설치 | ✅ 하나의 검증된 레지스트리 (shared/tools.yaml) (Windows, macOS 및 각 Linux 배포판에 대한 명령어 포함); 동의 없이 설치하지 않음 |
사용자가 🚧 항목을 선택하면, 솔직하게 말하고 가장 가까운 ✅ 옵션을 제안한 후 스크립트 패키지는 여전히 제공합니다.
1단계: 입력 수집 (AskUserQuestion, 호출당 최대 4개 질문; 이미 답변된 항목은 건너뛰기)
호출 1
- 콘텐츠: 성경 이야기 · 기술/프로그래밍 · 수학/교육 · 일반 스토리/광고
- 스타일: 먼저 콘텐츠의 기본 스타일을 제안(성경 → 동화책 · 기술 → 모던 벡터 · 수학 → Manim · 일반 → 플랫 2D), 그 다음 2~3가지 다른 스타일을 제안하십시오. 빠르고 가벼운 작업에는 스틱맨을 언급하십시오.
- 포맷(들) (다중 선택): 9:16 1080x1920 (TikTok/Reels/Shorts) · 16:9 1920x1080 (YouTube/프로젝터) · 1:1 1080x1080 · 4:5 1080x1350.
PY shared/formats.py table은 플랫폼 테이블을 출력합니다. - 품질: 미리보기 (빠름, 720p) · 최종 (1080p). 먼저 5초 미리보기를 권장합니다.
호출 2 (해당되는 항목만)
0. 브랜딩? 없음 · 저장된 브랜드 사용 (PY "$SKILL_DIR/shared/brand.py" list 목록) · 새 브랜드 생성. 새 브랜드 생성: 각 필드를 한 번에 하나씩 묻고, 모두 선택 사항입니다(이름, 태그라인, 웹사이트, 로고 파일, 전화번호, WhatsApp, 이메일, 소셜 미디어, 색상, OFL 글꼴, CTA). 각 항목은 brand.py set으로 저장합니다(전화번호/이메일/URL/색상 형식 검증); 로고는 brand.py logo, 글꼴은 brand.py font를 사용합니다. 연락처 정보를 절대 임의로 만들지 마십시오: 사용자가 제공한 것만 사용합니다(또는 사용자 자신의 웹사이트에서 확인). 그런 다음 옵션을 묻습니다(기본값은 docs/branding.md 참조): 워터마크 (광고/프로모션 켜짐; 성경, 기술 및 수학 꺼짐), 모서리/크기/불투명도/로고 또는 로고+이름 · 로워 서드 (언제, 얼마나 오래) · 엔드 카드 (광고/프로모션 켜짐) CTA + 연락처 및 길이 · 스타일을 브랜드 색상으로 다시 칠하기 (예/아니오).
5. 주제/이야기 및 길이 (30초 · 60초 · 90초 · 2~3분; 다른 길이는 "기타" 입력). 콘텐츠 팩은 고유한 옵션을 추가합니다(성경: 대상).
6. 음성: 내 녹음 (기본값) · Piper TTS (무료, 오프라인; 기본 음성 en_US-ljspeech-medium, 공개 도메인 데이터). Piper는 일회성 설치(setup_check.py --tts --install)와 음성 다운로드(voice.py --download, 약 60MB)가 필요합니다: 먼저 물어보십시오.
7. 자막 번인? 9:16 및 1:1(대부분의 사람들이 음소거 시청)에는 예를 제안하고, 16:9에는 아니오를 제안하십시오. .srt 파일은 항상 생성됩니다.
8. 엔드 카드 "Made with animation-studio"? 기본적으로 꺼짐; 옵트인만 허용됩니다. 워터마크를 절대 추가하지 마십시오.
9. 출력: 완성된 MP4 · 편집기용 프로젝트 파일 · 둘 다.
편집기 선택 (출력에 프로젝트 파일이 포함된 경우에만): PY "$SKILL_DIR/shared/tools.py" status --kind editor를 실행하고 전체 번호 목록을 보여주십시오(✅ 설치됨 + 버전 · ❌ 설치되지 않음 · ⚠️ 여기서 지원되지 않음, 예: 헤드리스 서버의 데스크톱 편집기). 사용자는 정확히 하나를 선택합니다(AskUserQuestion: 설치된 편집기를 먼저 표시하고 최대 4개 옵션; 나머지는 "기타" 아래에 입력 가능). 선택이 ❌인 경우, PY "$SKILL_DIR/shared/tools.py" flow <editor>를 그대로 보여주고(설명, 현재 OS/배포판/셸에 대한 설치 명령어, 공식 링크) 다음을 묻습니다: 지금 설치 (제가 실행하겠습니다) · 직접 설치한 후 "완료"라고 말씀해 주세요 · 다른 편집기 선택 · 건너뛰기, MP4 + 편집기 팩 제공. "지금 설치" → tools.py install <editor> --yes (Windows에서 권한 프롬프트가 표시되거나 sudo가 필요한 단계가 있다면 먼저 말하십시오; sudo 단계는 ! sudo ...로 사용자에게 전달). 설치 또는 "완료" 후: status를 다시 실행하고, ✅를 확인한 후 중단했던 곳에서 계속 진행하십시오. CapCut 및 지원되지 않는 편집기는 편집기 팩을 받습니다. 자세한 내용: docs/editors.md.
답변을 videos/<slug>/brief.md에 기록하십시오.
2단계: 하드웨어 확인 (렌더링 전, 절대 건너뛰지 않음)
PY "$SKILL_DIR/shared/hwcheck.py"를 실행하고 표와 티어를 짧은 메시지로 보여주십시오. 또한 이후 모든 단계에서 읽는 시스템 프로필(OS + 버전, WSL, Apple Silicon, Linux 배포판 및 제품군, 패키지 관리자, 셸, 디스플레이)을 저장합니다. 표시하거나 실행하는 모든 설치 명령어는 PY "$SKILL_DIR/shared/tools.py" cmd <tool>에서 가져와야 합니다(이 OS, 배포판 및 셸에 일치); 절대 기억에서 명령어를 입력하지 마십시오. 디스플레이 없음(헤드리스) → 렌더링 전용: 편집기 앱 없음.
| 티어 | 규칙 | 엔진 | 제한 |
|---|---|---|---|
| LITE | RAM < 12 GB 또는 CPU 스레드 < 4개 | A, B | 720p만 가능; 툰 3D 및 Blender 차단 (스틸 이미지 제공) |
| STANDARD | 중간 | A, B 전체; C ≤ 5초 미리보기 (더 긴 시간은 확인 + 재개 필요); D Eevee ≤ 5초, 720p, 낮은 샘플 | 렌더링 작업 1개; 워커 = 스레드 수 − 2 |
| POWER | RAM ≥ 32 GB + 전용 GPU VRAM ≥ 6 GB | 모두, GPU에서 Cycles | 워커 = 스레드 수 − 1 |
노트북이 배터리로 작동 중인 경우, 1분 이상의 렌더링 전에 경고하십시오. 사용 가능한 RAM이 25% 미만인 경우, 사용자에게 큰 앱을 닫도록 요청하십시오.
3단계: 엔진 선택 (스타일 → 엔진), 파일 로드
| 스타일 | 엔진 | 로드 |
|---|---|---|
| 스틱맨, 플랫 2D, 동화책, 화이트보드, 모던 벡터 | A engines/py2d | styles/<style>.md, engines/py2d/README.md |
| Manim (수학, 알고리즘, 다이어그램); 화이트보드/모던 벡터 색상도 여기서 작동 | B engines/manim | styles/manim.md (또는 선택한 스타일), engines/manim/README.md |
| 툰 3D | C engines/toon3d (story.js + world.js가 포함된 프로젝트 폴더) | styles/toon-3d.md, engines/toon3d/README.md |
| 시네마틱 3D | D engines/blender (scene.json, Z up) | styles/cinematic-3d.md, engines/blender/README.md |
티어가 엔진을 차단하는 경우, 이유를 설명하고 다음을 제안하십시오: 엔진 A 스타일의 동일한 이야기, 또는 몇 장의 스틸 이미지만. 사용자는 명확한 경고("컴퓨터가 멈추거나 과열될 수 있습니다; 작업을 먼저 저장하십시오") 후에만 제한을 무시할 수 있습니다.
그런 다음 content/<pack>.md를 로드하고 연구 및 쓰기 단계를 따르십시오.
4단계: 스크립트 패키지 (콘텐츠 팩 규칙), 그런 다음 중지
모든 팩은 다음을 제공합니다: 복사 가능한 블록의 내레이션(팩에 다른 설명이 없는 경우 약 초당 3.7단어) 및 단어 수와 길이 → script.txt; 샷 목록 → shotlist.md; 팩 추가 항목(성경: 충실도 표, 연구 노트, 설명); 마지막에 출처. 구절, 인용문, API, 플래그, 버전 또는 사실을 절대 임의로 만들지 마십시오: 가져오거나 실행한 후, 그렇지 않으면 미검증으로 표시하십시오.
그런 다음 음성 해설(사용자 녹음: mp3/wav, 음악 없음)을 전달받고 오디오를 기다리십시오. 사용자가 스크립트만 원하는 경우 여기서 중단하십시오.
5단계: 제작
- 설정:
PY "$SKILL_DIR/shared/setup_check.py" --engine <engine>→ ✅/❌ 표. 누락된 도구(Blender, Manim, Node, LaTeX, Inkscape...)는 편집기와 동일한 흐름을 사용합니다:tools.py flow <tool> --for engine을 표시한 다음 지금 설치 · 직접 설치한 후 "완료"라고 말씀해 주세요 · 다른 스타일 선택 · 건너뛰기 (스크립트, 샷 목록 및 참조만); 이후 재확인하십시오. Python 패키지는 스킬 자체.venv에만 설치됩니다(--install, 동의 후). - 음성 + 타이밍. Piper:
PY "$SKILL_DIR/shared/voice.py" script.txt voice.wav --timing work --speed 0.85(정확한 구문 시간, 추측 금지). 사용자 녹음:PY "$SKILL_DIR/shared/timing.py" voice.mp3 script.txt --out work. 둘 다work/words.json+work/phrases.json을 작성합니다. - 씬: 엔진 A:
videos/<slug>/scene.json; 엔진 B:from studio import *로 시작하는 Manim.py씬; 엔진 C:videos/<slug>/story.js+world.js; 엔진 D: Blenderscene.json(형식은 엔진 README에 있음). 구문당 한 샷; 선택한 모든 포맷의 안전 영역 내에 얼굴, 텍스트 및 주요 소품을 유지하십시오(shared/formats.md). - 룩 확인: 포맷당 3~6장의 스틸 이미지 렌더링(
--frames 0,60,...), 접촉 시트 생성(PY "$SKILL_DIR/shared/sheet.py" sheet.jpg <dirs> --safe <fmt>), 표시하고 콘텐츠 팩의 규칙과 대조하여 확인하십시오(성경: 경외 + 폭력). 렌더링 전에 수정하십시오. - 예상:
PY "$SKILL_DIR/shared/estimate.py" --engine <engine> scene.json --fmt <fmts> --quality <q>(Manim:--engine manim scene.py --name SceneName --timing work/phrases.json; Toon 3D:--engine toon3d <project folder>; Blender:--engine blender scene.json) →DECISION: OK렌더링 ·ASK사용자에게 "약 X분, Y GB 소요"라고 알리고 질문(5초 미리보기 제공) ·REFUSE디스크 공간 부족(예상치의 2배 필요): 사용자에게 공간 확보 요청. - 렌더링 한 번에 한 포맷씩(동시에 두 작업 금지). 긴 렌더링은 백그라운드에서 실행됩니다. 엔진은 낮은 우선순위로 실행되고, 다시 실행하면 마지막으로 저장된 프레임부터 재개되며, 사용 가능한 RAM이 15% 미만으로 떨어지면 자동으로 일시 중지됩니다(종료 코드 4). 사용자에게 계속 작업할 수 있다고 알리십시오.
- 오디오: 음악
PY "$SKILL_DIR/shared/sound.py" music music.wav --seconds <video length> --mood warm|calm|tense|tech|playful, SFX... sfx sfx.wav --seconds <len> --cues cues.json(팝, 우슉, 타자, 차임, 성공, 팽창, 빗소리, 부드러운 천둥), 그런 다음PY "$SKILL_DIR/shared/mix.py" voice.wav music.wav sfx.wav --music-db -12 --sfx-db -10 --seconds <len>(음악은 음성보다 -6dB 이상 크지 않음; 대화가 많거나 경건한 비디오의 경우 -9 ~ -12dB). 사용자가 제공한 음악 파일은 music.wav를 대체합니다: 사용자에게 권리를 소유해야 한다는 점을 한 번 상기시키십시오. 7b. 브랜드 (선택된 경우): 렌더링 전에 색상 재지정(brand.py recolor <brand> --style <style> --out style_<brand>.md, 씬의 스타일로 사용); 렌더링 후brand.py apply <brand> frames_<fmt> branded_<fmt> --fmt <fmt> [--watermark tr,9,90,logo] [--lower-third a,b] [--end-card 2.5 --cta "..."] [--captions]를 사용하고 이후부터branded_<fmt>를 사용하십시오. 엔드 카드가 있는 경우--seconds <new length>로 오디오를 믹싱하십시오. - 자막 + 마무리 + QA:
PY "$SKILL_DIR/shared/captions.py" work out/<Title> --style <style> --fmt <fmt> --quality <q>(→.srt+_<fmt>.ass), 그런 다음PY "$SKILL_DIR/shared/finish.py" frames_<fmt> out/<Title>_<fmt>.mp4 --audio mix.wav --quality <q> [--ass out/<Title>_<fmt>.ass] --srt out/<Title>.srt [--end-card 옵트인된 경우에만]. QA 라인(검은색/정지 스팬, 약 -14 LUFS)을 확인하고_qa.jpg시트를 살펴보십시오. - 편집기 프로젝트 (선택된 경우):
PY "$SKILL_DIR/shared/editors.py" prepare --frames frames_<fmt> --shots "<f0>-<f1>:<name>,..." --final out/<Title>_<fmt>.mp4 --voice voice.wav --music music.wav --sfx sfx.wav --srt out/<Title>.srt --out videos/<slug>/editor그런 다음... export videos/<slug>/editor/timeline.json --editor <kdenlive|shotcut|openshot|resolve|blender-vse|pack>. 확인 표를 표시하십시오(타이밍이 MP4와 일치해야 함; Kdenlive/Shotcut은 2초 melt 렌더링도 얻음). 사용자에게 여는 방법을 알려주십시오(docs/tools/.md). - MP4, .srt, (있는 경우) 편집기 프로젝트, 각 샷이 표시하는 내용을 설명하는 한 줄을 전달하십시오. 선택적 엔드 카드는 사용자가 옵트인한 경우에만 포함됩니다.
안전 규칙 (항상)
- 2단계와 5단계(예상) 없이 렌더링을 시작하지 마십시오. 항상 "먼저 5초 미리보기"를 제공하십시오.
- 티어 제한을 준수하십시오. 무시는 명확한 경고와 동의 후에만 가능합니다.
- 한 번에 하나의 무거운 작업만 수행하십시오. 묻지 않고 사용자 파일을 삭제하거나 덮어쓰지 마십시오(기존 프레임 폴더에 다시 렌더링하면 재개됨;
--force는 덮어쓰므로 물어보십시오). - 도구가 없거나 사용자가 설치를 거부하는 경우에도 스크립트, 샷 목록 및 참조는 계속 제공하십시오.
크레딧 및 라이선스
코드: MIT (LICENSE 참조). 번들된 타사 코드는 THIRD_PARTY_NOTICES.md에 나열됩니다. 이 스킬은 글꼴, 음악 또는 이미지를 번들로 제공하지 않습니다: 시스템 글꼴과 합성 사운드를 사용합니다. 사용자의 비디오는 사용자의 것입니다: 강제 워터마크 없음; 엔드 카드는 옵트인입니다.