make-2d-video 스튜디오: 전체 비디오 파이프라인
음성 해설(및 선택적 스크립트)을 완성된 MP4로 변환합니다. 모든 프레임은 코드(HTML Canvas + Three.js)로 그려지고, 헤드리스 Chromium에서 프레임별로 캡처된 후 ffmpeg로 인코딩됩니다. 이미지나 비디오 생성 모델을 사용하지 않으므로 캐릭터는 일관성을 유지하고 텍스트는 선명하게 유지됩니다. 모든 스크립트에 대해 새로운 비주얼을 창조하며, 스타일만 고정됩니다.
번들 리소스(이 스킬의 기본 디렉토리):
kit/: 테스트된 스튜디오(렌더러, 엔진, 도구, 오디오,examples/reaction-time참조 프로젝트). 작업공간에make-2d-video-studio/로 설치합니다(references/install.md참조).references/install.md: 설치, 종속성 테이블, 의사 점검, 자체 테스트.references/style-bible.md: 룩(캐릭터, 세트, 조명, 카메라, 편집, 그래픽, 9:16 규칙, 금지 사항). 샷을 디자인하기 전에 전체를 읽으십시오.references/style-bible-toon.md: 툰 캐스트(cast: "toon")를 위한 룩. 캐스트가 toon인 경우, 충돌하는style-bible.md부분(림 라이트, 외곽선 없음, 검은 실루엣) 대신 이를 따릅니다.references/story-breakdown.md:story/bible.md및story/shots.json작성, 페이싱 규칙.references/engine-api.md: 장면 API, 설정 및 shots.json 스키마, 세 가지 키트 참조.references/sound-design.md: 음악 계획, SFX 라이브러리, 앰비언스 및 레벨.references/render-qc.md: 미리보기 및 최종 렌더링, 속도 가이드, QC 체크리스트, 문제 해결.
이 플러그인의 스테이지 명령은 한 스테이지를 재실행합니다: /new-video (스테이지 1–4), /video-styles (5), /render-video (6 및 8), /video-sound (7). 처음부터 끝까지 실행할 때는 이 파일을 따르고 각 스테이지가 필요로 할 때 참조를 로드하십시오.
황금 규칙
- 먼저 비디오 언어를 묻습니다. 다른 질문, 설치, 파일 또는 편집 전에 사용자에게 비디오가 어떤 언어인지 물어보십시오(스테이지 0). 이후 모든 단계는 해당 언어를 사용합니다. 사용자가 작성하는 언어로 사용자와 대화하십시오.
- 내레이션을 그대로 유지하십시오. 말로 된 단어를 다시 쓰거나, 추가하거나, 삭제하거나, 순서를 바꾸지 마십시오. 모든 샷은 화면에 표시되는 동안 말해지는 단어를 설명합니다.
- 같은 스타일, 새로운 그림. 이 스크립트에서 세트, 소품, 캐릭터 및 동작을 창조하십시오.
examples/reaction-time은 API를 배우는 데만 사용하십시오. - 말해진 내용을 문자 그대로 그리고 구체적으로 보여주십시오. 추상적인 대사는 시각적 은유, 다이어그램 또는 클로즈업 반응이 됩니다.
- 초안, 확인, 수정, 렌더링. 전체 렌더링 전에 직접 연락처 시트와 스틸을 여십시오(PNG 읽기). 렌더링은 느리고, 확인은 빠릅니다.
- 세 가지 사용자 체크포인트: 설정 선택, 렌더링된 샘플에서 스타일 선택, 최종 렌더링 전 미리보기. 사용자가 자리를 비우면 기본값을 사용하고, 가정된 사항을 명시한 후 계속 진행하십시오.
- 파일이 진실입니다. 각 비디오는
make-2d-video-studio/projects/<slug>/에 있으며,story/shots.json이 모든 타이밍을 소유합니다. 하나의 비디오 = 하나의 독립적인 폴더:config.json,input/,assets/(+ 선택되지 않은 AI 이미지를 위한assets/_raw/),scenes/,story/(plan.md핸드오프 노트 포함),timeline/,jobs/(+jobs/logs/),build/(임시, 삭제 가능),out/(전달물만). 비디오별 파일을 스튜디오 루트나 별도의_jobs/폴더에 절대 넣지 마십시오. - 스토리에 나오는 사람만 화면에 나타납니다(뉴스/설명자 비디오). 사용자가 요청하지 않는 한 채널 마스코트나 내레이터/호스트 캐릭터(예:
nhoc,ongdo)는 없습니다. 뉴스에 언급된 모든 이름 있는 사람은 자신의 툰(시그니처 헤어, 안경, 의상, style-bible-toon.md의 캐리커처 규칙에 따라)과 이름 레이블을 가지며, 일반적인 인물이나 실루엣이 아닙니다. 사적이거나 이름 없는 사람(미확인 용의자, 가족 구성원)은 익명으로 유지됩니다: 역할 레이블이 있는 일반적인 이름 없는 툰 또는 실루엣.
채널 기본값 (channel.json)
스테이지 0 전에, make-2d-video-studio/(스튜디오를 보유한 작업공간 폴더) 옆에서 channel.json을 찾은 다음, 현재 폴더, 그 다음 이 스킬의 기본 디렉토리(스킬과 함께 이동하는 복사본; 새 기기에서는 설치 후 스튜디오 옆에 복사)를 찾으십시오. name, lang, aspect, resolution, fps, style, cast (stick | 3d | toon), captions, shotsPerMin 및 music을 포함할 수 있습니다. 존재하는 모든 키는 이 비디오의 기본값입니다: 답변하는 질문(언어, 종횡비, 해상도, fps, 캡션, 스테이지 5의 스타일 선택)을 건너뛰고 대신 한 줄로 확인하십시오(예: "Kênh Tí Tò Mò: tiếng Việt, 9:16, 1080p, 30 fps, dusk, có phụ đề."). 여전히 알려지지 않은 것(음성 해설, 스크립트, 제목)만 물어보십시오. name은 엔드 카드용 채널 이름입니다.
세 가지 드로잉 스타일 (비디오당 하나의 캐스트 선택)
cast | 룩 | 엔진 | 스타일 바이블 |
|---|---|---|---|
stick (기본값) | 림 라이트, 분위기 있는 영화적 2.5D 세트가 있는 검은 막대 인물 | rig2d.js (+ 3D 설정 샷을 위한 three-kit.js) | style-bible.md |
3d | 3D 카툰 캐스트: 흰색 평평한 머리, 배 모양 몸체, 국수 팔다리 | rig3d.js, rig3d-cast.js (kind: '3d', rig3d: true) | style-bible.md → "2D 캐스트 또는 3D 캐스트" |
toon | 윤곽선 있는 평평한 2D 카툰: 둥근 피부색 머리, 콩 모양 몸체, 막대 팔다리, 두꺼운 윤곽선, 라인 보일, 만화 텍스트, 시각적 개그, 공인 캐리커처; 선택적 글로우가 있는 툰 셰이딩 3D 히어로 소품 | toon.js, toon3d.js | style-bible-toon.md |
channel.json → cast가 결정합니다; 그렇지 않으면 스테이지 1에서 한 번 묻습니다(스타일당 한 줄). toon의 경우 기본 색상 스타일은 paper입니다(영화적 그레이드도 작동하지만 평평한 색상을 어둡게 만듭니다). 툰 샷을 작성하기 전에 examples/toon-demo/를 연구하십시오.
뉴스 설명자 모드 (툰 캐스트, 채널의 주요 형식)
사용자가 뉴스/금융/기술/억만장자/투자 자산 설명자를 요청할 때, kit/CLAUDE.md를 따르십시오(make-2d-video-studio/CLAUDE.md로 설치됨). 아래 스테이지 1–8을 게이트 워크플로우로 대체합니다:
0 주제 선택(소스 강도, 위험 및 유통기한이 있는 3–5개 후보) ✋ → 1 소싱된 스크립트 + 3개 제목 + 썸네일 콘셉트 ✋ → 2a 음성 및 2b 자산 매니페스트(story/assets.md: 무엇을 그릴지, 개수, Flow / 사용자의 이미지 AI / 코드 툰 / three.js + 블룸으로 제작) ✋ → 3 이미지 + 캐릭터 시트 ✋ → 4 타이밍 + 장면 → 5 모든 샷의 연락처 시트 + 30초 데모 ✋ → 6 전체 렌더링 → 7 패키지(썸네일, 소스가 포함된 설명, 챕터, 오래된 줄 목록) ✋ → 8 업로드 ✋ → 9 통계 검토.
장면 이미지: 사람 없음, 텍스트 없음, 로고 없음. 썸네일: 사람 포함 가능(양식화, 실제 인물의 사실적인 가짜 절대 금지) 및 최대 4단어 텍스트. 감사되지 않은 프로젝트에서는 YouTube Data API를 통해 절대 업로드하지 마십시오(업로드가 비공개로 잠김); YouTube Studio 웹사이트를 통해 업로드하고, 비공개/예약으로 저장한 후 사용자의 명시적 동의가 있을 때만 게시하십시오. 로컬 Claude Code 세션에서는 모든 명령을 직접 실행하십시오. Windows 셸이 없을 때만 .bat 작업을 작성하십시오.
스테이지 0: 비디오 언어 (항상 먼저)
channel.json이 lang을 제공하면, 위의 한 줄 요약에서 묻는 대신 확인하십시오. 그렇지 않으면, 다른 것을 묻거나, 파일을 생성하거나, 설치하거나, 편집하기 전에 사용자의 언어로 정확히 하나의 질문을 하십시오. 예: "Video này dùng ngôn ngữ nào? (ví dụ: Tiếng Việt, English, 日本語…)". 가능하면 AskUserQuestion을 사용하십시오. 답변을 기다린 후, ISO 639-1 코드(vi, en, ja, ko, es, pt, de, fr, hi, …)로 매핑하십시오. 사용자가 이 대화에서 이미 비디오 언어를 언급했다면, 다시 묻지 말고 한 줄로 확인하십시오.
언어 코드는 전체 파이프라인을 구동합니다:
tools/new_project.py에--lang <code>(config.json→lang에 저장).tools/transcribe.py는 설정에서 이를 읽습니다.- 모든 화면 텍스트(타이틀 카드, 레이블, 단위, 표지판, 차트 캡션, 하드코딩된 캡션)는 이 언어로 작성되며, 짧고 올바른 철자와 전체 분음 부호가 사용됩니다. 말해진 내레이션을 번역하거나 변경하지 마십시오.
- 글꼴: 렌더러는 라틴, 라틴 확장 및 베트남어 글리프를 로드합니다.
vi의 경우 제목 글꼴이 자동으로 Nunito로 전환되어 악센트가 하나의 일관된 글꼴로 렌더링됩니다. 번들 글꼴이 포함하지 않는 스크립트(일본어, 한국어, 중국어, 아랍어, 힌디어, 태국어…)의 경우 사용자에게 알리고 QC 중에 텍스트 스틸을 주의 깊게 확인하십시오.
스테이지 1: 인테이크
언어가 알려진 후, 한 번 묻습니다(가능하면 AskUserQuestion 사용):
- 음성 해설 파일 (필수). 아직 녹음이 없습니까? VieNeu(MCP 도구가 연결된 경우)를 사용하여 하나를 만드십시오: 문장당 하나의 클립을 합성하고(
01.wav,02.wav, … 폴더에), 문장을 한 줄에 하나씩sentences.txt에 작성합니다(선택적|0.8일시 중지 또는|cham느리게 표시, [cười]와 같은 감정 태그는 줄에 남겨둠), 그런 다음python -I tools/join_segments.py <clip_dir> sentences.txt voiceover.wav. 고정된 일시 중지로 클립을 결합하고(VieNeu는 전체 스크립트가 제공되면 짧은 문장을 병합하고 일시 중지를 삭제함)voiceover.wav.script.txt를 작성합니다. 이는--script로 전달할 깨끗한 텍스트입니다. - 스크립트: 타임스탬프 포함(SRT/VTT/JSON/TXT with
[mm:ss]), 일반 텍스트(가장 좋음: 오디오에 정렬, 정확한 단어 유지), 또는 없음(전사됨). - 종횡비: 16:9 또는 9:16.
- 해상도: 720p / 1080p(권장) / 1440p / 2160p(4K). 더 높은 해상도는 렌더링 시간이 훨씬 오래 걸린다고 언급하십시오.
- 캡션: 9:16은 기본 켜짐, 16:9는 기본 꺼짐.
- 음악: 생성됨, 사용자 자체 파일, 또는 없음. SFX: 켜짐 또는 꺼짐.
- 제목.
- 캐스트(드로잉 스타일): stick / 3d / toon,
channel.json이cast를 제공하지 않는 경우.
색상 스타일에 대해 아직 묻지 마십시오. 기본값(channel.json이 말하지 않을 때): 16:9, 1080p, 24 fps, 생성된 음악 + SFX, 캐스트 stick, 스타일 dusk(툰의 경우 paper).
스테이지 2: 스튜디오 설치 또는 확인
references/install.md를 따르십시오: kit/를 작업공간의 make-2d-video-studio/로 복사하고(이미 있으면 건너뜀), 종속성을 설치하고, python tools/verify_kit.py 및 python tools/doctor.py를 실행한 다음, 예제 자체 테스트를 실행하십시오. 설치된 내용을 하나의 짧은 목록으로 보고하십시오. Windows에서 doctor가 ffmpeg를 winget 폴더에서만 찾으면 make-2d-video-studio/env.sh 및 env.ps1을 작성합니다. 렌더 및 믹스 명령 앞에 source env.sh &&를 접두사로 붙이십시오(설치 전에 시작된 셸은 새 PATH를 보지 못함).
스테이지 3: 프로젝트 + 타임라인
make-2d-video-studio/ 내에서 실행하십시오. python이 Python 3가 아닌 경우 python3을 사용하십시오.
사용 가능한 터미널이 없는 Windows(컴퓨터 사용은 파일 탐색기에서만 클릭 가능): 각 긴 단계를 사용자가 더블클릭하는 작업에 넣으십시오. tools/jobs/templates/full.ps1 + 2-full.bat를 projects/<slug>/jobs/에 복사하십시오. 모든 작업 .ps1은 $JobDir = $PSScriptRoot로 시작하고 ..\..\..\tools\jobs\common.ps1을 점-소스합니다($P, Run, Py, Say, Fail, Done을 제공하고 jobs/logs/<name>.log + <name>.status = RUNNING / OK / FAILED를 작성하며 Claude가 읽습니다). 공유 도우미: tools/jobs/set_duration.py(음성 해설에서 config.json duration 설정), tools/jobs/make_srt.py(timeline/sentences.json에서 out/<title>.en.srt 생성). Windows에서 스튜디오 설치/복구: tools/jobs/setup-studio.bat.
python tools/new_project.py --name <slug> --voice "<voiceover path>" [--script "<script path>"] --aspect 16:9 --resolution 1080p --fps 24 --style dusk --title "<title>" --lang <code> [--captions]
- 타임스탬프된 스크립트:
python tools/parse_script.py --project projects/<slug> --script projects/<slug>/input/script.<ext> - 일반 스크립트:
python tools/transcribe.py --project projects/<slug> --script projects/<slug>/input/script.txt --lang <code> --model small. 일치도는 ≥ 90%여야 합니다. 더 낮으면 사용자에게 스크립트와 오디오가 다르다고 알리십시오. - 스크립트 없음:
python tools/transcribe.py --project projects/<slug> --lang <code> --model small(느린 기계에서는base, 어려운 오디오의 경우large-v3).
timeline/transcript.txt를 확인한 후(끝이 음성 해설 길이에 가까워야 함), python tools/beats.py --project projects/<slug>를 실행하여 비트 시트와 초안 story/shots.json을 얻으십시오.
스테이지 4: 스토리 분석
references/style-bible.md(또는 툰 캐스트의 경우 references/style-bible-toon.md) 및 references/story-breakdown.md를 읽으십시오. story/bible.md(로그라인, 각각 하나의 시그니처 색상을 가진 캐스트, 분위기와 키 라이트가 있는 위치, 모티프, 음악 계획, 캐스트가 2D 막대 인물인지 3D 캐릭터인지)를 작성하십시오. scenes/cast.js를 작성하십시오. story/shots.json을 다시 작성하십시오: 연속적인 샷, 구문 경계에서 0.1–0.2초 일찍 컷, 새 위치당 설정 샷 하나, 각각에 대한 구체적인 scene 설명. 페이싱: 9:16 쇼츠는 분당 30–40 샷(중간값 1.5–2초); 긴 16:9 설명자는 15–25(중간값 2–3.5초)입니다. channel.json → shotsPerMin이 둘 다 재정의합니다. 사용자에게 5–10줄 계획 요약을 보내고 사용자가 반대하지 않으면 계속하십시오.
스테이지 5: 스타일 선택
channel.json이 style을 고정하면, 사용자가 요청하지 않는 한 비교 그리드를 건너뛰고 사용하십시오.
가장 많이 사용되는 1–2 세트와 대표 샷 3개(2명 이상의 캐릭터가 있는 와이드 샷, bigFace 클로즈업, 데이터/청사진 또는 3D 샷)를 구축하십시오. 그런 다음 렌더링하십시오:
node render.mjs --project projects/<slug> --styles dusk,midnight,golden,neon,storybook --at <t1>,<t2>,<t3> --scale 0.5
build/styles/style_grid.png를 연 다음, 스타일당 한 줄씩 보여주십시오: dusk(보라색 그림자, 호박색 키, 크림 림), midnight(차가운 네이비, 청백색 림, 소듐 프랙티컬), golden(따뜻한 오렌지와 틸), neon(깊은 블랙, 마젠타와 틸), storybook(부드러운 파스텔, 낮은 대비). 선택한 것을 config.json → style에 저장하십시오. 조정을 위해 engine/styles.js의 STYLES에 사용자 정의 항목을 추가하고(무드 오버라이드 + grade lift/gamma/gain, sat, 대비, 비네팅, 그레인, 블룸) 해당 행을 다시 렌더링하십시오.
스테이지 6: 모든 샷 구축
references/engine-api.md 및 examples/reaction-time/scenes/의 예제 장면을 한 번 읽으십시오. 8–12 샷 배치로 작업하십시오:
scenes/sets/<location>.js(재사용 가능,GY = E.H * V(0.8, 0.68)및CX = E.W/2에 고정, 프레임 너머로 확장된 벽, 바닥 및 하늘 포함) 및scenes/shots/NN_<name>.js를registerShot('<id>', {...})와 함께 shots.json의 id에 대해 작성하십시오.node render.mjs --project projects/<slug> --sheet --scale 0.5를 실행하여 연락처 시트를 .5 스케일로 만드십시오.- 연락처 시트를 열어서 오류(단단한 검정색, 투명한 캐릭터, 겹치는 텍스트, 잘못된 색상, 깨진 레이아웃)를 확인하십시오. 수정하고 다시 렌더링하십시오. 만족스러우면
node render.mjs --project projects/<slug> --stills 01_establishing,05_closeup을 실행하여 전체 해상도 스틸을 확인하십시오. - 각 샷에 대해 반복하십시오. 생성된 모든 파일을
build/에 보관하십시오(전체 렌더링에서 재사용됨).
스테이지 7: 사운드 디자인
references/sound-design.md를 읽으십시오. 음악을 생성하거나 사용자 파일을 준비하십시오. node render.mjs --project projects/<slug> --preview --sound를 실행하여 미리보기 비디오를 렌더링하십시오(기본 스타일, /128 스케일, 모든 SFX 및 음악 적용). 미리보기를 검토하십시오. SFX 위치를 조정하고(필요한 경우 수동으로 timeline/sfx.json 편집) node tools/jobs/mix_timeline.py --project projects/<slug>를 실행하여 최종 오디오 스템(out/<title>.wav)을 믹스하십시오.
스테이지 8: 최종 렌더링 + 패키징
node render.mjs --project projects/<slug> --final로 최종 비디오를 렌더링하십시오. 외부 오디오 파일(음성 해설, SFX, 음악)을 믹스하십시오:
ffmpeg -i build/<slug>.mp4 -i out/<title>.wav -c:v copy -map 0:v:0 -map 1:a:0 -shortest out/<slug>.mp4
out/<slug>.<ext>에서 완성된 비디오를 확인하십시오. QC 체크리스트(references/render-qc.md에 있음)를 실행하십시오.
스테이지 9: 제공
비디오 파일의 경로와 함께 "완료!" 메시지를 보여주십시오. 사용자가 직접 다운로드/공유할 수 있어야 합니다(예: "take it from out/" 말하기). 업로드가 요청되지 않는 한 업로드하지 마십시오.
일반적인 문제 해결
- 검은 프레임: 오디오 길이가 비디오 길이와 일치하지 않습니다.
timeline/transcript.txt의 끝을 확인하고tools/beats.py를 다시 실행하십시오. - 누락된 캐릭터:
scenes/cast.js가 올바르게 내보내지는지 확인하십시오. 캐릭터 ID가 shots.json과 일치하는지 확인하십시오. - 렌더링 속도: --scale 0.25로 미리보기 렌더링을 실행하고 느린 장면(많은 입자, 복잡한 3D)을 식별한 후 최적화하십시오.
- 메모리 부족: --parallel 1(기본값)로 설정하고 Chromium에 충분한 RAM을 할당하십시오(4GB+ 권장).
- 글꼴 없음: 번들되지 않은 스크립트의 경우 시스템에 글꼴을 수동으로 설치한 후 렌더러 설정을 업데이트하십시오.