영화 같은 과학 단편 영화 · 통합 제작 규격 v1
출처: 《사피엔스 · 우주의 자화상》(4K / 4'58" / 14장면)과 《아래로 · DESCENT》(2K / 1'30" / 90초 수직 프로필). 두 영화의 규격, 워크플로우, 스타일, 그리고 겪었던 시행착오를 모두 여기에 정리했습니다. 새 영화는 먼저 섹션 0, 1을 읽고, 그 다음에 이번 작업과 관련된 장을 읽으세요.
0. 불문율(어기면 무조건 재작업)
- 소리를 먼저 정하고, 영상을 그 다음에 정합니다. 내레이션 문장 단위로 생성 → 길이 측정 → 길이로부터 각 장면의 프레임 수를 역산합니다. 절대 영상을 먼저 편집한 후 소리를 입히지 않습니다.
- 내레이션과 데이터는 반드시 일치해야 합니다: 영상에 등장하는 숫자, 단위, 규모는 사실 테이블과 항목별로 대조합니다. 내레이션에서 98이라고 하면, 화면에 90이라고 쓰면 안 됩니다. 단위 오류(예: 압력 atm ↔ t/m²)는 색상 배치 오류보다 훨씬 심각합니다.
- 하나의 장면에는 하나의 정보만 담습니다: 각 장면에는 하나의 주제 + 최대 3개의 수치만 허용됩니다. 나머지 정보는 내레이션에 맡깁니다.
- 텍스트는 항상 읽을 수 있어야 합니다: 모든 텍스트 아래에는 배경 또는 어두운 영역이 있어야 합니다. 레이어 이름 ≥ 30px, 수치 ≥ 13px. 작은 글씨는 투명도 0.6 이상을 유지합니다.
- 무조건 부드럽게 전환합니다: 장면 간에는 디졸브/블랙으로 숨 고르기/연속적인 움직임을 사용합니다. 같은 영화 내에서는 한 가지 전환 방식만 사용해야 합니다.
- 무음 렌더링: Remotion 안의
<Audio>는 모두{false && ...}로 꺼둡니다. 오디오는 ffmpeg로 외부에서 합성합니다(긴 WAV는 오디오 전처리에서 렌더링이 멈출 수 있습니다). - 렌더링 전에 반드시
npx tsc --noEmit을 실행하여 오류가 없는지 확인합니다. 그렇지 않으면 많은 프레임이 손상되어 다시 렌더링해야 합니다. - 납품 전 세 가지 확인: 전체 길이 확인, 첫 프레임과 마지막 프레임 확인, 주요 전환 장면의 프레임 단위 확인(각 전환당 3–6 프레임).
1. 표준 파이프라인(순서대로, 건너뛸 수 없음)
script.json ──► VO 생성 ──► VO 후처리 ──► 길이표 ──► 타임라인
│
└──► 배경 음악 (numpy)──► 믹싱 ──► master.m4a
영상 (Remotion) ──► 무음 렌더링 ──► ffmpeg mux ──► 납품
1.1 각본
- 각 작품마다 하나의 파일:
script.json, 필드는id / act / text / caption. - 중국어 내레이션 속도 ≈ 4.2자/초; 60초 영화 ≈ 200–230자, 90초 ≈ 300–340자.
- 숫자는 중국어 발음으로 작성합니다(「삼천육백팔십팔」), 그렇지 않으면 TTS가 잘못 읽을 수 있습니다. 화면에서는 아라비아 숫자를 사용합니다.
1.2 내레이션 (Qwen3-TTS VoiceDesign, 남성 다큐멘터리 음성)
INSTRUCT = ("A deep, calm, authoritative male documentary narrator. Slow, deliberate, cinematic. "
"Low register, warm, intimate, restrained emotion, close-mic. Consistent, even pacing. Mandarin Chinese.")
generate_audio(text=..., model=model, lang_code="zh", instruct=INSTRUCT,
temperature=0.65, top_p=0.9, repetition_penalty=1.05,
output_path="vo_raw", file_prefix=id)
- 모델
mlx-community/Qwen3-TTS-12Hz-1.7B-VoiceDesign-bf16,mx.random.seed(11)고정. - 각 문장 생성 후 즉시
ffprobe로 길이를 확인합니다: 만약 특정 문장이 30초를 초과하거나 전체적으로 반복되는 패턴이 나타나면 TTS가 저하된 것입니다. 삭제하고 다시 생성합니다(seed를 바꾸거나repetition_penalty를 1.12로 높입니다). - ASR 재확인:
mlx_whisper로 한 번 변환하여 숫자/생소한 한자를 확인합니다(예: 수소→수소, 규소→규소, 철→철 등).
1.3 오디오 후처리 (통합 체인, 각 문장마다 다르게 적용해서는 안 됨)
highpass=f=70,
asetrate=24000*0.912341, aresample=48000, atempo=1.096081, atempo=1.055,
equalizer=f=190:t=q:w=1.0:g=1.4, equalizer=f=3300:t=q:w=1.4:g=-1.8, equalizer=f=7200:t=q:w=1.8:g=-1.0,
acompressor=threshold=0.14:ratio=2.2:attack=10:release=200,
loudnorm=I=-20:TP=-3:LRA=7
그런 다음 20ms 에너지 엔벨로프로 시작과 끝의 무음을 제거하고, 0.34초를 초과하는 일시 정지는 0.34초로 압축하며, 양쪽 끝에 12ms/50ms의 페이드 인/아웃을 적용합니다.
1.4 타임라인
frames = round(seconds * 24); 내레이션 오프셋 = 장면 시작점 + 리드(일반적으로 18–24 프레임).- 각 장면:
리드 + VO + 테일, 테일 16–90 프레임(영화 끝부분은 충분히 여유를 둠). timeline.ts생성(자동 생성, 수동 수정 금지), 필드{ id, from, dur, voAt, voDur }.
1.5 배경 음악 (순수 코드 합성, numpy)
- 구조가 있어야 하며, 빈틈없이 채우지 마십시오: 시간 코드에 따라 '이벤트'를 작성하고, 단순히 하나의 패드를 계속 유지하지 마십시오.
- 화성: 12–18초마다 변경하고, 경계에서는 크로스페이드; 저음은 55Hz 이상의 지속음만 사용합니다.
- 저음 우르르거림을 피하십시오: 시청자는 이를 '웅웅거리는 소리', '너무 시끄럽다'고 표현합니다. 저음을 85–100Hz에서 차단하고, 긴 음은 순수 사인파를 사용하며 옥타브 하모닉을 추가하지 마십시오.
- 조용함이 우선입니다: 음악 레벨 ≈ 내레이션의 −20 ~ −27 dB; 내레이션이 나올 때는 40–70% 더 압축합니다(사이드체인 덕킹).
- 최종 믹싱 음량: 다큐멘터리 −18 ~ −24 LUFS (−14가 아닙니다, 그것은 스트리밍 대중 음악입니다).
- 튜토리얼식 '사운드 디자인'(물에 들어가는 둔탁한 소리, 소나 소리, 금속 삐걱거리는 소리)은 고객이 명시적으로 요청할 때만 추가합니다. 한 번 거절당한 적이 있으므로 기본적으로 사용하지 않습니다.
1.6 영상 (Remotion)
2절을 참조하십시오.
1.7 렌더링 및 합성
npx tsc --noEmit
npx remotion render Film4K out/silent.mp4 --codec=h264 --crf=18 --concurrency=7
ffmpeg -i out/silent.mp4 -i public/audio/master.m4a \
-map 0:v -map 1:a -c:v copy -c:a aac -b:a 320k -shortest -movflags +faststart out/final.mp4
- 4K = 1920×1080 레이아웃 +
transform: scale(2); 2K =scale(2560/1920). 레이아웃은 하나만 작성합니다. - 부분 재작업: 해당 프레임 구간만 다시 렌더링 →
ffmpegtrim/concat으로 세 부분을 이어붙임 →-c:v copy로 오디오 트랙만 교체; 영상도 바꿔야 하면 세 부분을 다시 인코딩하여 이어붙임(약 5–10분 소요).
2. 시각 시스템
2.1 배경
- 캔버스 1920×1080, 24fps;
AbsoluteFill배경은 거의 검은색(#01050A/#010407), 절대 순수 검정 #000을 사용하지 마십시오. - 세 가지 레이어 구조: 배경 그라데이션 → 볼륨 라이트/입자 → 정보 레이어(텍스트, 깊이 눈금자, 수치).
- 마무리는 통일:
Vignette+ 정적Grain(0.04, 반드시animate={false}로 설정해야 함, 동적 입자는 가는 선을 깜빡이게 만듦).
2.2 글꼴
- 제목/시:
Songti SC(세리프), 자간 0.4–0.6em, 큰 크기(90–250px). - 데이터/수치:
SF Mono, 8–14px, 자간 0.16–0.36em. - 설명:
PingFang SC, 14–19px, 투명도 0.55–0.7.
2.3 색상 팔레트 (두 영화 각각의 '세계관 색')
| 영화 종류 | 상단 밝은 부분 | 중간 | 하단 | 강조 색상 |
|---|---|---|---|---|
| 우주 / 시간 | #050506 배경 | 크림 #F3E7D0 | — | 호박색 #E8B06A |
| 바다 / 깊이 | #1E7C93 수면 | #07232E | #01050A | 청록색 #4FE0C0 |
규칙: 같은 영화 내에서는 하나의 강조 색상만 사용합니다. 생물 발광/열수 분출공 등의 예외는 최대 두 가지까지 허용되며, 각각은 하나의 물리량에 연결되어야 합니다.
2.4 입자 엔진 (Canvas 2D)
- 결정론적 무작위성(hash), 동일한 프레임은 항상 동일한 결과; 구름 유형:
ball / filament / disk / globe-surface / sphere-shell / figure / city / helix / neuron / glyph / single / text / timeline. - 두 번 그리기: 먼저 큰 반지름과 낮은 투명도로 광채를 그리고, 그 다음 작은 반지름과 높은 투명도로 코어를 그림;
globalCompositeOperation = 'lighter'. - 포인트 클라우드 경계는 반드시 화면 밖에 있어야 합니다:
makeCloud('text', n)은 3×1.2 상자로, 투영 후 직사각형 가장자리가 나타납니다(시청자가 가장 자주 지적하는 버그).expand(cloud, kx, ky, kz)를 사용하여 2.4–3.2배 확장합니다.
2.5 생물 및 지형 (SVG)
- 항상 측면도, 머리는 이동 방향을 향함; 눈, 지느러미, 입 선, 아가미 주름, 따개비 등 해부학적 세부 사항은 최소 4곳 이상 있어야 합니다. 그렇지 않으면 텍스처처럼 보입니다.
- 실루엣 + 가장자리 광선(투명도 0.2–0.35);
feTurbulence를 몸체에 적용하지 마십시오(화강암이 됩니다). - 지형: 다중 선분 + 암층 선 + 암설 + 퇴적물, 삼각형을 사용하지 마십시오; 산에는 기준선을 그리지 마십시오(차트가 됩니다).
- 생물 등장 윈도우는 '깊이/시간'에 따라 바인딩하며, 세 가지 이상의 생물을 동시에 등장시키지 마십시오.
2.6 정보 레이어 (HUD)
- 레이어 명판: 어두운 그라데이션 배경(0.72→0) + 왼쪽 2px 강조 색상 세로 막대 + 중국어 30–35px 순수 흰색.
- 수치: 레이어당 2–3그룹,
LABEL8.5px /VALUE13–14.5px. - 눈금자: 눈금 선 + 현재 값 굵게 표시; 현재 값은 반드시 실시간으로 계산되어야 하며 하드코딩해서는 안 됩니다(하드코딩하면 포인터와 모순될 수 있습니다).
- 모든 숫자에는 단위가 붙습니다; 단위는 공백으로 구분합니다(
1,093 atm).
2.7 전환
- 첫 번째 선택은 연속적인 움직임(원테이크): 깊이/시간은 연속적인 양이므로, 내용이 그것과 함께 화면 안팎으로 이동합니다.
- 두 번째 선택은 짧은 디졸브(4–6 프레임, 새 장면만 페이드 인되고, 이전 장면은 불투명하게 유지되어 덮임) — 밝기가 떨어지지 않고, HUD 텍스트가 겹치지 않습니다.
- 금지: 대각선 광선 스와이프, 긴 크로스 디졸브, 수직 푸시(어두운 가장자리가 드러남), 블랙아웃 후 하드 컷('물속으로 들어가는' 것과 같은 물리적 동기가 있는 경우는 제외).
3. 사실과 데이터
facts.md파일 생성: 각 항목숫자 / 단위 / 출처 범위 / 영화에서 어떻게 쓸 것인가.- 가장 실수하기 쉬운 세 가지: ① 단위 환산(1 atm ≈ 10.3 t/m² ≈ 1.03 kgf/cm²); ② '평균'과 '극값' 혼동(평균 3,688m vs 최대 10,935m); ③ 단순화된 표현(90 vs 98가지 원소).
- 전체 영화에서 하나의 정확한 버전으로 통일; 내레이션과 영상은 반드시 동일한 출처를 사용해야 합니다.
4. 납품 목록
deliverables/
영화제목-4K-내레이션버전.mp4 # 주 버전
영화제목-4K-순수음악버전.mp4 # 필요시
포스터-4K.png / 미리보기-4K.png # 키 프레임 합성
표지/ # 1920 PNG + 4K PNG + 1146×717 JPG
감독의말.md # 구조, 사운드, 수정 기록
게시글-B站.md # 제목/설명/태그/고정 댓글/표지 제안
사실표.md
배포 패키지에는 다음이 반드시 포함되어야 함: AI 생성 선언문, 제작 분업(모델이 무엇을 했고, 사람이 무엇을 했는지), '오해하기 쉬운 숫자'에 대한 고정 댓글 한 가지.
5. 시행착오 기록 (발생 빈도순)
| 현상 | 근본 원인 | 수정 방법 |
|---|---|---|
| 렌더링이 오디오 전처리에서 멈춤 | 긴 WAV + <Audio> | 무음 렌더링, 외부 mux |
| 텍스트가 입자 위에서 흐릿하게 보임 | 배경 없음 + 투명도 0.4–0.5 | 배경 + 순수 흰색 + 글자 크기 증가 |
| 화면에 규칙적인 직사각형이 나타남(시청자가 가장 자주 질문) | 포인트 클라우드 상자 경계가 화면 안으로 들어옴 | expand()로 2.4–3.2배 확대 |
| 가는 선/산이 깜빡임 | 동적 film grain | Grain animate={false} |
| 고래/물고기가 '거꾸로 헤엄침' | 머리와 꼬리를 반대로 그림, 눈이 꼬리 쪽에 위치 | 측면도 재구성: 머리는 +x 방향 |
| 산이 차트처럼 보임 | 경로가 L ... Z로 수평 기준선을 닫음 | 바닥을 화면 밖으로 내림 |
| 전환이 시선을 끊음 | 광선 스와이프/긴 디졸브 | 짧은 디졸브 또는 연속적인 움직임 |
| 배경 음악이 '웅웅'거림 | 27–80Hz 지속 저음 | 하이패스 85–100Hz, sub drone 제거 |
| 음성과 영상 싱크 불일치 | 영상 비트가 내레이션 내용과 일치하지 않음 | 깊이/시간 곡선을 내레이션 내용에 따라 재배열 |
| TTS 문장 하나가 600초 | 모델 저하 루프 | 삭제하고 다시 생성, repetition_penalty 1.12 |
| 4K 재작업이 너무 느림 | 전체 영화 재렌더링 | 변경된 프레임 구간만 렌더링 + concat |
6. 두 참고 영화의 위치
- 《사피엔스 · 우주의 자화상》:
~/dsh-video-remotion/film/src/scenes/*, 14장면, 4K, 4'58". - 《아래로 · DESCENT》:
~/dsh-video-remotion/film/src/ocean/*, 6개 깊이대, 2K, 1'30"; 내레이션과 배경 음악은~/dsh-video-remotion/ocean/에 있음. - 둘 다
src/engine/particles.tsx(입자),src/engine/atmos.tsx(Vignette/Grain),src/theme.ts(글꼴/색상/이징)를 공유함.