Talking-Head Short — 마스터 편집기
간결한 답변을 작성하세요. 대본이나 긴 로그를 반복하지 마세요. 문제가 있으면 spec.json을 Edit 도구로 편집하고, 다시 작성하지 마세요. 모든 스크립트는 간결한 보고서를 출력합니다. 읽고, 조치하고, 다음 단계로 넘어가세요.
S=<이 스킬 디렉토리>/scripts, WD=<원본 파일 옆 작업 디렉토리>/ths_<이름>.
0. 설정 (머신/샌드박스당 한 번)
bash $S/setup.sh → 출력된 PY=를 사용하세요. PyPI에서 모든 것을 설치하며, 만약 기존 ffmpeg가 없으면 정적 ffmpeg도 포함됩니다.
모든 다운로드에는 자동 대체(fallback)가 있습니다. 샌드박스(claude.ai 코드 실행, 무료 또는 유료)는 일반적으로 HuggingFace, Mixkit 및 Google Fonts API를 차단하지만 GitHub는 허용합니다:
- 전사 모델: HuggingFace → GitHub 미러 (whisper-base, 그 다음 whisper-tiny)
- 음악/SFX: Mixkit → GitHub 미러 CC0 팩 (id는
pack:lofi_chill형태) - 폰트: Google Fonts 저장소 → jsDelivr → GitHub 미러 OFL 팩 (32개 패밀리) → 시스템 폰트
- B-roll: Mixkit → 없음 (카드 사용 또는 사용자에게 클립 업로드 요청)
설정에서 "네트워크 없음"이 출력되거나 pip가 실패하면: 샌드박스의 네트워크 이그레스(egress)가 꺼져 있습니다. 사용자에게 정확히 (한 번의 메시지로) 알리세요:
"claude.ai → 설정 → 기능 → 코드 실행 → 네트워크 액세스: 모든 도메인 (또는 추가: pypi.org, files.pythonhosted.org, github.com, objects.githubusercontent.com, release-assets.githubusercontent.com, api.github.com, raw.githubusercontent.com, cdn.jsdelivr.net, huggingface.co, mixkit.co, assets.mixkit.co)으로 설정한 후 새 채팅을 시작하고 /talking-head-short를 다시 실행하세요." numpy/ffmpeg 없이 편집을 시도하지 마세요.
모든 소스가 실패하는 경우에만: 사용자에게 붙여넣은 대본 요청 →
$PY $S/align_text.py $WD transcript.txt. 자산은~/.ths_assets에 캐시됩니다.
1. 분석
$PY $S/analyze.py RAW $WD
해상도, 시점(eye point), 정리된 길이, 자동 제거된 필러/더듬거림/재시작, CHECK(부드러운 필러, 낮은 신뢰도 단어, 긴 일시정지), 그리고 8단어마다 타임스탬프가 있는 TEXT를 출력합니다.
- 직접 나쁜 테이크를 판단하세요. 잘못된 시작, 끝나지 않은 문장, "you know like yeah", "kind of" 등을 제거하세요. 수사적 반복은 유지하세요.
--remove '[[s,e],...]'(소스 초)로 다시 실행하세요. 전사는 캐시됩니다. $WD/frames.jpg는 시점이나 프레이밍이 의심스러운 경우에만 확인하세요.
2. 브리핑 (머릿속으로, 그런 다음 사용자에게 4줄)
다음을 작성하세요: 주제 · 핵심 메시지 · 감정 곡선(훅 → … → 페이오프) · 장르 행(NICHES에서) · 톤(차분함/균형잡힘/에너제틱) · 로우 프레이밍(와이드 또는 타이트).
그런 다음 $PY $S/style.py RAW "<niche>" --out $WD/style.json을 실행하세요. 이유와 함께 조정된 팔레트, 폰트, MG/B-roll/음악/SFX 방향 및 엄격한 노트를 제공합니다.
references/craft.md(규칙)와 references/spec.md(스펙 형식)를 한 번 읽으세요.
3. 빌드 전에 물어보기 (절대 먼저 렌더링하지 않음)
AskUserQuestion을 사용할 수 있으면 사용하고, 그렇지 않으면 하나의 간결한 번호 매기기 메시지를 사용하세요. 매번 옵션 1을 추천하세요.
- 스타일: 감지된 장르 + 톤 (예: "Self-help · 차분-사색적") 대 1~2개의 대안.
- 폰트: 해당 행의 쌍 대 명확한 스타일 대비가 있는 2개의 대안 (산스 리드 + 세리프/이탤릭 키, 또는 볼드 산스 키 + 이탤릭 세리프 악센트).
- 팔레트: 영상에 적응된 행 팔레트 대 영상에서 추출한 팔레트 대 사용자가 제공하는 브랜드 색상.
- 시각적 밀도: 최소(자막 + 2
3개 카드) · 균형(자막 + 46개 카드/B-roll) · 풍부(더 많은 MG + B-roll). - 음악:
$PY $S/assets.py music "<mood>"에서 3개의 라이선스 후보 (id · 제목 · 태그), 또는 없음. - B-roll: 예(문장과 일치하는 라이선스 스톡) / 아니오. 사용자가 이미 답변한 질문은 건너뛰세요. 답변을 기다리세요.
4. 자산 수집
- 폰트:
$PY $S/assets.py font "Family" ... - 음악, SFX, 비디오:
assets.py music|sfx|video "<query>"를 실행하여 목록을 확인하고,assets.py get <kind> <id> $WD를 실행하여 가져오세요.- 톤별 SFX: 차분함 → "air woosh", "chime"; 균형 → "whoosh", "pop"; 에너제틱 → "swoosh", "impact" (한 번 사용).
- 차단된 소스는 자동으로 대체됩니다(팩 id).
assets.py pack은 전체 오프라인 CC0 팩을 나열합니다.
5. spec.json, 계획, 스타일프레임 작성
$WD/spec.json(references/spec.md 참조)을 작성하세요: 말하는 순서의 자막, 오른쪽 절(clause)의 카드, 오디오.$PY $S/engine.py $WD --plan→ 모든 ISSUE를 spec을 편집하여 수정하세요(비트를 짧게 하거나 병합하고, 카드 아래 자막을 옮기거나 제거), 그런 다음 ISSUE가 없거나 허용 가능한 것만 남을 때까지 다시 계획하세요.$PY $S/engine.py $WD --frames t1,...을 10~15개의 시간으로 실행하세요: 모든 카드 중간점과 끝−0.3초, 그리고 모든 자막의 끝−0.1초.$WD/styleframes.jpg를 확인하고 잘리거나, 복잡하거나, 정렬이 잘못되었거나, 팔레트에서 벗어난 것이 있으면 수정하세요.- 사용자에게 스타일프레임을 한 줄("렌더링해도 될까요?")과 함께 보여주세요. 사용자가 지적한 것에 대해서만 반복하세요.
6. 렌더링, 믹싱, QA
bash $S/render.sh $PY $WD는 파트를 병렬로 렌더링하고 연결합니다 (노트북에서 비디오 1분당 약 5분). 명령어당 시간 제한이 있는 샌드박스에서는$PY $S/engine.py $WD --render --part i/N을 파트당 한 번 실행하고, 그다음--concat N을 실행하세요.$PY $S/mix.py $WD→final.mp4(음성 정리, 페이오프 정렬이 적용된 덕킹 음악, SFX, -14 LUFS).$PY $S/qa.py $WD→qa_endframes.jpg를 확인하세요. 모든 비트와 카드 끝은 완료된 텍스트와 애니메이션을 보여야 합니다. 플래시 프레임은 없어야 합니다.- 파일 경로와 선택한 내용 및 이유에 대한 3줄을 제공하세요. 다운로드할 수 없었던 자산이 있다면 언급하세요.
비협상 조건 (이유: 각각 아마추어처럼 보이는 요소로 지적됨)
- 자막이 절대 잘리지 않음. 리드(lead)가 키(key) 너비 이하이고 가까이 위치함. 두 가지 대비되는 폰트 스타일을 황금비율로 사용. 필러 단어만으로는 절대 자막을 만들지 않음.
- 모션 그래픽은 의미를 보여주고, 장면 전환 전에 완료되며, 하나의 시각적 시스템을 유지함. 막대 인간이나 클립 아트 없음.
- 부드러움: 이징(eased)되고 시선을 고정하는 줌 컷, 플래시 프레임 없음, 다양한 전환.
- 색보정만 수행. 라이선스 자산만 사용(Mixkit / Google Fonts OFL),
LICENSES.txt는$WD에 보관.