ComfyUI H3 대본-영상 변환 (v5.0 감독급 시청각 언어 및 산업 공학화 규범판)
v5.0 주요 이정표 업데이트 (2026-11, 시청각 언어 산업화 및 7대 실전 문제점 전면 해결)
- 1. 스토리보드 키프레임 사전 생성 공정 (I2V 장면/캐릭터/소품 공동 키프레임): 키프레임 없이 T2V 블라인드 생성 완전 종결. 각 컷은 비디오 샘플링 전에 이미지 생성 모델이 컷의 카메라 위치, 캐릭터 3면도, 소품 설정을 결합하여 16:9 공동 첫 프레임 키프레임(
keyframe_segXX.png)을 생성합니다. 품질 검사 및 확정 후 I2V 노드에 공급하여 0번째 프레임의 뼈대 기하학, 옷감 질감, 소품 윤곽을 고정합니다.- 2. 단일 인물 발화 잠금 및 전원 침묵 억제 프로토콜 (Speaker Lock & Mouth Suppression): 모든 인물이 대사에 맞춰 입을 움직이는 인형극 참사 완전 제거.
[Subject 1]에서 유일한 주 발화자를 명확히 지정하고,[Action 1]에서 주어-동사 동작 분리를 강제하며, 비발화 캐릭터에 대해 침묵 억제 절대 조항(lips tightly sealed, completely silent, showing tense glare without mouth movement)을 추가합니다.- 3. 전역 스타일 바이블 (Global Style Bible) 및 사전 스타일 고정 게이트: 에피소드마다 무작위로 스타일이 달라지는 현상 거부. 제작 시작 전에 전역 Style Bible(
visual_genre,environment_base,lighting_base,color_palette,quality_base명시)을 확립하고, 4가지 다른 구도의 스타일 샘플을 생성하여 수동 확인 후 전체 제작에 상속합니다.- 4. 숏폼 드라마 최적 발화 속도 및 밀도 조절 (Pacing & Density Normalization): 인물 발화가 느리고 음을 늘리는 문제 해결. 175프레임(7.29초) 표준 시퀀스에서 대사는 엄격히 20~28개의 순수 한자(숏폼 드라마 최적 속도 3.2~4.0자/초)와 일치해야 하며,
[Audio 1]에서spoken crisply and rapidly without dragging syllables를 명시적으로 선언합니다. 처음 4.5초는 빠르게 말하고, 나머지 2.8초는 차가운 응시와 동작 반응으로 전환합니다.- 5. 6가지 영화급 다이나믹 카메라 움직임 및 동선 스케줄링 라이브러리 (Director Camera & Blocking): 두 인물이 정면에서 마주 보고 서서 대화하는 장면 연속 사용 금지! 6가지 다이나믹 카메라 스케줄링 강제 도입: ① 동선 교차 슬로우 푸시, ② 소품 클로즈업에서 눈동자로 포커스 전환, ③ 더치 앵글 사선 압박, ④ 뒤돌아서 차갑게 돌아보기, ⑤ 귀에 바짝 다가가 압박, ⑥ 측광 실루엣 대치.
- 6. 순수 표준 중국어 발음 규약 및 ASR 언어 드리프트 차단 게이트 (Mandarin Purity & Language Gate): 대사 전체를 순수 중국어로 정규화(아라비아 숫자를 한자로 변환, 영어 약어 및 불법 기호 제거);
[Audio 1]에Strict Mandarin Chinese dialogue only, standard native Chinese accent, zero foreign tone을 강제 추가; Whisper ASR 언어 감지를 통합하여 비중국어 자막 및 언어 드리프트를 자동 차단합니다.- 7. 엔지니어링 마스터 메인 스케줄링 파이프라인 폐쇄 루프:
scripts/director_engine_v3.py를 구현하여 컷 테이블, 프롬프트 컴파일, 발화 속도 및 밀도 계산, 발화 주체 잠금의 전 과정 자동화를 실현합니다.v4.1 업데이트 (2026-11, 공식 v2.2 프롬프트 규약 및 175프레임 시퀀스 심화)
- 프롬프트 표준 v2.2로 업그레이드:
- MiniMax 공식 프롬프트 가이드(
references/official/base-en.txt,ref-en.txt) 연동;- 카메라 움직임 3요소(유형+진폭+속도)를 자연어 문장으로 샷 내부에 작성, 샷 끝에 태그 쌓기 금지;
- 소재 권한에
원본 이미지 구도 및 점유 비율을 복사하지 않음을 명시;- 복잡도 예산 엄격 준수: 단일 세그먼트(175프레임/7.29초) 최대 3개의 주체 + 1개의 대사.
- 세그먼트 길이를 주력 175프레임(7.29초)으로 고정:
- 243프레임은 공식적으로 폐기, 상한선을 192프레임(8.00초)으로 설정, 생산 주력은 175프레임으로 통일 고정, 세그먼트 끝에 1.0~1.2초의 침묵 버퍼 확보;
- 스케줄링 계층 준수 금지 영역(원거리 샷은 공간 구축 및 얼굴 인식 후 중근거리 샷으로 전환, 후방 당김 및 창문 통과 비활성화).
- Windows UTF-8 전 터미널 방어:
force_utf8_stdio()로 stdout/stderr를 UTF-8로 통일 재설정, GBK/CP936 인코딩 예외 충돌 방지.- 품질 검사 및 원거리 얼굴 보정 도구 체인 확장:
- Whisper ASR 대사 품질 검사(
scripts/check_dialogue_asr.py), 마지막 샷 광학 흐름 및 이음새 품질 검사(scripts/sop_check.py), 이어지는 마지막 세그먼트 공백 면제(--tail-exempt) 및 중원거리 적응형 얼굴 보정(scripts/face_refine_pipeline.py) 도입.v4.0 업데이트 (2026-10, 산업용 첫 프레임 얼굴 고정 변형 방지 및 영화 음악 이중 혁명)
- 첫 프레임 이미지 생성 검증 + I2V 기하학적 얼굴 고정 철칙 (순수 텍스트-비디오 T2V의 얼굴 변형 및 소프트 소재 문제 완전 해결): 단일 텍스트-이미지 생성은 5~15초만 소요, 만족스럽지 않으면 초 단위로 재생성; 첫 프레임을 결정하지 않고 8분짜리 T2V 블라인드 생성 금지! 사후 자동 품질 검사는 소 잃고 외양간 고치는 식이며, 고비용 재생성은 임시방편일 뿐입니다. 인물 클로즈업이나 핵심 소품 상호작용이 있는 경우, 반드시 먼저 첫 프레임을 결정하고
first_frame을 주입하여 I2V 모드로 전환, 0번째 프레임의 해부학적 기하학 및 소품 회로를 고정, H3는 시퀀스 역학과 립싱크만 담당, 얼굴 변형률을 30%에서 2% 미만으로 급감시킵니다. 자세한 내용은references/keyframe_i2v_guide.md를 참조하십시오.- 영화급 배경 음악 융합 및 음성 지능형 회피 (Audio Ducking): 프롬프트에서 H3 자체 생성 왜곡 배경음을 완전히 금지; 대사 및 액션 사운드 정리 후, 전체 영상에 통일된 고충실도 독립 BGM 배치, FFmpeg 네이티브
sidechaincompress동적 사이드체인 회피 적용: 음성 시작 시 순간 -14dB로 하강, 대사 종료 후 0.3~0.5초에 걸쳐 부드럽게 상승, 상업용 숏폼 드라마 시청각적 쾌감 창출. 새로운 도구scripts/cinematic_audio_mixer.py추가.- 첫 프레임 게이트 도구
scripts/keyframe_gate.py새로 추가: 엔지니어링 수준의 첫 프레임 상태 검사, ComfyUI 창고 동기화 및 I2V 노드 안전 주입 지원.v3.2 업데이트 (2026-10-25)
- §13 이 스킬을 업데이트해야 하는 경우 새로 추가: 6가지 트리거 조건, 포함해서는 안 되는 4가지 파일 유형, 마이그레이션 3가지 질문, 배치 규칙, 수정 후 3단계 자체 점검
- 한 줄 규율: '대본을 바꾼 후에도 성립하는' 메커니즘과 판단 기준만 침전시키고, 프로젝트 파일은 절대 스킬에 포함시키지 않음
v3.1 업데이트 (2026-10, 13개 세그먼트 / 86초 완성본 실측 침전)
- §4.1 H3 준수 경계 새로 추가 (후방 당김 실패, 창문/문 통과, 창문 밖 움직임 생성 안 됨, 구도 잠금, 부정형 샷 명령)
- §5.1 VRAM 회수 새로 추가 (한때 한 세그먼트를 5분에서 33분으로 늘렸던 문제)
- §8 의사 결정 트리에 6개 항목 추가 (끝 동작 선점, 한 박자에 너무 많은 동작, Foley이 배경음으로 깔림, quiet-gain 부작용, F0 오판)
- §12 대사 위치 4가지 버전 그라데이션,
cont off의 trim 기록 추가- §3 세그먼트 길이 권장을 175프레임으로 변경 (원래 124/243으로 작성되었으며, 이미 구식)
- 프롬프트 표준에서 오해를 불러일으킬 수 있는 두 가지 오래된 예시 수정: '대사를 마디 끝에 작성'은 마디 맨 앞이어야 함; '가슴이 2.5초마다 오르내림'은 발성 명령으로 해석되어 호흡음 생성되므로 삭제
대본을 완성 영상으로: 핸드셰이크 → 감독 스케줄링 → 첫 프레임 검증(I2V) → 프롬프트 → 제출 → 모니터링 이중 검사 → 파일 수거 → 회피 믹싱 및 편집.
v4의 핵심 인식: '생성된 비디오에 운을 맡기고 사후 품질 검사로 재생성'을 '저비용 사전 이미지 제어 + I2V 얼굴 고정 실행 + 영화급 회피 믹싱'으로 업그레이드합니다.
한 가지 철칙: 하나의 작업 = 하나의 로컬 프로젝트 디렉토리 + 하나의 감독대 프로젝트 이름(
h3_chain/<프로젝트 이름>). 이 두 가지는 첫 번째 세그먼트가 결정된 순간부터concat이 끝날 때까지 바꿀 수 없습니다. 바꾸는 것은 '파일을 잘못 넣은 것'이 아니라 이어서 제작하는 것이 바로 끊어지는 것입니다: 후속 촬영 세그먼트는chain.order[k-1]을 통해 이전 세그먼트를 찾는데, 프로젝트 이름이 바뀌면 찾을 수 없으며, 해당 세그먼트는 조용히 첫 번째 세그먼트로 간주되어 다시 그려지고, 완성된 영상은 다른 영상의 디렉토리로 이동됩니다. 바인딩은project.json의chain필드에 기록되며,submit할 때마다 비교하고, 일치하지 않으면 직접 거부(경고가 아님)합니다. 변경하려면 전체를 새로 바꿔야 합니다: 새 프로젝트 + 새 감독대 프로젝트 이름, 첫 번째 세그먼트부터 다시 시작합니다. 전체 규칙은 §10.1을 참조하십시오.
0. 실행 계약 (먼저 누가 무엇을 담당하는지 명확히)
| 누구 | 담당 |
|---|---|
| Agent (완전 자동) | 대본 읽기, 감독 스케줄링, 첫 프레임 검증, 프롬프트 작성, preflight, 제출, 모니터링, 이중 검사, 파일 수거, 배경음 제거, 배경 음악 회피 믹싱, 편집, 납품, 대장 작성 |
| 사용자 (세 가지만 함) | ① ComfyUI를 열고 워크플로우를 로드한 후 '준비'라고 말하기 ② 대본/스타일/첫 프레임 후보의 일회성 결정 ③ 영상 보고 승인 |
Agent가 하지 말아야 할 일곱 가지
- 워크플로우 핸드셰이크가 완료되지 않았을 때(
wf_map.json이 존재하지 않을 때) 제출하지 말 것. gate(1차 채취 이중 검사)를 건너뛰고finish하지 말 것 — 스크립트가 거부하므로 우회하려 하지 말 것.- state/프레임 추출/임시 wav를 스킬 디렉토리에 쓰지 말 것(
paths.py에 하드 가드 있음). - '이전 노드 번호'에 의존하여 배선을 변경하지 말 것 — 세 가지 데이터만 주입하고, 초해상도/최종 노드의 연결선을 절대 건드리지 말 것.
- 인물 클로즈업이나 핵심 소품 상호작용이 있을 때, 첫 프레임 검증을 건너뛰고 순수 텍스트-비디오(T2V) 블라인드 생성하지 말 것 — 정적 이미지 생성 검증은 5~15초면 충분하며, 만족스럽지 않으면 초 단위로 재생성; 8분짜리 T2V를 실행한 후 사후 품질 검사하는 것은 고비용 자살 행위입니다. 반드시 먼저 첫 프레임을 결정하고
first_frame을 주입하여 I2V로 얼굴 및 소품을 고정하십시오! - 프레임을 추출하여 화면을 보지 않고 다음 세그먼트를 제출하지 말 것 — preflight는 텍스트 구조만 확인하고 화면은 확인하지 않습니다. 디스크에 저장된 후 먼저 4~6프레임을 추출하여 콜라주 이미지를 확인한 후 다음 세그먼트를 제출하십시오; 이는 '두 세그먼트를 너무 빨리 제출하여 VRAM이 더러워지는 상태'를 방지하는 데도 도움이 됩니다(§5.1 참조).
- 해당 프로젝트 파일을 무조건 skill에 넣지 말 것 — 영화 제목/캐릭터 이름/세그먼트 번호/
plan.json/assets/*.json/특정 세그먼트 프롬프트 원문/해당 trim 기록/블랙리스트 시드는 모두 프로젝트 디렉토리에 남겨둡니다. '대본을 바꾼 후에도 성립하는' 메커니즘, 판단 기준, 작성법만 침전시킵니다. 판단 기준과 배치 규칙은 §13을 참조하십시오.
다음 네 가지 경우에만 멈춰서 사용자에게 묻습니다: 대본에 모호함이 있어 스토리보드 구조에 영향을 미치는 경우 / 스타일 또는 화면 비율 결정 / 소재가 부족하고 텍스트로 정의할 수 없는 경우 / 동일한 세그먼트를 3번 재생성해도 통과하지 못한 경우.
1. 핵심 도구 모음 (완전한 생산 도구 체인)
| 도구 | 기능 | 주요 서브 명령 |
|---|---|---|
scripts/h3wf.py | 워크플로우 핸드셰이크: ComfyUI에서 실제로 실행된 그래프를 읽고 자동으로 노드 역할 인식 | sync show doctor |
scripts/sop_run.py | 생산: 제출(preflight 포함), 자동 모니터링, 최종 파일 대기 | submit watch final abort |
scripts/h3proj.py | 프로젝트 및 게이트: 대장, 1차 채취 이중 검사, 시각적 서명, 파일 수거, 편집, 잔여물 정리 | new status gate review finish concat residue |
scripts/keyframe_gate.py | 첫 프레임 검증 및 I2V 주입: 첫 프레임 상태 검사, ComfyUI 창고 동기화, first_frame 주입 | --project --seg --sync |
scripts/face_refine_pipeline.py | 외부 원거리 얼굴 보정 워크플로우: 중원거리 조건부 얼굴 보정, 오디오 원본 바이패스, 사용자 정의 노드 부재 시 부드러운 다운그레이드 | --input --output --char-ref --dry-run |
scripts/cinematic_audio_mixer.py | 영화급 배경 음악 지능형 회피 믹싱: 외부 독립 BGM, sidechaincompress 자동 음성 회피 | --input --output --bgm --volume |
scripts/check_dialogue_asr.py | 대사 ASR 자동 비교: VAD 음성 구간 위치 파악 → Whisper 전사 → <d> 원문과 비교 | --file --text --seg |
scripts/sop_check.py | 마지막 샷 동작 에너지 및 이음새 유사도 품질 검사: 8프레임 연락처표, 동작 광학 흐름 비율, 핀 프레임 비교 | --video --seg |
scripts/shisei_pose.py | (선택 사항) 격투/대치 자세: 다중 시점 자세 검색 및 선화 추출 | --search --duo --get --view |
인터프리터는 cv2가 포함된 venv로 고정: C:/Users/windows/.workbuddy/binaries/python/envs/default/Scripts/python.exe (이하 PY)
2. 0단계: 워크플로우 핸드셰이크 (작업 시작 시 매번 첫 번째로 수행해야 하며, 건너뛸 수 없음)
왜 고정할 수 없는가: 사용자의 워크플로우는 업데이트될 수 있고(3차 채취 추가, 초해상도 크기 변경, 출력 접두사 변경), 노드 번호가 변경되면 하드코딩된 '배선 수정'은 정상 작동하던 경로를 망가뜨립니다 — 이것이 v2의 모든 오류의 근본 원인이었습니다.
핵심 관점: 사용자는 언제든지 캔버스에서 매개변수를 조정(초해상도 크기 변경, 모델 교체, 샘플링 단계 수 조정)할 수 있으며, 생성은 반드시 그의 현재 값을 사용해야 합니다.
submit은 호출될 때마다 먼저 캔버스 저장 버전(h3wf.refresh_if_stale)을 확인합니다: 파일 mtime이 변경되면 그래프를 다시 읽고, 변경된 매개변수를 하나씩 출력합니다([wf] N개 매개변수 변경 감지).
rack/desk/cast의 h3_data, seed, filename_prefix는 런타임에 주입되는 값이며 사용자 변경 사항으로 간주되지 않으므로 제외됩니다.
하지만 API 수준에서 우회할 수 없는 한 가지 제한이 있으며, 사용자에게 적극적으로 알려야 합니다:
ComfyUI의 캔버스 상태는 워크플로우를 저장(Ctrl+S)한 후에만
ComfyUI/user/default/workflows/*.json에 기록되며, 저장되지 않은 캔버스 변경 사항은 어떤 인터페이스로도 읽을 수 없습니다.
따라서 작업을 시작할 때마다 사용자에게 한마디 해야 합니다: 매개변수를 변경했으면 Ctrl+S를 누르십시오.
사용자가 변경한 후 Queue를 한 번이라도 눌렀다면, 해당 실행 그래프는 /history에 들어가므로 두 번째 판단 기준으로 포착될 수 있습니다.
동작:
- 먼저 사용자에게 알립니다: ComfyUI 데스크톱 프로그램을 열고, 이번에 사용할 워크플로우를 로드한 후, '준비'라고 말할 때까지 기다립니다.
- 전제 조건:
sync는 ComfyUI/history에서 가장 최근에 성공적으로 실행된 비디오 작업을 읽습니다.- 방금 워크플로우를 변경/설치한 경우 → 사용자에게 인터페이스에서 수동으로 한 번 실행(어떤 세그먼트든 상관없음, 통과만 하면 됨)을 요청한 후
sync를 수행합니다. - 한 번도 성공적으로 실행된 적이 없는 경우 → 인터페이스 파일로 대체:
h3wf.py sync --from-ui "<워크플로우>.json"(ComfyUI가 실행 중이어야 함).
- 방금 워크플로우를 변경/설치한 경우 → 사용자에게 인터페이스에서 수동으로 한 번 실행(어떤 세그먼트든 상관없음, 통과만 하면 됨)을 요청한 후
- 활성 확인 + 인식:
$PY scripts/h3wf.py show # 인식 결과만 확인 $PY scripts/h3wf.py sync # 인식 통과 후 이번 생산의 기준으로 디스크에 저장 - 출력 해석:
rack/desk/cast/seed/final다섯 가지 필수 역할이 모두 값이 있어야 함; 없으면 워크플로우가 노드 클래스 이름을 변경한 것이므로, 이 줄을 사용자에게 보여주고 스스로 추측하지 말 것.[note]에는 다중 후보를 어떻게 선택했는지 기록됩니다. 동일한 출력은 세 가지 항목을 더 제공하며, 하나라도 없으면 이후 단계에서 문제가 발생합니다:- 프로젝트 이름(감독대
chain.name):submit은 이를 사용하여 완성된 영상이h3_chain/의 어떤 디렉토리로 이동할지 결정하며, 첫 번째submit시 이를project.json.chain에 바인딩으로 기록합니다. '—'로 표시되면 감독대에 프로젝트 이름이 입력되지 않은 것이며, 이 경우submit은 스킬 프로젝트 이름으로 대체하고 경고를 발생시킵니다 — 이는 별도의 영화를 시작하는 것과 같으며(바인딩은 기록되지 않음). 바인딩 후 이름을 변경하면 거부됩니다. §10.1 참조. - 1차 채취 접두사:
watch/gate --latest는 이 접두사를 사용하여 1차 채취 파일만 인식합니다. '—'로 표시되면 전체 접두사로 대체되며, 전체 체인을 실행한 후 초해상도/최종 파일을 1차 채취로 잘못 인식하여 이중 검사할 수 있습니다. [WARN]파일 수거 경로: '세그먼트 끝 귀환' 또는 그 '순서 앵커'가 연결되어 있지 않으면 완성된 영상이 감독대로 돌아오지 않아 다음 세그먼트가 연결되지 않습니다.
- 프로젝트 이름(감독대
- ComfyUI가 열려 있지 않은 경우 헤드리스 시작 허용(포트 8188, 데스크톱 프로그램에 영향 없음):
하지만 사용자가 직접 연 것을 우선 사용하며, 노드 상태는 그의 인터페이스를 기준으로 합니다.cd "D:/Comfy-Desktop/ComfyUI-Installs/ComfyUI (1)/ComfyUI" ".venv/Scripts/python.exe" main.py --port 8188 \ --input-directory "D:/Comfy-Desktop/ComfyUI-Shared/input" \ --output-directory "D:/Comfy-Desktop/ComfyUI-Shared/output" \ --enable-assets --disable-auto-launch
워크플로우가 변경된 경우: h3wf.py doctor는 '노드 번호 변경됨 / 접두사 변경됨 / 프로젝트 이름 변경됨 / 역할 누락'을 나열합니다.
의도적인 업데이트로 확인된 경우 → h3wf.py sync --force로 다시 핸드셰이크를 수행하면 이후 모든 제출이 자동으로 새 그래프를 사용합니다.
submit은 호출될 때마다 지문을 재확인하며, 확인되지 않은 드리프트는 직접 거부됩니다(밤새도록 이전 그래프를 몰래 사용하지 않음).
핸드셰이크 시 history_seq 워터마크가 기록됩니다: 이보다 이른 실행 그래프는 드리프트로 간주되지 않으며(/history가 지워지기 전에 남은 이전 기록),
핸드셰이크 이후에 새로 생성된 그래프가 다른 경우에만 거부됩니다.
3. 1단계: 감독 스케줄링 (필수, 대본을 받으면 가장 먼저 할 일)
대본을 받은 후 바로 프롬프트를 작성하는 것을 허용하지 않음. 먼저 director-advisor 스킬을 로드하여 완전한 스토리보드 방안을 생성합니다:
- 5가지 요소 분해: 감정 톤 / 드라마틱 비트 / 인물 관계 / 공간 / 동작
- 리듬 골격 결정: 샷 수, 긴장 곡선(최고점은 하나만), 오프닝 샷과 마무리 샷
- 샷별 설계: 구도=감정 거리, 카메라 움직임=감정 이동, 한 샷에 하나의 동작 단위, 지속 시간 1~3초(최대 5초), 각 샷에 설계 이유 한 줄 포함
- 실제 영화 사례 앵커 1~2개 연결(
director-advisor/references/master_cases.md에서만 가져올 것)
그런 다음 references/directing_bridge.md에 따라 H3 세그먼트로 변환하고, 세그먼트 계획표를 디스크에 저장합니다:
{"name": "영화 제목", "segs": [
{"seg": "seg01", "length": 175, "shots": "1-4", "dialogue": false,
"hook": "첫 번째 세그먼트: 풀 샷으로 공간 구축", "sfx": true, "event": "그녀가 석조 주택으로 걸어 들어가 등을 내려놓는다"}
]}
length: 175(≈7.29초, 3-4샷)이 권장값; 124(≈5.17초, 1-2샷) / 243(≈10.13초, 2-4샷)도 사용 가능. 핵심 공식: 순수 새 프레임 = length − cont_frames. cont_frames=5일 때, 175프레임은 순수 170프레임(7.08초), 124프레임은 순수 85프레임(3.54초) — 동일한 연결 오버헤드에서 175의 순수 출력이 두 배이며, 렌더링 시간은 4~4.5분으로 가성비가 가장 좋습니다. 대사가 있는 세그먼트도 175를 사용하고, 243을 사용하지 마십시오: 세그먼트가 길수록 대사가 세그먼트 끝까지 밀릴 가능성이 높아집니다(§12 대사 타임라인 철칙 참조).hook: 이전 세그먼트와의 연결(자세/시선/조명 연속), hook을 작성할 수 없으면 세그먼트를 잘못 나눈 것입니다.dialogue/sfx: 오디오 게이트가 어떤 항목을 검사할지 결정(대사 없는 세그먼트는 무음 검사, 폴리 없는 세그먼트는--fx해제).- 검증:
$PY scripts/h3proj.py plan --check
하나의 세그먼트 = 하나의 이벤트, 세그먼트 내에서 여러 샷 가능([비트 N]이 샷 위치이며, '하드 컷 투...'라고 쓰면 H3가 그대로 컷함);
공간(맵)과 주요 이벤트는 변경할 수 없음. 컷 지점은 반드시 동작 위에 있어야 하며, 시간에 따라 균등 분할해서는 안 됩니다.
스토리보드를 작성할 때 동시에 두 가지 내용 점검을 수행합니다(자세한 내용은 references/vividness.md 참조):
- 논리 4가지 질문: 이 순간 인물은 무엇을 하고 싶은가? 그는 어디에 있으며 누구를 향하고 있는가? 시간/조명이 연속적인가? 이전 동작의 인과 관계가 끊어지지 않았는가?
- 생동감 3종 세트: 각 비트에 최소한 '동작 원인 + 환경 반응 + 재료 촉감'을 하나씩 제공해야 하며, '서서 말하기'만으로는 안 됩니다.
3.1 선택적 강화: 고품질 격투 및 이인 대치 자세 파이프라인 (Shisei Pose Guidance)
대본이 근접 격투, 무기 교차, 이인 양방향 대치 또는 복잡한 사지 얽힘을 포함하는 경우, 비디오 모델의 일반적인 '동작 약화, 해부학적 변형, 정면이 뒷면으로 바뀜(180° 축선 뒤집기)'을 방지하기 위해 로컬 Shisei 자세 가이드를 장착합니다(자세한 내용은 references/shisei_combat_pipeline.md 참조):
- 자세 검색: 로컬 검색 스크립트를 사용하여 55개의 이인 대치 동작과 288개의 단인 동작을 조회:
python scripts/shisei_pose.py --duo --search "근접" - 다중 시점 선화 추출: 감독의 카메라 위치에 따라 5가지 주요 시점(
front정면 /side측면 /diag45° 사각 /above조감 /below앵글)의 선화를 프로젝트 디렉토리로 내보내기:python scripts/shisei_pose.py --get D001 --view diag --out references/poses - 첫 프레임 골격 앵커링: 추출된 자세 선화와 캐릭터 카드(
sal_character_sheet.jpg등)를 이미지 생성 엔진(Imagen / Qwen)에 공동으로 주입하여 100% 구도가 정확한 첫 프레임을 생성한 후, MiniMax H3에 주입하여 공간 드리프트와 약한 동작을 완전히 방지합니다.
3.2 강제 공정: 스토리보드 첫 프레임 이미지 생성 검증 및 I2V 기하학적 얼굴 고정 (Keyframe Gate)
산업 철칙 (최고 우선 순위 인식): 인물 정면/반신 클로즈업이나 핵심 소품 상호작용(예: 시계 분해, 총 잡기, 돈 세기, 도장 찍기)이 있는 세그먼트의 경우, 순수 텍스트-비디오(T2V) 블라인드 생성 완전 금지! '첫 프레임 이미지 생성 검증 ➔ 이미지-비디오(I2V) 얼굴 고정 변형 방지'를 반드시 실행해야 합니다.
- 핵심 논리:
- 정적 이미지 생성은 5 ~ 15초/장만 소요되며, 모든 잠재 공간 해상도를 얼굴 특징, 머리카락, 소품 미세 구조에 집중할 수 있고, 만족스럽지 않으면 초 단위로 재생성;
- 비디오 렌더링은 단일 세그먼트당 4 ~ 8분이 소요됩니다. 순수 텍스트-비디오는 물리적 앵커 포인트가 없어 해부학적 드리프트가 발생하기 쉬우며, 사후 '자동 품질 검사' 재생성 비용은 40배 더 비싸고 근본적인 해결책이 아닙니다;
- 선택된 첫 프레임 이미지를
MiniMaxH3ImageToVideo의first_frame포트에 주입하면, 0번째 프레임이 기하학적 진리값으로 고정되어 모델이 구조를 상상할 필요 없이 모든 주의력을 '동작 구동 및 입술 모양 정렬'에 할당하므로 얼굴 변형률이 30%에서 2% 미만으로 급감합니다!
- 실행 흐름:
- G0 캐릭터 에셋 카드: 작업 시작 전에
references/character_sheet_standard.md에 따라 2+3 머리 분리형 캐릭터 설정 카드를 준비; - G1.5 첫 프레임 이미지 생성 검증: 스토리보드 작성 후, 이미지 생성 도구를 사용하여 빠르게 16:9 첫 프레임 영화 스틸을 생성하고, 얼굴 특징, 시선 초점 및 소품 정확성을 확인;
- 확정 디스크 저장: 검증 통과 후
<프로젝트>/segments/<seg_id>_keyframe.png(또는.jpg)로 저장; - 자동 인식 및 I2V 마운트: 파이프라인이 첫 프레임 이미지가 존재함을 감지하면
scripts/keyframe_gate.py를 통해 자동으로 ComfyUI에 동기화하고first_frame포트를 연결합니다. 감지되지 않으면 자동으로 순수 텍스트 기반으로 부드럽게 다운그레이드됩니다. 자세한 내용은references/keyframe_i2v_guide.md를 참조하십시오.
- G0 캐릭터 에셋 카드: 작업 시작 전에
4. 2단계: 프롬프트 작성 (표준 = references/prompt_standard_v2.md)
- 7개 섹션 구조,
[비트 N],<Audio N>음성 카드,overall_soundscape3계층 사운드, 세그먼트 이름을 한 글자도 바꾸지 말 것. - 프롬프트는
segments/<seg>.txt에 작성(순수 프롬프트 본문, 코드 블록으로 감싸지 말 것). - 음성 카드: 프로젝트의
voice_card.json을 우선 사용(h3proj.py new가 이미 템플릿을 복사함), 세그먼트 간에 글자 단위로 일관성 유지. - preflight는 별도로 실행할 필요 없음:
submit내부에서check_prompt_v2.check()를 호출하며, FAIL이 있으면 직접 거부됩니다. 미리 별도로 확인하려면:$PY scripts/check_prompt_v2.py --file segments/seg01.txt --length 243
형식 요점 빠른 참조(세부 사항은 규범 문서 기준): <Subject N>에 모두 권한= 포함; 감정 단어 불허용;
각 비트 음향: 항목별로 지목 + '오직 이 N종만, 다른 소리 없음' 마감; 대사 종료 지점에서 세그먼트 끝까지 ≥1.0초; 한 세그먼트에 한 줄의 대사.
부정어 역효과 (실측, 두 번 경험): H3는 금지어의 개체명을 긍정적 힌트로 간주하여 그림에 그려냅니다.
방지 오류 제약에서 '물 용오름, 물기둥, 분수 생성 엄금'이라고 쓰면, 화면에 하얀 물기둥이 하나 생깁니다;
동작 설명에서 '헬멧 앞쪽 가장자리가 위로 올라간다'고 쓰면, 주인공 머리 위에 투명한 헬멧이 생깁니다.
규칙: 어떤 것을 등장시키지 않으려면, 그 이름을 문장에서 완전히 삭제하고, 진정으로 원하는 화면을 긍정적으로 설명하십시오
(예: '수직 아래로 내려다보며, 원형 함몰과 물에 잠긴 검은 인영만 있음'), 'X가 아님, X를 하지 마십시오'와 같이 쓰지 말 것.
방지 오류 제약에는 추상적인 제약만 남깁니다(워터마크 없음/자막 없음/기형 손 없음/화염 광효과 없음).
연속 잠재는 첫 비트의 인물을 비틀 수 있음 (이 프로젝트에서 5회 재현, 가장 비싼 함정):
--cont가 있는 세그먼트의 첫 비트는 안정적으로 검은색 긴 로브를 입고 긴 머리를 푼 키 큰 뒷모습을 생성합니다. 비록
이전 세그먼트의 마지막 프레임이 '물 표면 내려다보기 + 물에 떨어진 검은 그림자'(seg02)이거나 '첸모 얼굴 클로즈업, 검은 티셔츠'(seg03)이더라도,
참조 이미지가 올바르게 주입되었고([rack] 소재 1개: 첸모→첸모.png), 텍스트가 옷을 자세히 설명했음에도 모두 무시됩니다.
동일한 프롬프트, 동일한 참조 이미지, 동일한 seed 구간에서 --cont off로 변경한 후 두 번 모두 정상으로 돌아왔습니다
(seg02 첫 비트는 검은 티셔츠에 짧은 머리의 첸모로 돌아감; seg03 첫 비트는 순수 빈 공간 도시 조감도로 돌아감).
판단 및 처리:
- 이 프로젝트 결론: 연속은 유지하되, 5프레임만 고정(
project.json의cont_frames: 5, 즉 0.21초). 사용자가 원하는 것은 '몇 프레임으로 컨텍스트 일관성을 보장하는 것'이며, 39프레임(1.625초)은 너무 낭비이고, 후반에 세그먼트별로 잘라내야 합니다. 순수 하드 컷(해변 → 문 밖과 같은 대본 자체의 장소 점프)인 경우--cont off를 사용합니다. 앵커 오염이 5프레임에서도 여전히 발생하는지 실측 기록이 필요합니다; 첫 비트의 인물이 맞지 않으면 먼저--cont off를 시도합니다. - 일반 판단 기준: 연속은 '동일한 공간, 동일한 카메라 위치, 동작이 직접적으로 연속'되는 경우에만 유용할 수 있습니다;
첫 비트의 인물 의상/체형/헤어스타일이 맞지 않으면 먼저
--cont off로 한 번 테스트(1차 채취는 2분만 소요)하는 것이 텍스트를 변경하는 것보다 훨씬 빠르며, 텍스트 변경은 효과가 없습니다. - 연속을 활성화하면
[cont] clip_xxxx(...) 연결이 출력됩니다; 첫 프레임을 확인한 후 유지 여부를 결정하십시오.
4.1 H3 준수 경계 (프롬프트 작성 전 필독)
다음은 실측을 통해 확인된 하드 경계이며, 텍스트를 변경해도 소용없고 seed를 변경해도 소용없으며, 작성법으로 우회할 수밖에 없습니다. 모든 내용은 13개 세그먼트 / 86초 완성본의 연속 기록에서 비롯된 것이며, 추측이 아닙니다.
| 당신이 시키려는 것 | 실측 결과 | 대체 작성법 |
|---|---|---|
| 후방 당김 / 멀어짐 / 푸시 인 (변위형 카메라 움직임) | 4번 모두 실패. '막대기가 보일 때까지만 뒤로 물러나서 멈춤'이라고 써도 여전히 창문 밖으로 나가 다른 내벽이 드러남 | 순수 팬(동일 카메라 위치에서 각도만 변경: 먼저 아래로 팬하여 바닥, 그런 다음 다시 위로 팬)으로 전환하거나, 직접 하드 컷 사용 |
| 카메라가 창문/구멍을 통과하여 내부 진입 | 문이 열리게 됩니다. '문은 계속 닫힌 상태를 유지하고, 빈 창문 구멍으로만 진입'이라고 써도 소용없음 | 세그먼트 내 하드 컷으로 내부 진입, 조립 시 세그먼트 시작을 컷 지점까지 자름; 어떤 카메라 움직임 전환보다 안정적 |
| 창문 밖 풍경이 움직임 (차량 주행 중) | 생성되지 않음. '흰색 점선이 초당 3개씩 다가옴'으로 변경해도 소용없음(창문 영역 프레임 간 차이: 정지 1.26 / 움직임 작성 4.15, 육안으로도 움직임을 볼 수 없음) | 주행감은 후반 작업으로 엔진음 + 약한 차체 흔들림으로 보완하고, 생성에 의존하지 말 것 |
| '구도 변경 없음 / 푸시 인 없음 / 푸시-풀 없음' | 준수도 낮음, 후반부에도 여전히 푸시 인 발생 | 긍정적 설명으로 변경: '화면에 항상 전체 X가 들어맞음(문틀 상단에서 발판까지)' — '반드시 포함해야 하는 것'으로 제어 |
| 'X가 나타나지 않도록 / X가 아님' | 역효과 발생, X가 오히려 그려짐 (위의 부정어 역효과와 동일) | X의 이름을 문장에서 완전히 삭제 |
| 동일한 비트에서 2개 이상의 동작 | 각각 절반만 수행하거나 가장 '재미없는' 것을 건너뜀(문 닫기가 '두 손을 운전대에 올림'에 밀림) | 한 비트에 최대 두 개의 동작; 네 개의 동작이면 비트를 나누거나 삭제 |
| '약 X초에 말을 마침 / N번째 비트 시작 부분에 발생' | 시간 설명 완전히 무효 | H3의 타임라인은 텍스트 이벤트 순서로 결정되며, 블록의 순서 위치만 조정 가능 |
| 단일 세그먼트에 여러 시간대의 카메라 움직임 작성 (0-3초 푸시, 3-5초 정지) | Qwen3-VL이 중간에 카메라 위치가 바뀐 것으로 오인, 세그먼트 내 화면 플래시 컷 유발 | 단일 [Shot 1]에 엄격히 처음부터 끝까지 관통하는 카메라 움직임 명령 하나만 작성 |
중근거리 샷에 일어나기(rises from chair) 작성 | 인물 머리가 화면 프레임 상단 가장자리를 벗어나 머리 절반이 잘림 | 폭발적인 장면은 leans sharply forward across table with veins bulging(격노하여 앞으로 몸을 기울이며 테이블을 짚음)으로 대체 |
| 측면 샷에 복수 얼굴 특징 (brows/eyes) 또는 부정문 작성 | 모델이 양안을 그리거나 부정어 역효과로 인해 강제로 카메라를 향해 고개를 돌림 | 복수 얼굴 특징 및 turn/camera 단어를 엄격히 금지, 순수하게 긍정적인 측면 정적 설명 사용, 끝부분에 TailLock 잠재 변수 클램프로 고정 |
| 평온한 음성 파형으로 절정 장면에서 외침이 나오지 않음 | 참조 오디오의 평온한 억양이 오디오 잠재 공간 에너지를 고정함 | T8mars 프로토콜 사용: 대사에 포효 부언어 접두사 추가, 0.4초에 물리적 충격 순간 Foley를 주입하여 음향 에너지 폭발(+10dB) |
한마디로: H3는 '화면에 반드시 있어야 하는 것'은 듣고, '카메라가 하지 말아야 하는 것'은 듣지 않습니다; '이벤트 순서'는 듣고, '초'는 듣지 않습니다.
연속 세그먼트에는 또 하나의 전용 경계가 있습니다: 연속 쓰기 블록이 끝나는 프레임에서 모델이 참조 이미지 구도로 '재설정'될 가능성이 가장 높습니다. 이때가 하드 컷이면, '다른 샷을 시작'할 기회를 갖게 됩니다 — 실측에서 seg02 첫 번째 버전의 처음 38프레임은 완벽하게 연결되었지만, 39프레임이 끝나자마자 인물 전체가 사라지고 참조 이미지의 무인 풀 샷으로 점프했습니다. 따라서: 연속 세그먼트에는 하드 컷을 작성하지 말고, 원샷 원테이크 + 동일한 카메라 위치가 가장 안정적입니다; 샷 전환이 필요하면 별도의 세그먼트로 만드십시오.
5. 3단계: 생성, 모니터링, 파일 수거 (하나의 명령으로 한 가지 작업)
# ① 제출 (preflight + 프로젝트 등록 + 연속 + seed 선택 + 기준선 기록)
$PY scripts/sop_run.py submit --seg seg01 --assets 소재.json [--length 243] [--silent]
# 소재.json: {"캐릭터1":"cglide/<프로젝트>/캐릭터1.png", "장면":"cglide/<프로젝트>/장면.png"}
# --dry-run 조립만 하고 제출 안 함 (새 세그먼트 등록 안 함, 프로젝트 파일 건드리지 않음), ComfyUI가 그래프의 필수 항목을 검증하도록 함
# --chain <프로젝트 이름> 핸드셰이크 그래프의 chain.name을 재정의 (바인딩된 값과 같아야 함, 그렇지 않으면 거부)
# --rebind 실제로 감독대 프로젝트를 변경해야 할 때만 사용 (바인딩 재설정, 연속이 여기서 끊어짐)
# --cont auto|off|<연속 촬영 세그먼트 경로> 기본 auto=이전 세그먼트에 연결, off=첫 번째 세그먼트로 간주
# --allow-nocont 이 세그먼트가 실제로 독립적으로 시작해야 할 때 사용: '연속 촬영 세그먼트를 찾을 수 없음' 허용
# ② 모니터링 (백그라운드에서 실행 권장: 이 단계는 1차 채취가 디스크에 저장될 때까지 기다렸다가 즉시 이중 검사 수행)
$PY scripts/sop_run.py watch --seg seg01 --timeout 3600
**실패 판단 시 즉시 GPU를 양보해야 함**. 1차 채취가 디스크에 저장되면 2차 채취가 시작됨; 전체 품질 검사(프레임 추출 + 시각적 정량화,
십여 초)의 결론을 기다렸다가 중단하면, 3차 채취/초해상도가 이미 실행 중일 수 있어 컴퓨팅 파워가 낭비됨. 따라서 `watch`는 이제 두 단계로 나뉩니다:
- **디스크 저장 즉시 오디오 빠른 검사**(`_fast_audio_gate`)
...
[내용이 번역을 위해 잘렸습니다]