H3 Video: AI 단편 드라마 전체 워크플로우
이 워크플로우는 실제 영화 제작 과정에서 얻은 경험을 바탕으로 합니다. 핵심 아이디어: 먼저 계획하고, 각 단계에서 사람이 확인하며, 오류가 발생한 레이어만 수정합니다.
전체 프로세스 (순서대로, 건너뛰지 않음)
| 단계 | 작업 | 게이트 |
|---|---|---|
| 0 | 연구: 먼저 유사한 우수 작품과 타인의 방식을 살펴보고, 사용된 기법을 기록합니다 | — |
| 1 | 계획 작성: 분위기와 스타일, 대사표, 세그먼트, 생성 목록 (템플릿: templates/plan_template.md) | 사용자가 계획 확인 |
| 2 | 더빙: 나레이션과 오프스크린 목소리는 TTS로 별도 생성하고, 실제 길이를 측정합니다 | 사용자가 음색 확인 (시청) |
| 3 | 캐릭터 마스터: 인물당 한 장의 정면 전신샷, 이야기 세계관 안에서 촬영 | 사용자가 마스터 확인 |
| 4 | 첫 프레임: 세그먼트당 한 장, 동작이 시작되기 직전 상태 | 사용자가 첫 프레임을 승인하기 전에는 비디오를 생성할 수 없습니다 |
| 5 | 생성: 먼저 가장 빠른 설정으로 초안 생성 | — |
| 6 | 문장별 화자 확인, 시선 확인, 접합부 확인 | 오류가 있으면 해당 세그먼트만 재작업 |
| 7 | 업스케일, 자막, 음량, 썸네일 | 사용자 최종 승인 |
| 8 | 회고: 계획의 '검증할 방법' 항목을 기준으로 점수를 매기고, 교훈을 지식 베이스에 기록 | — |
7가지 엄격한 규칙
- 스타일은 이야기의 분위기를 따라야 합니다. 어떤 그림을 그리기 전에 먼저 '분위기와 스타일' 섹션을 작성해야 합니다: 광원과 어두움, 색조, 의복의 새고 더러움 정도, 표정, 배경 분위기. 마스터 샷도 이 세계관 안에서 촬영하며, 스튜디오 회색 배경은 사용하지 않습니다. 모든 그림은 먼저 '이 이야기에 속하는가'를 묻고, 그 다음 세부 사항을 확인합니다. 어두운 이야기에 깨끗하고 예쁜 아이돌 얼굴을 사용하는 것은 가장 흔한 실패 사례입니다.
- 한 번의 생성에는 하나의 발성 출처만 있어야 합니다. 나레이션과 오프스크린 목소리는 절대 H3에 넣지 않습니다. 그렇지 않으면 화면 속 인물이 나레이션에 입을 맞추게 되며, 프롬프트에 '입 다물어'라고 적어도 막을 수 없습니다. 나레이션 구간은 대사가 없는 비디오를 생성하고, 사운드는 후반 작업에서 입힙니다.
- 현장에 있지만 말하지 않는 캐릭터: 생성 시 대사를 주지 않습니다. 말하는 사람이 숨어야 할 경우 뒷모습이나 오버더숄더 샷을 촬영합니다.
- 대사표가 유일한 출처입니다. 각 문장마다 유형(대화/오프스크린), 화자, 응시 대상, 원문을 기록합니다. 약 초당 3자로 예산을 잡고, 각 문장은 해당 세그먼트 내에서 끝나야 합니다. 이후 단계에서는 대사를 변경할 수 없습니다.
- 시선: 말하는 사람은 듣는 사람을 바라보고, 듣는 사람은 말하는 사람을 바라봅니다. 프롬프트에 매 문장마다 누가 누구를 보는지 명확히 작성합니다.
- 첫 프레임에 오류가 있으면 첫 프레임을 다시 작업하고, 프롬프트로 수정하지 않습니다. 검사 시 원본 해상도로 확대하여 손, 눈, 입, 액세서리, 불필요한 물체를 확인합니다.
- 문장별 화자 확인을 통과하지 않으면 납품하지 않습니다. 각 대사 구간의 시간대에 대해 밀집된 프레임 그리드를 추출하고(
scripts/speaker_grid.py), 하나의 폐쇄형 질문에만 답합니다: "누구의 입이 움직이고 있는가: A / B / 둘 다 / 둘 다 아님", 그리고 대사표와 대조합니다. 4프레임만 드물게 추출하면 놓칠 수 있습니다.
생성 및 재작업 원칙
- 초안을 먼저, 업스케일은 나중에: 가장 빠르게 확인 가능한 해상도로 영상을 출력하고, 확인이 완료된 버전만 업스케일합니다.
- 실패 시 원인부터 파악: 문제가 프롬프트, 첫 프레임, 스크립트, 후반 작업 중 어디에서 발생했는지 판단한 후, 어떤 레이어를 수정할지 결정합니다. 여러 세그먼트에서 동일한 오류가 발생하면 공유 참조(마스터)를 수정하고, 단일 세그먼트 오류는 해당 세그먼트만 수정하며, 한 번에 한 가지 항목만 변경합니다.
- 프롬프트는 긍정적인 설명을 작성하고, '하지 마세요...'를 나열하지 않습니다. 피하고 싶은 것은 입력(첫 프레임, 마스터) 단계로 돌아가 수정합니다.
- 각 세그먼트에 사용된 첫 프레임, 마스터, 시드, 프롬프트를 기록하여 필요한 경우 한 세그먼트만 재작업할 수 있도록 합니다.
- 도입부 2초 테스트: 처음 2초만 보고 시청자가 무엇을 보고 있는지 알 수 있어야 합니다.
참고 자료
references/workflow_details_and_lessons.md: 각 단계의 구체적인 방법과 겪었던 문제점들.references/ComfyUI_nodes_and_parameters.md: Qwen-Image를 이용한 마스터 생성, Qwen-Image-Edit를 이용한 이미지 수정, VoxCPM2를 이용한 음성 복제, H3 Ref2VA의 노드와 파라미터, 알려진 오류 해결 방법.references/open_source_pipeline_research.md: 9개의 오픈소스 AI 비디오 프로젝트 방식 비교, 도입할 가치가 있는 것과 없는 것.templates/plan_template.md: 계획 문서 템플릿, 대사표와 검증표 포함.
스크립트
모든 스크립트는 환경 변수 COMFY_URL을 통해 ComfyUI에 연결합니다 (기본값 http://127.0.0.1:8188). 사용법은 scripts/README.md를 참조하세요.
| 스크립트 | 기능 |
|---|---|
t2i_masters.py | Qwen-Image로 캐릭터 마스터를 일괄 생성합니다 (스타일 접두사 + 인물별 설명) |
edit_image.py | Qwen-Image-Edit로 특정 부분을 수정하고 나머지는 유지합니다 |
voice_design.py | VoxCPM2로 텍스트 설명에 따라 캐릭터 목소리를 디자인하고, 인물당 A/B 두 개의 미리 듣기를 생성합니다 |
tts_clone.py | VoxCPM2로 하나의 참조 음성을 사용하여 음색을 복제하고, 나레이션을 일괄 생성합니다 |
h3_ref2va.py | H3 Ref2VA 워크플로우를 조립하고 제출합니다 (참조 이미지, 참조 오디오, 첫 프레임 앵커) |
wait_download.py | 작업이 끝날 때까지 기다렸다가 모든 출력을 다운로드합니다 |
ws_progress.py | 작업 진행 상황을 확인합니다 (제출 시 사용한 client_id가 필요합니다) |
asr.py | faster-whisper로 전사하여 더빙이 한 글자도 틀리지 않았는지 확인합니다 |
speaker_grid.py | 대사표에 따라 문장별로 밀집된 프레임 그리드를 생성하여 화자 확인을 수행합니다 |
upscale_video.py | RealESRGAN으로 비디오를 프레임별로 업스케일합니다 |
post_subtitle_loud.py | 자막을 입히고 -14 LUFS에 맞춰 loudnorm을 두 번 적용합니다 |
make_cover.py | 3:4와 9:16 두 가지 버전의 썸네일을 생성합니다 |