Communitygithub.com

Moosphan/cinematic-shortfilm

영화 같은 과학 단편 영화(70–300초)의 완전한 제작 규격과 워크플로우 — 각본/내레이션(Qwen3-TTS VoiceDesign 남성 음성), Remotion + Canvas 입자/SVG 시각 시스템, 코드 기반 배경 음악 합성, 외부 믹싱 및 4K 납품, 사실 확인 및 배포 패키지. 《사피엔스: 우주의 자화상》《아래로: DESCENT》같은 작품을 만들거나, 그 규격을 재사용할 때 불러오세요.

cinematic-shortfilm란 무엇인가요?

이 스킬은 영화 같은 과학 단편 영화(70~300초)를 제작하기 위한 통합된 제작 규격과 워크플로우를 제공합니다. 이 규격은 《사피엔스: 우주의 자화상》과 《아래로: DESCENT》라는 두 편의 실제 제작된 단편 영화의 경험과 노하우를 바탕으로 만들어졌습니다. 핵심 원칙은 '소리를 먼저 정하고, 영상을 그 다음에 만든다'는 것으로, 각본에서 시작하여 TTS로 내레이션을 생성하고, 그 길이에 맞춰 프레임 수를 역산하는 하향식 워크플로우를 따릅니다. 내레이션 생성에는 Qwen3-TTS VoiceDesign 모델을 사용하며, 이후 일관된 오디오 후처리 체인을 적용합니다. 영상은 Remotion을 사용하여 Canvas 2D 입자 엔진과 SVG로 구성된 시각 시스템을 기반으로 제작되며, 음악은 numpy로 코드 합성되어 외부에서 믹싱됩니다. 최종 납품은 무음 렌더링 후 ffmpeg로 오디오를 먹싱하는 방식으로 이루어집니다. 이 스킬은 각본 작성, 내레이션 생성 및 검증, 타임라인 구성, 시각 시스템 구현(입자 엔진, SVG 생물 및 지형, HUD 정보 레이어, 전환 효과), 음악 합성, 렌더링, 납품, 사실 확인 및 알려진 문제들을 상세히 다루며, Claude Code, Cursor, Codex 등 다양한 AI 코딩 에이전트에서 프로젝트를 시작할 때 참조할 수 있는 완벽한 기술 문서 역할을 합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Moosphan/hulk-skills/tree/HEAD/skills/cinematic-shortfilm

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

영화 같은 과학 단편 영화 · 통합 제작 규격 v1

출처: 《사피엔스 · 우주의 자화상》(4K / 4'58" / 14장면)과 《아래로 · DESCENT》(2K / 1'30" / 90초 수직 프로필). 두 영화의 규격, 워크플로우, 스타일, 그리고 겪었던 시행착오를 모두 여기에 정리했습니다. 새 영화는 먼저 섹션 0, 1을 읽고, 그 다음에 이번 작업과 관련된 장을 읽으세요.


0. 불문율(어기면 무조건 재작업)

  1. 소리를 먼저 정하고, 영상을 그 다음에 정합니다. 내레이션 문장 단위로 생성 → 길이 측정 → 길이로부터 각 장면의 프레임 수를 역산합니다. 절대 영상을 먼저 편집한 후 소리를 입히지 않습니다.
  2. 내레이션과 데이터는 반드시 일치해야 합니다: 영상에 등장하는 숫자, 단위, 규모는 사실 테이블과 항목별로 대조합니다. 내레이션에서 98이라고 하면, 화면에 90이라고 쓰면 안 됩니다. 단위 오류(예: 압력 atm ↔ t/m²)는 색상 배치 오류보다 훨씬 심각합니다.
  3. 하나의 장면에는 하나의 정보만 담습니다: 각 장면에는 하나의 주제 + 최대 3개의 수치만 허용됩니다. 나머지 정보는 내레이션에 맡깁니다.
  4. 텍스트는 항상 읽을 수 있어야 합니다: 모든 텍스트 아래에는 배경 또는 어두운 영역이 있어야 합니다. 레이어 이름 ≥ 30px, 수치 ≥ 13px. 작은 글씨는 투명도 0.6 이상을 유지합니다.
  5. 무조건 부드럽게 전환합니다: 장면 간에는 디졸브/블랙으로 숨 고르기/연속적인 움직임을 사용합니다. 같은 영화 내에서는 한 가지 전환 방식만 사용해야 합니다.
  6. 무음 렌더링: Remotion 안의 <Audio>는 모두 {false && ...}로 꺼둡니다. 오디오는 ffmpeg로 외부에서 합성합니다(긴 WAV는 오디오 전처리에서 렌더링이 멈출 수 있습니다).
  7. 렌더링 전에 반드시 npx tsc --noEmit을 실행하여 오류가 없는지 확인합니다. 그렇지 않으면 많은 프레임이 손상되어 다시 렌더링해야 합니다.
  8. 납품 전 세 가지 확인: 전체 길이 확인, 첫 프레임과 마지막 프레임 확인, 주요 전환 장면의 프레임 단위 확인(각 전환당 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). 레이아웃은 하나만 작성합니다.
  • 부분 재작업: 해당 프레임 구간만 다시 렌더링 → ffmpeg trim/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그룹, LABEL 8.5px / VALUE 13–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 grainGrain 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(글꼴/색상/이징)를 공유함.

관련 스킬