콤보 스타일 (블로거 A × 블로거 B)
포지셔닝 및 작업 방식
어두운 배경의 고정 프레임워크, 디지털 휴먼의 말은 '논리적 노드', 적지만 정확한 동적 효과는 '증거', 모든 컷이 말에 맞춰 움직입니다. 핵심 키워드: 고정된 프레임워크 / 말에 맞춰 움직임 / 적지만 정확. 기본적으로 블로거 A의 튜토리얼 프레임워크(어두운 배경 그리드, 자막 바, 좌측 하단 원형 PIP, 화면 녹화 줌 인/아웃, 키워드 카드, 챕터 카드, 형광 녹색 HUD)를 뼈대로 사용하고, 블로거 B의 다음 6가지 포인트를 차용합니다: 15–20초마다 풀샷 복귀; 모든 정적 자재는 선형 슬로우 줌; 데이터 주제는 차트를 증거로 사용; PIP를 차트/B-roll 위에 겹쳐 '확대 강조' 가능; 3분 데이터형은 챕터 각인 추가; 큰 숫자 카드. 최종 결과물은 1–3분, 16:9, 1920×1080, 30fps입니다(원본이 20분짜리 긴 영상인 경우, 이식 가능한 부분만 이식).
이것은 협업이며, 한 번에 생성하는 것이 아닙니다. 디지털 휴먼 영상은 사용자가 제공하거나(또는 사용자가 저희가 작성한 대본을 디지털 휴먼 도구로 생성), 자료(녹화, 스크린샷, 데이터)는 사용자가 제공합니다. Claude는 대본, 스토리보드, 동적 효과 및 렌더링을 담당하고, 각 라운드마다 결과물을 사용자에게 보여주고 피드백에 따라 수정하여 최종 결과물이 원본 영상만큼 정교해질 때까지 반복합니다.
- 품질 기준은 '원본처럼': 원본 영상의 증거 프레임을 항목별로 비교(글꼴, 그림자, 간격, 이징, 리듬)하고, lint 통과는 기본 확인에 불과합니다.
- 각 라운드에서는 소량의 결과물만 전달하고 사용자에게 구체적인 선택을 요청합니다. 전체 프로세스를 한 번에 완료하고 전달하지 마십시오.
- 사용자의 각 확인 및 선호 사항은 해당 프로젝트의 notes.md에 기록합니다. 프로젝트 간 공통 선호 사항은 references에 다시 기록합니다.
- 없는 자료나 도구는 '없음/구축 대기 중'이라고如实 말하고, 허위로 말하거나 이미 있는 것처럼 가장하지 마십시오.
전체 프로세스 단계 및 게이트 (자세한 내용은 references/production-playbook.md 참조)
S1 대본 (Notion 원고 → 압축 멘트 → 후크 재작성 → 영어 각색, 실제 말하는 속도로 단어 수 재계산) → S2 음성 (사용자 Fish 클론 음성, 절대 HeyGen TTS 사용 금지; 로컬 silenceremove로 일시 정지 최대 제한 + atempo; G2 사용자가 최종 길이 선택) → S2.5 자료 프롬프트 패키지 (사용자가 Gemini로 모든 비디오/이미지 생성, Claude가 각 프롬프트+초 제공; 입고 품질 검사; G2.5, references/gemini-asset-prompts.md 참조) → S3 HeyGen (브라우저 드라이브; 캐릭터/배경/13초 샘플 G3; 전체 렌더링 ≈0.8 크레딧/초; 신원 인증/결제/삭제는 사용자만 수행) → S4 샘플 G4 → S5 B-roll (Pexels, LICENSES 기록, 30fps, 항공 촬영만 보간) → S6 타임라인 (자막/키워드 시간은 단어 수준 강제 정렬에서 가져와야 하며, 추정 금지; 프리뷰 전 G5.5 자막 동기화 검사 통과, references/subtitle-sync.md 참조) → S7 저화질 프리뷰 라운드 v1..vN G5 → S8 동적 효과 정밀 수정+SFX+크리에이티브 그래픽 (references/motion-polish-and-sfx.md) → S9 최종 버전 crf18 + loudnorm -16 LUFS (-c:v copy) → S10 자체 점검 + 바탕 화면에 복사 G6 (130MB는 클라우드 드라이브에 넣지 않음).
기본적으로 BGM 없음: '음성+SFX' 버전으로 제공하며, 사용자가 Jianying에서 직접 음악을 추가합니다. assets.bgm은 작성하지 않고, SFX는 조용하게 유지합니다.
사용자가 중요하게 생각하는 사항 (각 영상 작업 전에 한 번씩 확인)
- 화면은 풍부한 실제 B-roll이어야 하며, 키워드 카드만 있으면 안 됩니다. 자료가 부족하면 무료 상업용 라이브러리에서 찾고, 글자로 대체하지 마십시오.
- 동적 효과는 매끄럽고 정교해야 합니다: 스프링/이징, 마스크+블러 등장, 모션 블러, 정확한 퇴장; 프레임별로 자체 점검.
- 퇴장과 음향 효과(SFX)도 있어야 합니다 (SFX는 가볍고, 밀도 ≤0.8/s); 구조적 지점은 크리에이티브 그래픽(체인/계단/게이트/아이콘)을 사용하고, 글자는 사용하지 않으며, 그래픽은 굵은 Anton 숫자, 굵은 선을 사용합니다.
- 영어 영상은 화면에 한자가 없어야 합니다 (B-roll 속 간판 포함, OCR로 스팟 점검).
- 원본 영상은 참조일 뿐, 그대로 복사하는 것이 아닙니다: PIP/자막이 겹치면 실제 상황에 따라 수정하고, 작은 디자인은 직접 결정하며, 시각적 변화가 큰 선택만 사용자에게 맡깁니다.
- 협업은 원클릭이 아닙니다: 각 게이트에서 멈추고 사용자에게 보여준 후, 확인 후 notes.md에 기록합니다.
왜 보기에 편안한가 (핵심 원리, 수치는 references/comfort-rules.md 참조)
- 편집이 말에 맞춰 진행됨: 약 70%의 컷 포인트가 자막 문장 전환 지점에 위치함 (블로거 A 중앙값 69%, 블로거 B 70–88%); 2–3문장마다 하나의 메인 화면 (4–7초); 단어가 언급될 때 해당 텍스트가 나타남 (−2~+4 프레임, 늦는 것이 빠른 것보다 나음).
- 고정 프레임워크 안에서 내용만 변경: 자막은 영상 전체에서 하나의 스타일, y축 흔들림 ≤1% 화면 높이; 두 가지 배경만 사용 (#010101 그리드 / 어두워진 B-roll); 강조 색상 ≤3; 한 화면에 ≤1 메인 제목 + 3–4 요소.
- 카메라 움직임은 적지만 목적이 있음: 화면 녹화 줌 인은 1.12배까지, 약 28프레임 ease-in-out; 앵커 punch-in 1.08배, ≤2회/분; B-roll 선형 슬로우 줌 1→1.08; 카메라 움직임은 콘텐츠 레이어에만 적용되고, PIP/자막/HUD는 움직이지 않음.
- 앵커 = 판단, 동적 효과 = 증명: 질문, 전환, 요약 시 앵커에게 풀샷 제공; 사실, 숫자, 프로세스, 인터페이스, 비유 시 동적 효과 제공. 풀샷은 15–20초마다 한 번씩 복귀하고, 얼굴 없는 구간 ≤10초.
- 동적 효과 지속 시간에는 단계가 있음: 하드 컷 0 / 빠름 6프레임 / 표준 12프레임 (느림 18프레임); 머무름 ≥40프레임.
언어 스위치 (중국어 버전 / 영어 버전)
- 기본 중국어 버전: 이 파일과 다른 references의 수치는 중국어 버전 매개변수이며, 변경되지 않습니다.
- 영어 버전 (사용자가 "영어 버전/순수 영어 영상"이라고 말하거나, notes.md에 lang=en이 기록된 경우): 먼저 references/english.md를 읽습니다. 이 파일은 영어 대체 값을 제공합니다(단어/초, 자막 단어 수, 라틴 글꼴 및 크기, lint 영어 임계값, TTS 발음, 영어 후크, HeyGen/Fish Audio 주의 사항). 중국어 매개변수와 충돌하는 경우 영어 버전은 english.md를 기준으로 하며, 나머지(리듬, 카메라 움직임, 색상 값, 자막 위치 y 0.905H 및 크기 46px)는 그대로 사용합니다.
- 영어 버전 하드 규칙: 화면에 한자 0개 (자막, 키워드, 헤드 워드, 챕터 카드, HUD, 단위, 라벨, 플레이스홀더, 오프닝/엔딩, 녹화 화면, 디지털 휴먼에 포함된 자막 모두 영어/숫자/기호). 목록 및 검사 명령은 english.md §4를 참조하십시오.
- 영어 버전의 글꼴/크기/lint는 이미 엔지니어링에서 구현되었습니다: 타임라인에
meta.lang:'en'을 작성하면 전환됩니다(기본값은 zh, 중국어는 영향 없음). english.md §3 마지막 줄에 나열된 소수의 변형(gold_card 등)만 아직 적용되지 않았습니다. 영어 버전 플레이스홀더 자료는public/placeholder/en/을 사용합니다(이전 플레이스홀더에는 한자가 포함됨). 0라운드에서 먼저 확인: HeyGen에서 자막을 끌지, 내보내기 해상도/프레임 속도, Fish 오디오 형식.
파일 맵 (필요에 따라 읽고, 한 번에 모두 읽지 마십시오)
| 파일 | 읽는 시기 |
|---|---|
| references/collaboration.md | 매 라운드 사용: 전달물 목록, 질문 방법, 사용자 피드백→매개변수 대조표, notes.md 작성 방법, 선호 사항 재기록 |
| references/digital-human.md | 0라운드: 디지털 휴먼 구도/배경/말하는 속도/내보내기 파일, 타임스탬프 획득, 각 도구 주의 사항 |
| references/thinking.md | 1라운드: 주제 5문, 오프닝/구조/심리적 리듬, 정보 밀도, 문장 역할→누가 화면에 나오는지, 20분을 1–3분으로 압축 |
| references/templates.md | 1라운드: 템플릿 A/B/C의 60/120/180초 분할 타임라인 및 단어 수 예산 |
| references/hooks-and-copy.md | 1라운드: 오프닝 기법 라이브러리 (빈칸 채우기 템플릿), 카피 규칙, 멘트 마크, 엔딩 CTA |
| references/visual-mapping.md | 2라운드: 콘텐츠 유형→화면→컴포넌트 매핑; 4박자/데모 시퀀스; 앵커 복귀; PIP 프리셋 및 전환; 금지 구역 |
| references/packaging.md | 2–5라운드: 자막, 색상 값, 글꼴, 키워드 카드, 헤드 워드, HUD, 챕터 카드, 라벨 상자, 와이드스크린 등 레이아웃 매개변수; 두 테마의 차이점 |
| references/motion-and-camera.md | 2–5라운드: 모든 동적 효과 디렉토리 (블로거 B N23–N30 포함) 및 가상 카메라 움직임 매개변수 테이블 |
| references/comfort-rules.md | 2, 5라운드: 11가지 편안함 규칙 (정량화) 및 검사 방법; lint 15개; 필수/권장/선택 |
| references/remotion-pipeline.md | 경로 B (3–5라운드): timeline.json 필드, 컴포넌트 props, P2 미구현 및 대체, 디지털 휴먼 연결, lint, 렌더링 명령, 일반적인 함정 |
| references/jianying-guide.md | 경로 A: Jianying 항목별 작업 (자막, 키프레임 줌, 원형 PIP, 텍스트 애니메이션 길이, 전환, 음향 효과, 배경 음악) |
| references/production-playbook.md | 처음부터 전체 비디오 제작 (HeyGen+Fish+영어): S1–S10 단계/게이트/비용/함정, 샘플 프로젝트 실제 실행 기록 |
| references/gemini-asset-prompts.md | 자료는 모두 사용자가 Gemini로 생성 (S2.5): shotlist→프롬프트 패키지, 스타일 바이블, 비디오/이미지 프롬프트 구조, 초, 명명, 입고 품질 검사, 재생성 템플릿; 스크립트 make_prompt_pack.py / ingest_gen_assets.py |
| references/motion-polish-and-sfx.md | 퇴장 편성, 새로운 전환, SFX 라이브러리 및 큐 규칙, BGM 기본 없음, mg 그래픽 슈트 및 그래픽 사용 시기 |
| references/english.md | 영어 버전: 단어/초 변환, 라틴 글꼴 및 크기, 한자 제로 목록 및 OCR 검사, lint 영어 임계값 및 수정할 코드, 영어 멘트/후크, HeyGen+Fish Audio |
| references/forbidden.md | 1라운드 및 전달 전: 복제할 수 없는 상징적 요소 및 대체 |
| templates/output-template.md | 최종 전달 요약 템플릿 (각 라운드 결과물을 조합하여 작성; 이 파일 상단 설명 참조) |
| templates/timeline.example.json | 컴포넌트 렌더링 샘플 (플레이스홀더 자료, 템플릿 A 90초, lint 15/15) — 컴포넌트 모양을 보고 JSON 구조를 복사하는 용도로만 사용, 예시 주제 아님 |
| templates/build_demo_timeline.py | 엔지니어링의 빌더를 사용하여 "비트 목록"에서 타임라인을 생성하는 작성법 참조 |
| templates/grid_bg_1920x1080.png | 그리드 배경 이미지 (#010101 + #1A1A1A, 72px), Jianying 경로 직접 사용 |
| scripts/README.md | 재사용 가능한 스크립트 목록 (SFX 합성/큐, 믹싱 검사, 연락처 시트, 전환 모드, 이미지 생성) 및 TS 컴포넌트를 새 프로젝트에 가져오는 방법 |
| scripts/stills_timeline.mjs | 모든 타임라인에 대해 한 번에 여러 장의 키프레임 PNG를 일괄 생성 (3라운드 사용, 검증됨) |
| examples/demo-script.md | 한 번의 협업 과정 예시: 0–4라운드 각 라운드에서 무엇을 전달하는지, 사용자가 어떻게 피드백할 수 있는지, 어떻게 수정하는지 |
| video-asset-prep/SKILL.md | 고급 동적 효과: 멘트 영상에 fx 동적 효과 블록 추가, 순수 동적 효과 홍보 영상 제작, 새로운 참조 동적 효과 영상 분석 (규칙 / 블록 디렉토리 / 분석 방법) |
Remotion 엔지니어링: <엔지니어링 디렉토리>/ (로컬, 클라우드 드라이브에 없음). src/tokens.ts 및 컴포넌트는 매개변수의 유일한 사실 소스입니다. references와 충돌하는 경우 엔지니어링 코드를 기준으로 합니다. src/는 읽기 전용이 아닙니다: 필요에 따라 수정 가능(새 블록 추가/확장, 공유 파일 수정 가능, 사용자가 2026-10-19에 명시적으로 승인함); 수정 후 ae-motion-craft의 회귀 검사를 실행하여 기존 프로세스가 손상되지 않았는지 확인하는 것이 좋습니다. 사용자가 요청하지 않는 한 git commit하지 마십시오.
각 비디오 프로젝트의 디렉토리 규칙
Remotion의 staticFile은 public/만 읽을 수 있으며, public/는 매 렌더링/이미지 생성 시 전체가 번들로 포함됩니다. 대용량 원본 자료는 public/에 넣지 마십시오. 따라서 각 프로젝트는 두 곳에 저장되며, slug는 영어 소문자와 하이픈을 사용합니다 (예: meeting-notes):
<엔지니어링 디렉토리>/projects/<slug>/ # 작업 영역 (번들되지 않음)
input/ 사용자가 제출한 원본 파일: 디지털 휴먼 원본 비디오, 녹화, 스크린샷, 데이터 (읽기 전용, 덮어쓰지 않음)
script.md 멘트 대본 + 문장 역할 테이블 (1라운드)
storyboard.md 스토리보드 + 자료 목록 (2라운드)
words.json 문장/단어 수준 타임스탬프 (0라운드 획득; 도구는 아래 참조)
notes.md 결정 및 선호 사항 로그 (형식은 references/collaboration.md 참조)
review/ 각 라운드에서 사용자에게 보여줄 이미지/비디오 (stills, compare, preview, 라운드 및 버전 번호 포함)
<엔지니어링 디렉토리>/public/projects/<slug>/ # 렌더링용 (번들됨, 처리된 완제품 자료만 넣음)
host_full.mp4 host_pip_480.mp4 host.wav # input/에서 트랜스코딩, 사양은 digital-human.md §8 참조
assets/… # 렌더링에 사용할 녹화/이미지/B-roll/로고
timeline.json # timelineSrc = "projects/<slug>/timeline.json"
- 타임라인의 모든 경로는
public/을 기준으로 합니다. 예:assets.hostVideo = "projects/<slug>/host_full.mp4",assets.files는projects/<slug>/assets/…를 가리킵니다 (나머지 필드는 remotion-pipeline.md §1 참조). - 렌더링 출력은
out/<slug>/에 저장됩니다 (엔지니어링에서 .gitignore로 out/ 제외됨).lint:timeline은 모든 경로를 허용합니다:npm run lint:timeline -- public/projects/<slug>/timeline.json. - 이 규칙은 엔지니어링 src/를 변경하지 않습니다.
projects/디렉토리는 필요 시 Claude가 생성합니다.
협업 워크플로우 (0–5라운드; 언제든지 이전 라운드로 돌아갈 수 있음)
각 라운드 형식: 사용자에게 무엇을 보여줄지 → 사용자에게 무엇을 확인 요청할지 → 사용자 피드백 후 수정 방법. 구체적인 질문 표현, 피드백 변환표는 references/collaboration.md를 참조하십시오. 사용자가 확인하면 notes.md에 기록하고 다음 라운드로 진행합니다. 사용자가 이전 라운드로 돌아와 수정하는 경우, 영향을 받는 부분만 다시 작업합니다 (대본 수정 → 스토리보드/타임스탬프/타임라인 재확인 필요; 스토리보드 수정 → 샘플 재생성 필요; 시각적 매개변수 수정 → 대본은 그대로).
0라운드 자료 수신 (사용자가 디지털 휴먼 비디오를 제공하거나, 먼저 대본을 작성한 후 생성)
두 가지 시작점:
- A. 사용자가 이미 디지털 휴먼 비디오를 가지고 있음 → 아래 검수 절차를 따름; 통과 후 오디오와 텍스트 획득.
- B. 사용자에게 아직 비디오가 없음 → 먼저 1라운드의 대본을 작성하고, 사용자가 확인하면 digital-human.md §6의 붙여넣기 버전을 사용하여 디지털 휴먼 도구로 생성합니다 (구도/배경 요구 사항을 먼저 사용자에게 알리고, 생성 후에는 후반 작업에서 수정할 수 없음). 그런 다음 비디오를 제출받고, 이 라운드로 돌아와 검수합니다.
디지털 휴먼 비디오 검수 (먼저 ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate,avg_frame_rate,duration,pix_fmt -of default=nw=1 in.mp4로 객관적 데이터를 추출한 다음, 3–5프레임을 추출하여 Read로 이미지 확인; 전체 표준은 digital-human.md §1–§4, §8 참조):
| 검사 항목 | 합격 기준 | 불합격 시 사용자에게 요청할 사항 |
|---|---|---|
| 해상도 | 1920×1080, 가로 16:9 | 1080p 가로 버전으로 다시 내보내기; 720p 미만 또는 세로는 재작업 필요, 늘리지 않음 |
| 프레임 속도 | 30fps 고정 (avg=r) | 저희가 트랜스코딩 가능 (-r 30); 가변 프레임 속도인 경우 트랜스코딩으로 인한 립싱크 어긋남 위험을 알림 |
| 길이 | 목표 60/90/120/180초와 일치, 한 번에 전체 생성 (여러 세그먼트로 나누지 않음) | 세그먼트로 생성하면 피부색/조명이 변할 수 있으므로, 한 번에 생성하거나 이음새를 수용할 의사가 있는지 확인 |
| 구도 | 상반신 정면, 양손이 보여야 함; 얼굴 높이 약 0.30H, 얼굴 중심 약 (0.48W, 0.38H); 머리 위 여백 약 0.07H; 얼굴 양쪽 x 0.03–0.305, 0.667–0.97, y 0.07–0.35는 깨끗해야 함; 손이 y 0.86–0.93 자막 영역을 가리지 않아야 함 | 도구에서 샷/줌/위치를 조정하여 다시 내보내도록 요청; 작은 편차는 PIP 프레이밍에서 보상 가능, 큰 편차는 재내보내기 필요 |
| 배경 | 어두운 단색 또는 깨끗한 장면 (밝기 Y 약 42–62), 원블로거의 방이 아님; 깜빡이지 않음 | 어두운 배경으로 변경하여 재내보내기 요청; 그린 스크린/투명 배경인 경우, 현재 렌더러에 배경 변경 구현이 없으므로 도구에서 어두운 배경을 포함하여 내보내야 함을 알림 |
| 입 모양 및 표정 | 말하는 프레임 3개 추출, 입 모양이 선명하고, 얼굴 흐림/프레임 드롭/손 변형 없음 | 구체적인 시간 지점을 지적하고, 사용자에게 캐릭터 변경/도구 설정 변경으로 해당 구간을 재생성하도록 요청 |
| 의상 및 조명 | 단색 짙은 색 상의, 가는 줄무늬 없음; 얼굴은 밝고 배경은 어두움 | 위와 동일, 재내보내기 요청 |
| 오디오 | 비디오에 내장된 오디오 트랙; BGM이 없는 wav 파일을 별도로 내보내는 것이 가장 좋음 | wav가 없으면 비디오에서 추출 (아래 참조); BGM이 포함된 경우 사용자에게 배경 음악 없는 버전을 내보내도록 요청 |
| 자막/텍스트 | SRT 또는 멘트 대본 원본을 함께 제공하는 것이 가장 좋음 | 없으면 아래의 전사 절차 진행 |
| 검수 결과는 ✓/✗ 표로 사용자에게 전달하고, 불합격 항목은 "재내보내기 시 설정 방법"을 항목별로 작성합니다. |
오디오 및 텍스트 획득 (어떤 것이 이미 있고, 어떤 것이 구축 대기 중인지)
- ✓ 이미 있음 (로컬 ffmpeg/ffprobe): 30fps로 트랜스코딩, 오디오 추출
ffmpeg -i in.mp4 -vn -ar 48000 -ac 1 host.wav, 480p PIP 프록시 생성 — 명령어는 모두 digital-human.md §8에 있습니다. - ✓ 이미 있음 · 사용자가 멘트 대본을 가지고 있음 (계획 B 또는 사용자 직접 제공): 문장 수준 텍스트는 대본을 직접 사용; 시간은 wav 길이 + 단어 수 비율로 추정, confidence=0.5, 텍스트 오프셋 +4프레임 (digital-human.md §9-3).
- ✗ 구축 대기 중 · 음성 전사 + 중국어 단어 수준 강제 정렬: 로컬에 whisper / WhisperX / stable-ts / FunASR이 설치되지 않음 (확인 완료), Python에도 없음; 엔지니어링의
@remotion/openai-whisper는 OpenAI Whisper API 결과를 구문 분석하는 도구 패키지일 뿐이며, 사용자의 API Key가 필요하지만 아직 연결되지 않음. 구축하여 샘플에서 중국어 정렬 오차를 검증하기 전까지는 단어 수준 타임스탬프가 있다고 주장할 수 없음. 선택 가능한 대체 방법: (1) 디지털 휴먼 도구에서 내보낸 SRT (문장 수준); (2) 사용자가 Jianying에서 "자막 인식" 후 내보낸 SRT; (3) 사용자 동의 후 Claude가 로컬 ASR을 구축 (사전 동의 필요, 의존성 설치 설명 필요); (4) 먼저 문장 수준 추정으로 샘플을 만들고, 최종 버전 전에 정렬을 보완. - 어떤 방법을 사용하든, 결과를
projects/<slug>/words.json에 저장하고 notes.md에 출처와 신뢰도를 명시합니다. 중국어에서 잘못 읽힌 글자는 대본과 비교해야 합니다 (digital-human.md §10). 사용자에게 전달: 검수 테이블 + 타임스탬프 출처 설명 + 재내보내기가 필요한 목록. 사용자에게 확인 요청: 비디오를 이대로 사용할지; 타임스탬프는 어떤 방법을 사용할지.
1라운드 대본 (주제 선정 → 멘트 대본 → 문장 역할 테이블)
수행: 주제 선정 5문 (thinking.md §2), 템플릿 유형, 한 문장의 주장 + ≤3개 증거 + 하나의 반전 (thinking.md §4–§7), 후크 (hooks-and-copy.md §1–§2), 단락별 타임라인 (templates.md; 단어 수 = 길이 × 약 4.8, 튜토리얼형 N = round((T−42)/25)), 문장별 멘트 작성 및 role/intent/marks 부여 (hooks-and-copy.md §3–§5; 각 문장 ≤20자, 숫자는 별도 문장, CTA는 마지막에 한 번만, 원블로거의 문장 사용 금지, forbidden.md). 사용자에게 비디오가 이미 있는 경우, 비디오의 실제 대사를 기준으로 하고 "역할 테이블 + 수정 제안"만 수행하며, 대본을 임의로 수정하지 않습니다.
사용자에게 전달: 2–3개의 제목/후크 옵션 + 멘트 대본 전문 (붙여넣기 가능 버전) + 문장 역할 테이블 (간결 열: 문장 번호|원문|role|누가 화면에 나오는지).
사용자에게 확인 요청: 후크 선택; 어떤 문장을 삭제/수정할지; 숫자/사실이 정확한지; 단어 수와 길이가 적절한지.
피드백 후: 대본 수정 → 단어 수/말하는 속도 재계산 → 이미 비디오가 있는 경우 타임라인 재정렬.
2라운드 스토리보드 (스토리보드 + 자료 목록)
수행: 판단 문장→앵커, 증명 문장→동적 효과, 연속 2–3문장을 하나의 메인 화면으로 결합, PIP 프리셋 선택 (visual-mapping.md, motion-and-camera.md, comfort-rules.md); 오프닝 20–30초가 가장 조밀하고, 이후 "15초 타이트 + 15–20초 루즈", 풀샷은 15–20초마다 복귀, 얼굴 없는 구간 ≤10초, punch ≤2/분, 녹화는 3–5초마다 한 번씩 줌 또는 라벨. 증거 자료가 부족하면 키워드 카드 + 앵커로 다운그레이드하고, 억지로 맞추지 않습니다.
사용자에게 전달: 스토리보드 (시간|멘트|화면|PIP|자막 및 강조 단어|동적 효과/카메라 움직임) + 자료 목록 (각 항목: id, 사용되는 샷, 필요한 내용, 녹화/내보내기 방법, 없을 경우 다운그레이드 계획, 예: "screen_render: 렌더링 명령 실행 녹화, ≥1080p, 5–10초, 커서 보임; 없으면 키워드 카드로 변경").
사용자에게 확인 요청: 스토리보드 리듬; 각 자료를 제공할 수 있는지; 부족한 자료는 보충할지 다운그레이드할지.
피드백 후: 스토리보드 수정, 자료 목록 업데이트; 자료가 도착하면 input/에 넣고, 해상도/내용/개인 정보 (계정, 키, 얼굴) 확인 후 public/projects/<slug>/assets/로 이동.
3라운드 키프레임 샘플 (원본 증거 프레임과 나란히 비교)
수행: timeline.json 작성 (remotion-pipeline.md; 컴포넌트 렌더링 샘플 templates/timeline.example.json을 참조할 수 있지만, 내용은 이 프로젝트로 변경), npm run lint:timeline, 그런 다음 6–10장의 키프레임 생성 — 후크 프레임, 헤드 워드, 키워드 카드/챕터 카드, 녹화 줌 인 중간 지점, 큰 숫자/비교 카드, PIP 화면, 자막 프레임, 엔딩 프레임 각각 대표를 선택:
cd <엔지니어링 디렉토리>
# 사용법: node <스크립트> <timelineSrc> <outDir> <프레임 번호,프레임 번호,…>; 한 번에 여러 장 생성, 약 10초 소요, 출력 f<프레임 번호 5자리>.png
node talking-video-oneshot/scripts/stills_timeline.mjs projects/<slug>/timeline.json out/<slug>/stills 45,300,620
# 단일 장도 가능: npx remotion still Main out/<slug>/x.png --props='{"timelineSrc":"projects/<slug>/timeline.json"}' --frame=300
# 나란히 (왼쪽 원본, 오른쪽 우리, 모두 960×540으로 축소)
scripts/compare.sh projects/<slug>/review/r3_cmp_01.png <원본 증거 프레임> out/<slug>/stills/f00045.png # 왼쪽 원본 오른쪽 우리
- 원본 증거 프레임은
<자료 디렉토리>의v03|v04|ex04–ex06/evidence/,ex01–ex03/ev/,v01|v08|v09|ex07|ex08/frames|bursts|scenes/에 있습니다. 해당analysis.md/motion_catalog.md/transcript.md에서 특정 샷의 원본 제작 방식을 확인할 수 있습니다. 엔지니어링compare/아래에는 각 컴포넌트의 기존 비교 이미지도 있습니다. 원본 비디오 디렉토리는 읽기 전용이며 수정하지 마십시오. - 유사한 증거 프레임을 찾을 수 없는 경우, "해당 원본 프레임 없음"이라고如实 표시하고, 대신 packaging.md의 매개변수를 사용하여 확인합니다.
- 각 나란히 비교 이미지 아래에 한 줄을 작성합니다: 이 샷이 무엇인지, 원본의 어떤 프레임과 비교하는지, 내가 본 차이점(글꼴/그림자/간격/위치/색상 값). 사용자에게 전달: 6–10장의 나란히 비교 이미지 (한 번에 최대 4장, 나누어 전송) + 내가 찾은 차이점 목록. 사용자에게 확인 요청: 각 이미지가 "비슷함 / 비슷하지 않음 / 어디가 비슷하지 않은지"; 어떤 부분을 우선적으로 수정할지. 피드백 후: collaboration.md의 대조표에 따라 타임라인을 수정하거나 (컴포넌트 수준 결함인 경우) "엔지니어링 문제"로 기록하여 사용자에게 알리고, 필요 시 직접 src/를 수정할 수 있습니다 (수정 후 회귀 검사 실행 권장); 수정 후에는 지목된 이미지만 다시 생성합니다.
4라운드 저화질 전체 프리뷰
수행: 전체 영상 저화질 렌더링, 리듬과 타이밍 확인용 (높은 CRF, 절반 해상도 가능; 첫 렌더링 전 예상 소요 시간을 사용자에게 알리고, 60초 기준 약 4분 정도):
cd <엔지니어링 디렉토리>
npx remotion render Main out/<slug>/preview_v1.mp4 --props='{"timelineSrc":"projects/<slug>/timeline.json"}' --crf=32 --scale=0.5 --codec=h264
(로컬 변경만 있는 경우 먼저 --frames=a-b를 사용하여 구간을 렌더링합니다.) 프리뷰에 플레이스홀더 자료/추정 타임스탬프를 사용한 경우, 반드시 사용자에게 알려야 합니다.
사용자에게 전달: preview_vN.mp4 + 제가 표시한 5–8개의 "중점 확인" 시간 지점 (mm:ss).
사용자에게 확인 요청: 시간 지점별 피드백 (형식: "0:23 텍스트 늦음" "1:05 녹화 줌 너무 강함"); 전체 리듬이 원본과 비슷한지.
피드백 후: 각 피드백을 매개변수 변경으로 변환 (대조표 사용), 변경 사항을 "어떤 샷의 어떤 매개변수를 변경했는지" 설명한 후 v2를 렌더링합니다 (영향을 받는 구간만 다시 렌더링하는 것이 좋음). 여러 번 반복 가능.
5라운드 정밀 수정 및 최종 버전 렌더링 + 자체 점검
수행: 프리뷰에서 남은 문제 처리; 타임스탬프를 실제 정렬로 업그레이드 (0라운드에서 추정을 사용한 경우); lint 15/15; 최종 버전 렌더링:
npx remotion render Main out/<slug>/final.mp4 --props='{"timelineSrc":"projects/<slug>/timeline.json"}' --crf=18 --codec=h264
그런 다음 5–8프레임을 다시 추출하여 확인 (빨간색 배경의 "P2 scene not implemented" 없음, 자막 점프 없음, 텍스트가 멘트보다 먼저 나오지 않음, 카메라 움직임 과하지 않음, hostAudio에 소리 있음). 아래 "전달 전 자체 점검 목록"에 따라 항목별로 ✓/✗/수치를 작성하고, 확실하지 않은 사항은 "사용자 확인 대기"에 포함시켜 templates/output-template.md로 정리하여 전달합니다. 사용자에게 전달: final.mp4 + 자체 점검표 + 원본과의 마지막 라운드 나란히 비교 프레임. 사용자가 만족하지 않으면 → 해당 라운드로 돌아가고, 억지로 전달하지 않습니다.
경로 A (Jianying 수동)
사용자가 Jianying에서 직접 편집하려는 경우, 3–5라운드는 다음으로 변경: 스토리보드에 따라 references/jianying-guide.md의 항목별 작업 지침 (자막 스타일, 키프레임 줌, 원형 PIP, 애니메이션 길이, 전환, 음향 효과, 배경 음악)을 작성하고, 사용자가 한 버전을 편집한 후 스크린샷/내보낸 클립을 전달하면, Claude가 원본 및 comfort-rules와 대조하여 수동으로 확인 후 수정 의견을 제시합니다.
두 가지 실행 경로 비교
| 항목 | 경로 A: Jianying 수동 | 경로 B: Remotion 자동 |
|---|---|---|
| 적합한 경우 | 코드를 작성하지 않음, 자료 적음, 빠른 작업 필요 | 일괄 처리 필요, 픽셀 수준 일관성 필요, 자동 검사 필요 |
| 입력 | 디지털 휴먼 비디오 + 스토리보드 + 편집 지침 | 디지털 휴먼 비디오 + host.wav + 타임스탬프 + timeline.json |
| 자막 | 자막 인식 → 하나의 스타일로 일괄 적용, y≈0.90H | subtitles[], box 46px, y 0.905H (stroke 56px, y 0.885H) |
| 줌 | 크기 키프레임 100→112%, 28프레임, 이징 인/아웃 | camera:[{kind:'push',dur:28,scale:[1,1.12],ease:'inOutCubic'}] |
| PIP | PIP + 원형 마스크, 직경 0.14W, 중심 (0.08,0.85) | pip:{preset:'bl_circle'}, 연속 샷 자동 병합 |
| 검사 | 수동 확인 (comfort-rules.md의 "수동 확인" 항목) | lint 15개 + 프레임 추출 |
| 제한 사항 | Jianying 메뉴/수치는 버전에 따라 확인 필요; 줌에 따른 라벨은 복합 클립 필요 | 차트/전체 화면/엔딩 카드/붓글씨/음향 효과 미구현 (대체 방안 있음) |
최종 전달 형식 (templates/output-template.md; 각 라운드 결과물을 조합)
- 기본 정보 1. 제목 및 커버 2. 멘트 대본 + 역할 테이블 3. 디지털 휴먼 설정 4. 스토리보드 5. 편집 지침 (5A Jianying / 5B Remotion) 6. 타임라인 요약 7. 자체 점검 + 확인 대기 항목. 협업 과정 예시는 examples/demo-script.md 참조.
전달 전 자체 점검 목록
- 3초 이내에 후크 등장 (의문문/반전/약속) 및 첫 번째 화면 변화; 오프닝에 인사, 자기소개, 로고 없음
- 말하는 속도 4.5–5.5자/초 (총 글자 수 ÷ 길이); 각 문장 ≤20자; 자막 줄 ≤14자 (8–10자가 가장 좋음)
- 영어 버전: 말하는 속도 2.2–2.6단어/초; 각 문장 ≤16단어; 자막 ≤7단어/38문자; 전체 영상 프레임 추출 후 한자 없음 (english.md §4: 타임라인 정적 grep +
tools/ocr로 추출 프레임 OCR, 결과 NO_CJK) - 각 문장에 role과 intent가 있음; 논점은 앵커, 증거는 동적 효과; 증거 부족 시 키워드 카드로 다운그레이드됨
- 컷 포인트가 문장 시작 부분에 위치 (±3프레임) ≥60%; 2–3문장마다 하나의 메인 화면; 컷/분 12–20 (데이터형 ≤24)
- 샷 길이: 앵커 3–6초; B-roll 1.5–3초; 카드 1.5–4초; 녹화 5–10초 (중간에 카메라 움직임/라벨 있음)
- 풀샷은 15–20초마다 복귀; 가장 긴 얼굴 없는 구간 ≤10초; punch-in ≤2/분; 디졸브 ≤2/분
- 텍스트는 키워드 시작 −2~+4프레임에 나타남, 머무름 ≥40프레임; 같은 화면의 텍스트 블록 ≤4
- 동적 효과 지속 시간은 0/6/12 (18)프레임 범위 내; 카메라 움직임 범위 ≤1.12, 콘텐츠 레이어에만 적용; 모든 정적 자료는 슬로우 줌
- 자막은 전체 영상에서 하나의 스타일, 위치 고정; 강조 색상 ≤3; 두 가지 배경만 사용
- 원블로거의 원문, 말버릇, 구호, 로고, 이미지, 특징적인 제목 및 엔딩 없음 (forbidden.md)
- 콘텐츠는 사용자 자신의 주제와 자료임; 예시 데이터는 "예시"로 표시됨; 자료 부족 항목이 나열됨
- 경로 B: lint 15/15 PASS; 프레임 추출 시 빨간색 배경 플레이스홀더 없음; hostAudio 설정됨 (그렇지 않으면 무음)
- 최종 버전: 라우드니스 -16 LUFS (음성+SFX, peak < -1 dBFS); 비디오/오디오 길이 일치 (±0.05초); 1.5초마다 프레임 추출 OCR로 한자 엄격히 차단;
assets.bgm설정 안 됨; 완성된 영상을 바탕 화면에 복사하고, 크기와 길이를 전달 설명에 포함
금지 구역 (자세한 내용은 references/forbidden.md 참조)
계정 엔딩 카드 및 마스코트, 원블로거의 구호/인사/말버릇/고정 제목 및 전환 문장, 원블로거의 이미지 및 스튜디오 (의상, 네온 룸, 조명 간판, 서재 소파), 그들의 3D 캐릭터, 국기 질감 각인, 불꽃 전환, 멘트 광고, 예능화된 밈 (VHS, 패러디 카드, 밈 이미지), 원본 비디오의 자료 및 데이터. 계승할 수 있는 것은 시각적 모티프 (검은 배경 그리드, 형광 녹색 태그, 둥근 약, 원형 PIP 등)뿐이며, 메인 색상은 자신의 것으로 변경 가능.
알려진 제한 사항 (사용자에게如实告知)
- 샘플: 13편 (블로거 A 9, 블로거 B 4), 모두 540P, 2배속 녹화; <0.13초의 등장은 하드 컷으로 기록; 이징/스프링은 대부분 추정; 원본 녹화는 무음, 배경 음악과 음향 효과는 모두 추측.
- Remotion 미구현 (P2): 차트 (파이/막대/꺾은선/버블/3D 타임라인/뒤집기), clip_full 전체 화면, ClosingCard, BrushWord 붓글씨, TitleCard, Badge 챕터 각인, sticker_words/name_tag/checklist 텍스트, 배경 변경, 테마 전환 (
meta.theme가 읽히지 않음, PIP 보라색 링이 테마에 따라 꺼지지 않음). 사용 시 빨간색 배경 플레이스홀더가 나타나거나 자동으로 무시됨 — 대체 방안은 remotion-pipeline.md §4 참조. - 음성 전사/단어 수준 정렬 도구 없음: 로컬에 whisper 계열 도구가 설치되지 않음, 0라운드의 단어 수준 타임스탬프는 현재 디지털 휴먼 도구의 SRT / 사용자 Jianying 인식 자막 / 단어 수 추정만 가능 (구축 대기 중, 0라운드 참조).
- 자동 플래너 없음: 타임라인은 현재 Claude가 수동으로 작성하거나 엔지니어링의 빌더 (단어 수 기준 시간 균등 분배)로 생성됨. 실제 디지털 휴먼 연결 후에는 실제 단어 수준 타임스탬프로 재배치 필요 (디지털 휴먼 도구 미정, 2단계 파이프라인 미검증). 중국어 강제 정렬 오차 미검증.
- 글꼴 차이: 좁은 글꼴 (ZCOOL QingKe HuangYou)은 다소 무겁고, 숫자 글꼴 (Barlow Condensed)은 다소 넓음. 붓글씨체는 라이선스 자체 확인 필요. 글꼴은 google-fonts를 통해 온라인 로드.
- Jianying 경로: 메뉴 이름, 크기, 버전 차이로 인해 수동 확인 및 조정 필요.
- SFX 라이브러리 제한 : 현재 사용 가능한 SFX는 기본 제공되는 일부에 불과하며, 사용자가 직접 추가하거나 대체 사운드를 제공해야 할 수 있음.
협업 예시 (examples/demo-script.md 참조)
이 예시는 제작 과정의 실제 상호 작용을 보여줍니다: 0라운드 자료 수신 및 검수부터 시작하여, 1라운드 대본 브레인스토밍, 2라운드 스토리보드 작성, 3라운드 샘플 생성, 4라운드 프리뷰, 5라운드 최종 렌더링까지 전체 라운드를 다룹니다. 사용자 피드백과 그에 따른 수정 방법을 보여주어 반복적인 특성을 강조합니다.
빠른 시작 가이드
- 프로젝트 초기화:
projects/<slug>/구조 생성,notes.md초기화. - 0라운드: 디지털 휴먼 비디오 검수, 오디오 추출, 타임스탬프 획득 방법 결정.
- 1라운드: 대본 작성, 후크 선택, 문장 역할 할당.
- 2라운드: 스토리보드 및 자료 목록 생성.
- 3라운드: 키프레임 샘플 렌더링 및 원본과 비교.
- 4라운드: 저화질 프리뷰 렌더링, 피드백 수집.
- 5라운드: 정밀 수정, 최종 렌더링, 자체 점검.
이 가이드는 프로세스의 각 단계를 요약하며, 언제든지 이전 라운드로 돌아갈 수 있다는 점을 기억하십시오.
문제 해결
- 타임라인 lint 오류:
npm run lint:timeline -- public/projects/<slug>/timeline.json실행, 오류 메시지에 따라 필드 값, 구조, 참조 확인. - 렌더링 실패: Remotion 오류 로그 확인, 일반적인 문제는 누락된 자산, 잘못된 경로, 호환되지 않는 props.
- 자막 동기화 문제: words.json 확인, 타임스탬프가 정확한지, 자막 텍스트가 타임라인 항목과 일치하는지 확인.
- PIP 문제: PIP 프리셋이 올바른지, 호스트 비디오 경로가 정확한지 확인.
- 시각적 결함: packaging.md 및 comfort-rules.md를 참조하여 색상, 글꼴, 간격, 위치 확인.
추가 정보
- 엔지니어링 구조:
<엔지니어링 디렉토리>/에는 Remotion 설정, 컴포넌트 (src/), 스크립트 (scripts/), 템플릿 (templates/), 참조 (references/)가 포함됨. - 의존성: Node.js, npm, ffmpeg, ffprobe 필요. 추가 의존성 (예: Whisper)은 사용자 동의 필요.
- 라이선스: 모든 자료 (특히 Pexels의 B-roll)의 라이선스를 준수하고,
LICENSES파일에 기록함. - 업데이트: 이 SKILL.md 및 관련 참조는 엔지니어링 및 사용자 피드백에 따라 업데이트될 수 있음.
면책 조항
- 이 스킬은 참조용으로 설계되었으며, 항상 완벽한 결과를 보장하지는 않습니다. 품질은 협업 프로세스와 사용자 피드백에 크게 의존합니다.
- 일부 기능 (음성 전사, 고급 차트)은 아직 구축 중이거나 제한적입니다.
- 사용자는 최종 결과물에 대한 책임이 있으며, 저작권, 라이선스, 개인 정보 보호를 포함한 모든 법적 측면을 준수해야 합니다.
이 SKILL.md는 초안이며, 엔지니어링 및 참조 문서의 발전에 따라 업데이트됩니다.