Vox 스타일 설명 영상 파이프라인
단일 주제로 완전한 내레이션, 자막, 배경 음악이 포함된 설명 영상을 제작합니다. 파이프라인은 6단계로 실행되며, 각 단계의 결과물이 다음 단계에서 사용됩니다. 음성 해설(VO)은 애니메이션보다 먼저 생성되는데, VO 길이가 모든 타이밍 결정의 기준이 되기 때문입니다.
TOPIC → 1.Script → 2.Voiceover → 3.Keyframes → 4.Animation → 5.Music → 6.Assembly
(Claude) (xAI TTS) (Seedream) (Omni Flash) (MiniMax) (ffmpeg)
사전 요구 사항
ATLASCLOUD_API_KEY환경 변수 설정 (atlascloud.ai에서 발급 — 가입 시 무료 크레딧 제공)ffmpeg및ffprobe설치 (libass 포함, 자막 합성용)- Python 3.10+ 및
requests라이브러리 - 60초 영상 기준 약 $3~8 API 크레딧 필요 (비용표는
references/atlas-cloud-api.md참조)
API 호출 전에 https://www.atlascloud.ai/docs 에서 최신 엔드포인트 경로와 모델 ID를 확인하세요. 미디어 모델 API는 빠르게 변경됩니다. references/atlas-cloud-api.md의 패턴은 2026년 7월에 검증되었습니다.
프로젝트 구조
매 영화마다 이 구조를 생성하고 유지하세요 — 모든 단계가 이 구조를 읽고 씁니다:
project/
├── brief.md # 주제, 각도, 목표 길이, 시청자
├── script.json # 내레이션, 장면 설명, 자막이 포함된 빔
├── audio/
│ ├── vo/ # beat_01.mp3 ... beat_NN.mp3
│ ├── vo_durations.json
│ └── music.mp3
├── frames/ # keyframe_01.png ... style_anchor.png
├── clips/ # clip_01.mp4 ... (음성 없는 애니메이션 클립)
├── subs/ # captions.ass
└── final/ # film.mp4
1단계 — 스크립트
직접 작성합니다. API 호출이 필요 없습니다. 이 단계가 전체 품질을 가장 크게 결정합니다 — 좋은 스크립트에 평균적인 비주얼이 나쁜 스크립트에 뛰어난 비주얼보다 낫습니다.
초안을 작성하기 전에 references/vox-style-guide.md (작성 섹션)을 읽으세요. 핵심 규칙:
- 빔(beat) 단위로 구성합니다. 하나의 빔 = 하나의 내레이션 문단(1
3문장, 814초 분량) + 하나의 비주얼. 60초 영화는 68개 빔, 3분은 1622개 빔입니다. - Vox 내러티브 아크: 콜드 오픈 훅(놀라운 구체적 사실이나 질문) → 맥락("X를 이해하려면...로 돌아가야 합니다") → 하나의 명확한 흐름을 가진 확장 설명 → 복잡성 또는 반전 → 훅을 재구성하는 결말.
- 어조: 2인칭 환영("아마 본 적이 있을 겁니다..."), 역사적 서술에는 현재 시제, 추상적 표현보다 구체적 숫자, 짧은 평서문. 군더더기 없음, "이 비디오에서는..." 금지.
- 빔당 하나의 아이디어. 한 문장에 두 번째 개념이 등장하면 빔을 분할하세요.
script.json 작성:
{
"title": "Tang Golden Age",
"topic": "How Tang Dynasty China built the world's largest city",
"style_seed": "mixed-media paper collage, ink-wash Chinese mountains, vermillion red and aged cream palette",
"accent_color": "#C0392B",
"beats": [
{
"id": 1,
"narration": "In the seventh century, Tang China built Chang'an — the largest, richest city on Earth. The whole world came to its gates.",
"visual": "Emperor Taizong enthroned at center as paper cutout, court figures flanking, pagodas and ink-wash mountains behind, red seal stamp upper right reading 盛唐",
"caption_text": null,
"motion": "slow push-in on emperor, clouds drift left, subtle parallax between cutout layers"
}
]
}
caption_text는 화면상의 타이포그래피 순간(핵심 통계나 용어)에 사용되며, 대부분의 빔은 null로 남깁니다. 내레이션 자막은 조립 단계에서 처리됩니다. motion은 4단계 애니메이션 프롬프트가 됩니다.
2단계 — 음성 해설 (xAI TTS v1)
빔별로 오디오 파일 하나를 생성한 후 길이를 측정합니다. 이 길이가 전체 영화의 마스터 클록이 됩니다.
빔별로 Atlas Cloud 오디오 엔드포인트 호출 (모델: xAI TTS v1 — 정확한 요청 형식과 음성 선택 가이드는 references/atlas-cloud-api.md 참조). 전체 영화에 하나의 목소리를 선택하세요. Vox 레지스터: 절제되고, 따뜻하며, 약간 비꼬는 듯한 — "영화 예고편" 같은 목소리는 피하세요.
생성 후 모든 파일을 검사하고 audio/vo_durations.json을 작성합니다:
ffprobe -v error -show_entries format=duration -of csv=p=0 audio/vo/beat_01.mp3
{"beats": [{"id": 1, "file": "audio/vo/beat_01.mp3", "duration": 9.83}], "total": 61.2}
총 길이가 브리프와 일치하는지 확인합니다. 빔이 너무 길면 내레이션을 다듬고 해당 빔만 다시 생성합니다.
3단계 — 키프레임 (Seedream 5.0 Pro)
빔당 하나의 키프레임, 모두 일관된 시각적 스타일로 제작합니다. 일관성이 가장 어려운 문제이며, 스타일 앵커 패턴으로 해결합니다:
- 앵커 생성.
bytedance/seedream-v5.0-pro/text-to-image를 사용하여 빔 1(보통 제목/훅 프레임)을 생성합니다. 프롬프트는references/vox-style-guide.md(시각 문법 섹션)의 스타일 블록 + 해당 빔의visual+ 영화의style_seed및accent_color로 구성합니다. 16:9, 2K를 요청합니다. - 앵커를 검토한 후 진행합니다. 스타일이 적절할 때까지 재생성합니다 — 다른 모든 프레임이 이를 상속받습니다.
- 편집 모델로 나머지 프레임을 생성합니다.
bytedance/seedream-v5.0-pro/edit을 앵커를 참조 이미지로 사용하여 호출합니다(최대 10개 참조 지원, 앵커 + 이전 프레임 선택 가능). 프롬프트: "참조의 정확한 아트 스타일, 팔레트, 종이 콜라주 처리, 테두리 프레이밍을 유지하세요. 새 장면: {beat.visual}"
이렇게 하면 인간 아트 디렉터처럼 팔레트, 텍스처, 프레이밍이 영화 전체에 고정됩니다.
모든 프롬프트는 스타일 접미사(스타일 가이드 참조)로 끝나야 하며, 이는 Vox 룩을 인코딩합니다: 흰색 테두리가 있는 종이 컷아웃, 하프톤 점, 테이프 조각, 굵은 평면 기하학적 악센트, 넉넉한 여백, 단일 강조 색상.
caption_text가 설정된 프레임: Seedream 5.0 Pro의 타이포그래피 렌더링이 강력하므로 굵고 좁은 산세리프체로 텍스트를 렌더링하도록 지시합니다. 프레임당 5단어 미만으로 유지하세요.
4단계 — 애니메이션 (Gemini Omni Flash)
각 키프레임을 이미지-투-비디오로 클립으로 애니메이션합니다. 대상 클립 길이 = 해당 빔의 VO 길이 + 0.5초 여유(모델이 지원하는 증분으로 반올림).
콜라주 미학을 위한 모션 프롬프트는 미묘해야 합니다. 이것이 가장 흔한 실패 모드입니다. Vox 룩은 "모션 그래픽"이지 "푸티지"가 아닙니다. 좋은 모션 어휘:
- 슬로우 푸시인/풀아웃 (2D 카메라, 3D 돌리가 아님)
- 컷아웃 레이어 간 시차 드리프트
- 구름/연기 옆으로 흐르기
- 종이 요소가 프레임 가장자리에서 들어와 자리 잡기
- 하프톤 점이나 텍스처가 은은하게 반짝임
- 다른 요소는 고정된 상태에서 단일 요소만 애니메이션(깃발 흔들림, 물결)
모든 프롬프트에서 명시적으로 금지: "카메라 흔들림 없음, 3D 회전 없음, 얼굴이나 텍스트 변형 없음, 스타일 이탈 없음, 요소는 평평한 종이 컷아웃으로 유지."
각 생성 작업을 완료될 때까지 폴링하고 clips/clip_NN.mp4로 다운로드합니다. 생성은 가끔 실패하거나 스타일이 이탈합니다 — 각 클립을 검토하고, 텍스트가 왜곡되거나 스타일이 깨진 경우 재생성합니다. 약 15% 재생성을 예산에 포함하세요.
5단계 — 음악 (MiniMax Music 2.6)
전체 영화를 위한 하나의 기악 배경음악. is_instrumental: true 요청 — 보컬은 내레이션과 충돌합니다.
프롬프트 공식: {분위기} {장르와 유사한 텍스처}, {템포}, {악기 구성}, {아크}. 역사 작품 예시: "사색적인 영화적 언더스코어, 펠트 피아노와 부드러운 현악기, 가벼운 퍼커션 펄스, 90bpm, 성기게 시작하여 점차 풍성해짐, 다큐멘터리 스타일". 악기 구성을 주제에 맞추세요(당나라 작품에는 구쟁/디지 텍스처, 기술 주제에는 아날로그 신시사이저 펄스).
Music 2.6은 고정 길이 곡을 생성합니다. 트랙이 영화보다 짧으면 조립 시 크로스페이드로 반복하고, 길면 페이드아웃으로 자릅니다. 음악 아크가 영화 아크와 충돌하지 않도록 하세요 — 조용한 빔에 중간 트랙 드롭이 떨어지면 어색하므로, 결과를 영화의 흐름과 대조해보세요.
6단계 — 조립 (ffmpeg, 로컬)
전체 레시피는 references/ffmpeg-assembly.md를 참조하세요. 순서:
- 각 클립을 해당 빔의 VO 길이에 맞춥니다(자르기 또는 마지막 프레임 유지), 1920x1080 30fps로 정규화.
- 클립을 순서대로 연결합니다.
- VO 트랙을 구성합니다: 빔 오디오를 0.5초 간격으로 연결하여 비디오 타이밍과 일치시킵니다.
subs/captions.ass를 생성합니다 — Vox 스타일 자막: 굵은 산세리프, 두꺼운 검은색 외곽선이 있는 흰색, 하단 중앙 정렬, 최대 2줄, 절(clause) 경계에서 내레이션을 분할하고 각 청크를 해당 빔의 창 내에 시간을 배치합니다.- 오디오 믹싱: VO는 전체 레벨, 음악은 내레이션 아래 -12~-15dB로 덕킹(사이드체인 압축 또는 간단한 볼륨 자동화 — 레시피는 참조 파일 참조).
- 자막 + 출처 표시를 합성하고("Made with ...") 인코딩: H.264, CRF 18, AAC 192k,
-movflags +faststart.
최종 QC 검사 후 제공: (a) 자막/VO 싱크 드리프트, (b) 음악이 내레이션을 압도하는지, (c) 클립의 모션이 눈에 띄게 반복되는지, (d) 프레임 간 스타일 이탈. 조립 해킹이 아닌 문제가 발생한 단계에서 수정하세요.
오케스트레이션 참고 사항
- 처음에는 단계를 엄격히 순서대로 실행합니다. 이후에는 모든 상태가 프로젝트 파일에 저장되어 있으므로 각 단계를 독립적으로 재실행할 수 있습니다.
- API 생성은 느립니다(비디오 클립: 각 1~4분). 모든 애니메이션 작업을 동시에 제출한 후 폴링하세요. 직렬화하지 마세요.
- 보낸 모든 프롬프트를
prompts.log파일에 저장하세요. 재현성이 중요하며 사용자가 단일 빔을 조정하고 재생성할 수 있기 때문입니다. - 비용은 빔 수에 선형적으로 증가합니다. 3단계(첫 번째 유료 비중이 큰 단계) 이전에 사용자에게 대략적인 비용을 알려주세요:
빔 수 × ($0.10 이미지 + ~10초 클립당 $1.20) + ~$0.50 오디오.
참조 자료
references/vox-style-guide.md— 1단계와 3단계 전에 읽으세요. 시각 문법, 작성 어조, 프롬프트 템플릿.references/atlas-cloud-api.md— 2단계 전에 읽으세요. 엔드포인트, 모델 ID, 비동기 작업 패턴, 폴링 코드, 비용.references/ffmpeg-assembly.md— 6단계 전에 읽으세요. 정규화, 연결, 자막, 덕킹, 인코딩 레시피.