렌더 — 음악, 사운드, 자막, 최종 내보내기
입력: videos/<video>/ 디렉토리와 승인된 storyboard.json (음성에 맞춰 조정됨: audio 및 timing 포함), 승인된 audio/voice-script.json. 출력:
audio/music.wav 선택 또는 생성된 음악
audio/mix.wav 최종 사운드트랙 (음성 + 덕킹된 음악 + SFX), -14 LUFS
audio/mix.json 모든 사운드 이벤트 (장면, 큐, 파일, 시간) — 확인용
render/final.mp4 1080x1920 (포맷 기준), 30 fps, H.264 + AAC
render/cover.png 풀 해상도 커버 / 썸네일
render/qc.json 품질 검사 보고서
이 단계는 시각적 요소나 단어를 변경하지 않습니다. 잘못된 애니메이션이나 타이밍 → 스토리보드 / 음성 해설 스킬. 기본적으로 무료: 라이브러리 또는 코드 생성 음악, 코드 생성 사운드 효과. 유료 음악 (AI 생성)은 사용자가 요청하거나 견적을 승인한 경우에만 사용합니다.
1단계 — 음악
- 스토리보드의
music.mood/notes와 비디오 길이를 읽습니다. studio/library/music/을 확인합니다 (index.json에는 분위기 태그, BPM, 라이선스가 포함된 트랙 목록이 있음). 가장 잘 맞는 트랙을 선택합니다. 없으면 그렇다고 알립니다.- 일치하는 항목 없음 → 무료 대체 음악을 생성하며, 리빌(reveal) 장면 시작 부분(장면 시작 시간 — 지속 시간/전환에서 계산)에 리프트("드롭")를 적용합니다:
node studio/scripts/make-music.mjs --out videos/<video>/audio/music.wav --duration <s> --mood upbeat|calm|cinematic|tense --bpm <n> --drop <s> [--silence <from>-<to>](tense: 단조, 심장 박동 맥박, 해결되지 않은 엔딩;--silence는 리빌 사운드 전 윈도우를 음소거합니다 — tense 분위기에서는 그 뒤에 시계 똑딱임이 따라옴). 유니버스 비디오의 경우:universe.json→music/sfx를 따릅니다. 라이브러리 트랙:audio/music.wav로 복사/변환합니다; 트리밍, 페이딩 및 덕킹은 믹스에서 처리됩니다. storyboard.json에 기록합니다 →music.file,music.source(트랙 + 라이선스, 또는 "code-generated"), 선택적music.db(덕킹 전 기본값 -16 dB).
2단계 — 사운드 효과
큐는 이미 각 장면의 sfx에 있습니다 (일반 단어로, 음성 해설 단계에서 프레임 또는 음성 단어에 고정됨). 믹서는 studio/library/sfx/index.json을 통해 단어를 사운드로 매핑합니다 (node studio/scripts/make-sfx.mjs로 생성됨; 사용자 정의 사운드는 custom에 있으며 먼저 확인됨). repeat + every는 큐를 여러 번 재생합니다; syncEnd: true는 큐를 장면 끝에 배치합니다; 라이저(risers)는 큐에서 끝납니다. 전환 후시(whoosh)는 옵트인(--auto-whoosh)입니다 — 사용자는 절제된 사운드를 선호합니다: 시그니처 순간에만 사용 (최대 약 2초당 1개 큐, 대부분의 전환에는 없음). 스토리보드에 큐가 훨씬 더 많으면, 믹싱 전에 핵심 순간으로 줄이고 그 사실을 알립니다. 믹서에서 "일치하는 사운드 없음" 라인이 나오면 키워드를 추가하거나 사용자 정의 사운드를 사용하여 수정합니다 — 스토리보드의 디자인을 변경하지 마십시오.
3단계 — 믹스
node studio/scripts/mix.mjs videos/<video> (--dry를 사용하면 먼저 이벤트 수를 미리 볼 수 있음)
음성이 상단에 유지되고; 음악은 음성에 의해 덕킹 (사이드체인)되며 끝에서 페이드 아웃됩니다; SFX는 -12 dB (--sfx-db 또는 storyboard.sfxDb); 마스터는 제한되고 -14 LUFS / -1.5 dBTP로 노멀라이즈됩니다. storyboard.finalAudio를 설정합니다. 오디오 변경 후 다시 실행합니다.
4단계 — 자막
소셜 포맷의 경우 기본적으로 활성화됩니다. storyboard.json에서:
"captions": { "enabled": true, "y": 83, "size": 50, "skipLines": ["L11"] }
- 구문 (≤ 4단어, 균형, 일시 중지에서 분할)은 음성 타이밍에서 가져옵니다; 말하는 단어는 브랜드의 강조 색상으로 강조 표시됩니다.
skipLines: 단어가 이미 화면에 표시된 VO 라인 (전화번호, URL).- 장치별:
captionY(프레임의 %)로 이동,captions: false로 동일한 단어가 화면에 있는 경우 숨깁니다 (예: 이름 로우더 서드). - 안전 영역 (기본 83%) 내에 유지하고 중요한 디자인 요소와 겹치지 않도록 합니다.
연락처 시트로 확인합니다 (자막은 누군가 말하는 프레임에 표시됨):
node studio/scripts/render.mjs videos/<video>/storyboard.json --sheet --scale 0.25 --out <scratchpad>/captions-sheet.png
한 번 확인하고 captionY / captions: false로 충돌을 수정합니다.
5단계 — 최종 렌더링, 커버, QC
node studio/scripts/render.mjs videos/<video>/storyboard.json --final
node studio/scripts/render.mjs videos/<video>/storyboard.json --cover
node studio/scripts/qc.mjs videos/<video>
QC는 통과해야 함: 해상도, 프레임 속도, 코덱, 길이 = 스토리보드, 라우드니스 -14 ±1.5 LUFS. 경고 (트루 피크, 무음 갭, 검은 프레임) → 설명 또는 수정. MP4를 시청하지 말고 render/final.mp4 (및 커버)를 QC 요약과 믹스 내용(음악 소스, 사운드 이벤트 수, 자막 켜짐/꺼짐)과 함께 사용자에게 보냅니다.
6단계 — 승인
사용자 만족 → storyboard.json에서 "status": "final" → render, 완료. 변경 사항: 음악/사운드/자막 조정 → 1~5단계 반복; 시각적 또는 타이밍 변경 → 스토리보드 / 음성 해설 스킬로 이동한 후 이 단계를 다시 실행합니다.