디지털 휴먼 영상 제작 파이프라인 (로컬 전구간 검증 완료 ✅)
2026-09-21/22 실측 완료: 74.8s 음성 → 15.6s 테스트 영상 (A7 아바타 + MiniMax 복제 음성 + HyperFrames 패키징) 전 과정 0 실패. 모든 스크립트는
D:\workbuddy\Claw\Claw에 위치하며,D:/Anaconda3/envs/ai/python.exe -X utf8로 실행 (faster_whisper가 이 환경에 설치됨). 2026-09-29 보충: [0] 문구 일관성 게이트——슬로건/마무리 문장이 두 번 임의로 변경된 사례 (게이트 항목 참조). 현재는 1거부권 선행 단계.
전체 흐름 (게이트 + 6단계)
[0] 문구 게이트(필수) → [1] 마스터 오디오 → [2] ASR 전사+구간표 → [3] MiniMax 복제 음성(B2 레시피)
→ [4] HeyGen photo avatar + lipsync → [5] HyperFrames 투명 오버레이(ProRes4444)
→ [6] ffmpeg 합성(자막/효과음/BGM/음량) → 완성 영상 + 썸네일
[0] 문구 일관성 게이트 (필수, 1거부권, 모든 생성 작업보다 우선)
배경: 슬로건/마무리 문장이 두 번 임의로 변경됨 (2026-09-28 오프닝 4연속 질문이 방향 변경+슬로건 누락, 24크레딧 재작업; 2026-09-29 마무리 「출처 선점」이 「필수 과목」으로 변경). 교훈: 기억/자각은 신뢰할 수 없음——규칙은 메모리에 저장되지만, 위반은 작업 중간에 발생하며 그 시점에 규칙은 이미 컨텍스트에서 사라짐. 해결책은 「자각」을 「메커니즘」으로 바꾸는 것: 레지스트리 + 스크립트 하드 검증 + 수동 승인 게이트.
세 가지 철칙:
- 슬로건/마무리 문장/출처는 반드시 원본 스크립트를 한 글자씩 대조——원본=구간 TTS 스크립트의 ANCHOR 구간 또는 완성 영상 자막 원본. 임의 작성 금지, 「구어체 미세 조정」 금지;
- 초안 작성 전에 원문 인용: 새 단락 초안 작성 후, 슬로건이 포함된 원문을 한 글자씩 사용자에게 제시하여 승인을 받은 후에만 생성 진행;
- 유료 생성 전 반드시 게이트 통과: TTS/HeyGen 등 크레딧 소모 작업 전에 슬로건 검증이 반드시 PASS 되어야 함.
동작 (2종 세트):
- 레지스트리:
문구규격_확정.json(유일한 권위 있는 원본. 새 확정 문장은 사용자 승인 후 등록); - 검증:
D:/Anaconda3/envs/ai/python.exe -X utf8 도구_슬로건검증.py <대상파일...>- .md/.txt/.json 지원 (직접 읽기), .ass (태그 제거 후 자막 텍스트 추출), .py (문자열 리터럴 추출, TTS 문장 상수 포함);
- 자동으로 구두점/공백 정규화 후 부분 문자열 매칭;
closed_targets는 봉인된 대상에 대해 경고만 하고 차단하지 않음; - exit 0=PASS 계속 진행 가능; exit 1=FAIL 유료 생성 차단;
--self-test자체 점검;
- 상세 메커니즘 설명:
references/copy-slogan-gate.md(배포판).
게이트 삽입 지점 (매 회차 실습 시 순차적으로 실행):
| 시점 | 동작 |
|---|---|
| 초안 작성 후, TTS 이전 | 도구_슬로건검증.py 도구_제XX회TTS.py → 반드시 PASS |
| HeyGen 제출 전 | 다시 검증 (중간 수정으로 인한 표류 방지) |
| 최종 조립 후, 배포 전 | 도구_슬로건검증.py <sub.ass> <배포문안.md> → PASS 되어야 Feishu/배포 가능 |
| 실패 처리 | 원본 스크립트로 한 글자씩 복원; 실제 새 확정 문장일 경우 → 사용자 승인 → 레지스트리 업데이트 → 재실행 PASS |
[1] 마스터 오디오 요구 사항
- 문장 끝이 완전히 마무리되어야 함 (절단 버전 사용 금지); 음량 -16 LUFS 기준; 30–90s 깨끗한 녹음은 복제 등록용 소스로 겸용 가능.
- 복제 등록에는
오디오_음성원본_092211_문장끝마무리_69초.m4a사용 (74.8s 반쪽 버전 사용 금지).
[2] ASR 전사 + 구간표
D:/Anaconda3/envs/ai/python.exe -X utf8 도구_팟캐스트ASR전사.py <오디오> --md 전사_xxx.md
- 단어 수준 타임스탬프 출력 (
.asr_cache/*.json캐시 있음, 재실행 시 즉시 반환); 전사 결과를 기준으로 5구간 정도로 분할, S1–S5 및 정보 포인트 표시; - 테스트 구간은 18–30s 선택: 중영 혼합, 일시 정지가 포함된 구간이 가장 대표적임.
[3] MiniMax 음성 복제 + 더빙
도구: 도구_MiniMax음성복제_범용.py (API 키 .secrets/minimax.key + minimax_group.txt, 중국 내 사이트 직통 연결, 프록시 불필요).
--check무료 →--clone --yes복제 (voice_id 규칙: 8자 이상 영문 숫자, 영문자로 시작,haifengv1사용) →--t2a더빙;- 더빙 레시피 확정판 「B2」:
speech-2.8-hd+speed:0.95, 감정 태그 없음 (사용자 검수: 음색 괜찮음, B2 톤 수용 가능); - 어색한 톤 조정 우선순위: 문안 구어체화 > speed 0.95 > emotion=happy > 더 긴 샘플 재복제;
- 비용 참고: HD 3.5위안/만자, 한 문장 <1펀.
[4] HeyGen 디지털 휴먼
선행: 프록시 반드시 켜야 함 (127.0.0.1:7890 수신 확인 + mcp.heygen.com 연결 테스트).
- 도구:
도구_팟캐스트테스트영상A7_준비_2026-09-21.py(무료: 크레딧/schema/아바타 확인/오디오 전송) →도구_팟캐스트테스트영상A7_제출_2026-09-21.py(--yes게이트); - 아바타 A7 + avatar_v 엔진; 2분 내외 출력, 다운로드 후 probe 검수;
- ⚠️ 실제 단가 ~0.85 크레딧/초 (15.7s 영상 실측 13크레딧, 559→546). 전체 영상 제출 전에 30s 중간 구간으로 먼저 단가 확인.
[5] HyperFrames 투명 오버레이 (카드/차트 애니메이션)
프로젝트: _cards_hf/compositions/v2_testcard.html (문안만 수정: 텍스트+타임스탬프).
- 구동 방식:
gsap.timeline({paused:true})를window.__timelines["main-video"]에 등록 + 요소data-start/data-duration; - 렌더링 (약 4.5–5분 소요, overlay_v2.mov 172MB는 확정판까지 보관, 중간에 삭제 금지——삭제 시 재렌더링 5분):
export PATH="/d/ffmpeg:/c/Users/admin/.workbuddy/binaries/PortableGit/versions/1.2.0/usr/bin:$PATH"
cd _cards_hf && npx hyperframes render -c compositions/v2_testcard.html -f 25 --format mov \
-o "../_v2/overlay_v2.mov"
- ⚠️ 네 가지 필수 함정 (모두 실측으로 해결 완료):
- 루트 요소에 반드시
data-composition-id="..."가 있어야 함, 없으면HF_DE_COMPOSITION_ROOT_MISSING; - 화면 크기는
data-width/data-height사용 (data-composition-width는 인식되지 않음 → 세로 1080×1920 출력); - 렌더링 머신 PATH에 ffmpeg와 ffprobe가 모두 있어야 함 (D:\ffmpeg에 ffprobe가 없었던 경우 →
npm i ffprobe-static --registry=https://registry.npmmirror.com으로 1분 해결; gyan.dev에서 114MB 패키지 다운로드 금지——국내 ~20KB/s에 연결 끊김); - 렌더링 출력 1920×1080, 합성 시 1072로 스케일하여 완성 영상과 정렬.
- 루트 요소에 반드시
[6] ffmpeg 합성 전달
도구: 도구_테스트영상v2합성_2026-09-22.py (매 회차 복사 후, 상단 SRC/OV/자막/포인트 상수만 수정).
- 체인: zoompan punch-in (8.45/13.25s 각 5%) → overlay ProRes4444 → ASS 자막 (
ass=경로는 반드시 슬래시 상대 경로, 백슬래시는 이스케이프되어 무시됨) → 효과음 3종 세트 (adelay 정렬) → BGM 배경 (sidechaincompress 보컬 회피) → loudnorm -14 LUFS; - 자막: 단어 수준 타임스탬프로 문장 분할, 강조 단어는
{\c&H6ABEE9&}단어{\r}(BGR 금색); 썸네일은 13.8s 프레임 추출.
BGM / 효과음 패러다임 (문서화 완료: 정리_지식형영상BGM및효과음패러다임_2026-09-22.md)
지식형 음성 해설 = BGM 패러다임 B「정보 동반형」: BGM은 교실의 조명이지 무대 배경 음악이 아님.
- 멜로디 없음 (pluck/핑거피킹, "노래하지 않음"); 2. C4+ 중고음역 (저음역 장음 legato = 분위기 패드 drone = 답답함, v2.2 교훈); 3. 스타카토 여백; 4. BPM 88–104로 말하기 속도에 맞춤; 5. 주파수 대역이 보컬 300Hz–3.4kHz와 충돌 회피; 볼륨 레벨 -28~-32 LUFS (보컬 대비) + 사이드체인 회피 (threshold 0.028 / ratio 7 / attack 180ms / release 1000ms).
- 두 가지 프리셋:
make_bgm_pluck(기본) /make_bgm_pad(A/B 예비),BGM_STYLE한 단어로 전환; 스타일 변경 시 코드표만 수정.
효과음 3종 세트 (레시피 고정, 포인트만 변경): whoosh 전환 (lowpass ≤2400) → tick 피드백 (1.2–1.6kHz, 최소 볼륨) → thump 강조 (전체 영상 ≤2회 느낌표); 볼륨 비율 강조 0.24 : 전환 0.22 : 피드백 0.165; 임의 2s 윈도우 ≤1개 포인트.
비용台账 (실측 기준)
| 항목 | 비용 |
|---|---|
| ASR / ffmpeg / HyperFrames / BGM 합성 | 0 |
| MiniMax 복제 | 9.9위안/음색 (첫 합성 시에만 청구); TTS ≈0.02위안/문장 |
| HeyGen 테스트 영상 | 13 크레딧 / 15.7s; 69s 전체 영상 추정 ~59 크레딧, 2:44 버전 추정 ~140 |
검수 체크리스트 (완성 후 항목별 확인)
- 슬로건 게이트:
도구_슬로건검증.py <sub.ass> <배포문안.md>PASS (확정 문장이 한 글자씩 존재, [0]항목 철칙); volumedetect: mean ≈ -17dB / max ≤ -2.5dB (클리핑 없음);- 3프레임 추출 (차트 카드 / 키워드 카드 / 결론 카드 시점): 얼굴과 손이 0개 가림 (안전 영역: 왼쪽 카드 56–546px, 오른쪽 카드 1150–1860px, 상단 제목 84px, 하단 자막 200px);
- 청감 3포인트: 시작 3s에 에너지감, 보컬이 또렷함, 끝에 머무는 느낌.
할 일 (확정판 전 반드시 처리)
- 전체 마스터 오디오 확정: 69s 문장 끝 버전 또는 2:44 전체 재편집 (74.8s 반쪽 버전 사용 금지);
- 전체 영상 증량: A7 섹션 카드 ×5구간, S4 문장별 화면 전환, BGM 4–8마디 루프+코다 확장, 3s 관심 카드.