플러그인 설치: 설정 또는 최신 상태 확인 명령 전에, 이 스킬이 HyperFrames 플러그인 내부에 있을 경우 플러그인 실행 규칙을 따르세요. 독립 실행형 설치는 아래 업데이트 지침을 유지합니다.
첫째, 이 스킬을 최신 상태로 유지하세요 — 사용자에게 확인 후 실행:
npx hyperframes skills update embedded-captions. 모든 것이 최신 상태이면 빠른 no-op입니다. 그렇지 않으면 이 스킬과 이 스킬이 의존하는 핵심 도메인 스킬을 사용하기 전에 업데이트합니다.
임베디드 캡션
하나의 카탈로그, 미리 준비됨 (CATALOG.md — 35개 정체성; 그 뒤에 있는 엔진은 백엔드 세부 사항). Standard (기본값)는 깨끗한 그대로의 레일(대부분의 텍스트를 전달하는 하단 서드 자막) + 임베디드 클라이맥스를 장면 내부에 합성하여 최고점에 배치합니다. Cinematic은 순수 임베디드 — 레일 없음, 모든 캡션이 피사체 뒤에 합성됩니다(영웅 타이포그래피, 누적, 효과로서의 가림). Theme는 완전한 테마 구성을 나타냅니다 — 본문 패러다임 × 영웅 세트피스 × 전면 효과 × 플레이트 반응, 레지스트리에서 구성됨 (themes/README.md): ordnance terminal neonsign stardust stomp. 대부분의 설명/내레이션은 Standard입니다; 임베디드는 드물고, 얻기 힘든 최고점입니다 — 모든 단어를 임베딩하는 것은 흔한 실수입니다. Theme는 VFX 수준의 요청("炸", "特效", "像 AE 做的")을 위한 것입니다.
런타임 전제 조건
플러그인 설치는 매트 처리, 전사 및 렌더링을 위해 번들로 제공되고 매니페스트에 고정된 CLI를 사용합니다. 소스 체크아웃이 필요하지 않습니다. 로컬 미리보기 및 캡션 측정 도우미는 Sharp, Puppeteer (Chromium 브라우저 포함) 및 GSAP도 필요합니다. 읽기 전용 플러그인이 아닌 캡션 프로젝트에 설치하세요:
npm install --prefix <project> --save-dev --save-exact [email protected] [email protected] [email protected]
프로젝트의 lockfile을 유지하세요. 이러한 종속성이 이미 존재하는 경우 덮어쓰지 말고 잠긴 버전을 사용하세요. Bash와 FFmpeg/ffprobe가 PATH에 있어야 합니다. 매트 처리 및 전사는 첫 번째 사용 시 자체 모델을 다운로드할 수 있습니다.
렌더링은 합성 전에 CLI가 성공적으로 종료될 때까지 기다립니다. 이전 HF_TIMEOUT_S 셸 감시자는 더 이상 사용되지 않습니다: 큰 부분 파일은 렌더링이 완료되었음을 증명하지 않습니다. 명시적인 빌드 체크아웃 인수 또는 HYPERFRAMES_ROOT는 플러그인 핀 대신 기여자 CLI를 선택합니다. 중단된 렌더링은 일반적으로 CLI/터미널을 통해 취소합니다. 캡션 도우미는 프로세스 스냅샷에서 렌더링을 강제 종료하거나 복구하지 않습니다.
운영 흐름 (요약)
/hyperframes를 통해 라우팅되며, 의도 레이어는 입력(어느 클립)만 확인하고 정체성 선택을 지연된 요청으로 알립니다 — 후보 목록은 조사된 클립이 필요하므로 아래 1단계에 남습니다. 레이어의 실행 형태 질문은 적용되지 않습니다(푸티지는 변경되지 않았고, 검토할 스토리보드가 없습니다). BRIEF.md가 있는 경우 확인된 입력과 사용자 메모를 포함합니다 — 먼저 읽으세요.
아래의 제작 설명은 깁니다. 파이프라인 자체는 짧습니다 — 그리고 결정적인 모든 것은 계산되거나 컴파일되며, 수동으로 작성되지 않습니다:
- 결정 게이트 (나쁜 클립 거부) → CATALOG.md에서 하나의 정체성 선택 (35개 정체성; 엔진/컴파일러는 조회로 파생됨 — 모드/카테고리 질문 절대 표시하지 않음)
hyperframes init(프로젝트 디렉토리가 이미 비디오와 함께 존재하면 건너뜀 —matte.cjs/transcribe.cjs는 dir의 모든 비디오를 source.mp4로 채택) →bash scripts/prepare.sh <project>(병렬로 matte ∥ transcribe ∥ audio-envelope, 그다음 시네마 팔레트/광학/조명을 사용한 safe-zones v2 — 하나의 명령, 잊는 것 없음)- 작은 JSON의 창의적 선택 작성 (먼저
safe-zones.json읽기): Cinematic →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Theme →theme.json→make-theme.cjs(rail/panel/poem/takeover 패러다임;anchor는 조용한 레일 기본값) - 시각적 QA:
node scripts/preview-frames.cjs <project>→ 약 2초/프레임의 신뢰할 수 있는 합성 미리보기 (렌더링 없음). 렌더링 비용을 지불하기 전에 § 시각적 QA 확인. render-and-composite.sh→ 게이트 (타이밍 / 가림+영웅 / 오버플로우 / 핸드오프) →final.mp4
사람들이 놓치는 중요한 규칙:
- 레일(기본값) + 임베디드(승격).
drop(필러, 표시되지 않음) /rail(그대로의 하단 서드 자막, 앞에, 대부분의 텍스트 전달) /embed(피사체 뒤에 합성된 최고점 단어). Standard 모드는 둘 다 수행하며, 최고점만 임베딩합니다. § 캡션 모델 참조. - 비디오는 변경되지 않은 상태로 제공됩니다 (Standard/Cinematic; Theme 모드의 PLATE 예산이 유일한 허용 예외 — 테마 DNA에 정의된 레지스터 게이트 반응 비트(차지-딤, 펀치, 쉐이크, 그레인)가 매트 합성 후 적용되어 피사체+텍스트+플레이트가 하나의 프레임으로 움직입니다) — 캡션만 추가됩니다. 매트는 피사체가 임베디드 트랙을 가릴 수 있게 합니다. 푸티지를 절대 그레이딩/재색/스캔라인하지 마세요.
- 두 개의 규칙집: 레일 → references/rail.md (얇음), 임베디드 제작 → references/composition-craft.md (풍부함, 임베디드 전용). 필요에 따라 훑어보세요.
캡션 모델 — 레일 + 임베디드
모든 말하는 구절은 다음 세 가지 중 하나입니다:
| 무엇 | 어떻게 표시되는지 | |
|---|---|---|
| drop | 필러 — 음/어, 더듬음, 자기 수정 | 표시되지 않음 |
| rail | 기본값 — 일반적인 말하는 내용 (그대로) | 깨끗한 하단 서드 자막, 앞에, 읽기 쉽게. 한 단어에 인라인 emphasis 강조(액센트 색상 / 활성 단어 팝) 가능 — 레일에 유지됩니다. |
| embed | 승격된 최고점 — 헤드라인 비트 | 피사체 뒤에 합성된 큰 단어 하나 (매트 가림), 설계된 입장 + 퇴장 |
레일은 대부분의 텍스트를 전달합니다. 임베디드는 드물고, 얻기 힘든 최고점입니다. 희소성은 클립당이 아닌 비트/블록당입니다: 블록(생각)당 ≤1 영웅, 절대 두 개가 동시에 보이지 않음, 영웅 창 사이에 최소 비트의 여백 (컴파일러는 0.6초 미만에서 경고). 짧은 클립 → 보통 1–2개; 긴 설명 → 섹션당 약 하나. 여러 영웅 중 가장 큰 작성된 영웅이 APEX입니다 (전체 락업 임베디드 + 너비 맞춤 상승을 받는 유일한 영웅); 더 작은 영웅은 MINOR 최고점으로서 자신의 열을 과장된 강조 줄(전경, 감쇠된 움직임)로 탑니다 — 모든 비트가 매트 쇼케이스를 필요로 하지 않으며, 이것이 바로 apex를 이벤트로 유지하는 이유입니다. 모든 단어를 임베딩하는 것은 여전히 흔한 실수입니다.
레일 표면 정체성은 정확히 이것을 구성합니다 (레일 = rail.html, 임베디드 = index.html의 클라이맥스). 열 흐름 정체성은 레일을 버리고 모든 것을 임베디드 스타일로 만듭니다 — 단어를 읽어야 하는 설명/내레이션이 아닌 분위기-중시 요청에만 추천합니다 (CATALOG.md는 정체성별로 이를 인코딩합니다).
0단계 — CATALOG에서 하나의 정체성 선택
하나의 프론트엔드, 그 뒤에 세 엔진. 사용자는 CATALOG.md에서 IDENTITY를 선택합니다 (35개 항목: 10 클래식 + 25 테마); 엔진, 컴파일러 및 작성 파일은 카탈로그 행에서 조회로 파생됩니다. "Standard vs Cinematic vs Theme"를 질문으로 절대 표시하지 마세요 — 이는 백엔드 이름입니다 (제품은 여러 엔진이 있어도 하나의 UX를 가집니다). 카탈로그는 라우팅에 필요한 모든 것을 인코딩합니다: 읽기 표면, 음성, 추천 대상, 장면 요구 사항, 진정으로 가까운 쌍(loud↔ordnance, neon↔neonsign, cream↔stardust)에 대한 인접 메모.
정체성 선택은 선호 게이트입니다 (../hyperframes/references/brief-contract.md § 1): 자율 모드("놀라게 해줘" / "나를 위해 결정해 줘")에서는 직접 후보 목록에서 선택하고 그 이유를 한 줄로 말하세요. 질문하지 마세요.
절차: 클립 조사 → 카탈로그에서 2–3개 정체성 후보 목록 작성 → 하나를 추천하고 한 줄 이유 제시 → 사용자가 선택 (자율 모드: 당신이 선택하고 이유를 말함) → 해당 정체성의 파일을 작성합니다. 정체성은 엔진에 고정됩니다 (크로스 콤보 없음; 하나를 여는 것은 검증 이벤트입니다 — dna/README.md 참조).
항상 추천을 제시하고 작성하기 전에 사용자가 선택하게 하세요. 조용히 기본값으로 설정하지 마세요.
(전체 정체성 테이블은 CATALOG.md에 있습니다 — 라우팅의 단일 진실 공급원. 아래 엔진 문서는 각 백엔드의 작성 계약을 설명합니다.)
CATALOG.md가 여기서 전체 답변 공간입니다: 이 워크플로우는 HyperFrames 컴포넌트 레지스트리를 검색하지 않습니다. 구성 워크플로우는 명명된 룩을 작성하기 전에 npx hyperframes catalog를 실행합니다. 이것은 실행해서는 안 됩니다. 해당 엔진은 cinematic.json / theme.json을 소비하고 스스로 구성을 내보내는 잠긴 컴파일러이므로, 레지스트리 항목 — 포함된 caption-* 블록 — 마운트할 대상이 없습니다. 레지스트리 블록은 설계된 캔버스에 텍스트 스타일을 지정합니다. 이 스킬은 매트를 통해 누군가의 푸티지에 캡션을 새깁니다. 어떤 정체성도 요청에 맞지 않을 때는 그렇게 말하고 카탈로그 밖으로 나가지 말고 가장 가까운 것을 선택하세요.
추천 휴리스틱: CATALOG.md의 "단축 목록 작성 휴리스틱"을 사용하세요 — 이는 정체성 수준입니다 (예: "炸"는 ordnance/stomp/terminal/loud를 단축 목록으로 작성하고 무엇이 폭발해야 하는지에 따라 선택), 절대 카테고리 수준이 아닙니다. 확실하지 않음 → anchor.
- Cinematic → 잠긴 템플릿에
plan.json을 작성하고,make-composition.cjs에 의해 컴파일됩니다. - Theme → themes/README.md를 읽고,
theme.json을 작성하고,scripts/render-theme.sh를 실행합니다 (컴파일 + 렌더 + 플레이트 반응 → final_fx.mp4).
결정 게이트 — 먼저 실행
비디오를 조사하고 두 모드 전에 장면을 분류하세요.
ffprobe <video.mp4> # 사양
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # 20/50/80% 지점에서
샘플을 읽으세요. 다음 경우 거부:
- 여러 화자 / 하드 컷 (각 샷을 분할 및 렌더링하거나 거부)
- 인간 피사체 없음 (이 스킬은 말하는 머리용)
- 3초 미만, 음성 없음, 또는 얼굴이 명확하게 보이지 않음 —
transcribe.cjs는 오디오가 거의 무음일 때 경고합니다 (Whisper는 침묵 위에 "Thank you." 같은 단어를 환각할 수 있음); 이를 주의하고 거부하여 조작된 단어에 캡션을 달지 마세요. - 소스에 이미 하드코딩된 캡션/자막/무거운 텍스트 그래픽이 있는 경우 — 두 번째 캡션 시스템을 추가하면 충돌이 발생하고 푸티지는 변경되지 않은 상태로 제공됩니다 (덮기/인페인팅 없음). 번인 텍스트는 종종 클립 중간에만 나타납니다: 1fps 연락처 시트를 샘플링하세요 (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), 3개의 스팟 프레임을 신뢰하지 마세요. - 전사 결과가 쓰레기인 경우 — 비원어민/강한 악센트 음성은 자신감 있는 횡설수설로 전사될 수 있습니다. 작성 전에
transcript.json을 온전하게 읽으세요. 언어로 구문 분석되지 않으면WHISPER_MODEL=medium을 한 번 시도하고, 그렇지 않으면 거부하세요 (조작된 단어의 그대로의 레일은 캡션이 없는 것보다 나쁩니다). - 바쁜 핸드헬드 및 빠른 움직임 (매트 깜빡임)
사전 점검 (비용 없음, 최악의 실패 방지)
- 샷 컷 점검. 20%, 50%, 80%에서 프레임 샘플링. 다른 피사체/장면이 나타나면 컷 전에 클립을 자르세요.
- 레터박스/필러박스 점검. 첫 번째 프레임에 검은 막대가 있습니까? 안전한 콘텐츠 사각형을 계산하고 그 안에 캡션 배치를 제한하세요.
- 휘도 점검. 캡션 영역의 평균 휘도를 샘플링하세요 —
60 미만→ 밝은 텍스트가 그대로 읽힘,60-180→ 글리프 스크림 추가,180+→ 불투명 텍스트 + 스크림 (절대 맨 밝은 텍스트 사용 금지). Cinematic 템플릿은 크림+screen이며 LOCKED입니다 — 이 점검을 사용하여 _맞는 정체성을 선택_하세요 (밝은 장면 →ink, 또는 불투명 레일anchor테마), 절대 하나를 재색하지 마세요. - 톤에 따른 정체성 추천 (당신이 추천하고 사용자가 선택 — 0단계 + CATALOG.md 참조). 설명/인터뷰/단어를 읽어야 함 → 레일/표면 정체성; 시적/소셜/"시네마틱" → 열 흐름 정체성; "炸 / 特效 / VFX" / 명명된 세계 → 테마 정체성. 확실하지 않을 때 →
anchor(단어 읽힘, 장면 안전) — 하지만 후보 목록을 제시하고 사용자가 선택하게 하세요.
파이프라인 — 5단계
1. hyperframes init <project> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <project> # matte ∥ transcribe (병렬) → safe-zones. 하나의 명령.
# → frames_fg/ transcript.json safe-zones.json
3. [에이전트 단계 — 유일한 창의적 단계] 작은 JSON을 작성하세요; 모드별 아래 참조
Cinematic: plan.json 작성 → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Theme: theme.json 작성 → bash scripts/render-theme.sh <project> (컴파일 + 렌더 + 플레이트 효과)
4. node scripts/preview-frames.cjs <project> # 약 2초/프레임 합성 미리보기 → § 시각적 QA (렌더 전에)
5. bash scripts/render-and-composite.sh <project> # 게이트 → final.mp4 + history/ 스냅샷
(Theme 모드: 3b/5단계 건너뜀 — render-theme.sh는 이미 컴파일 + 렌더-앤-컴포지트
+ _postfx.sh 실행; 결과물은 final_fx.mp4, final.mp4는 플레이트 반응 전)
1단계의 init는 설치된 스킬을 GitHub의 최신 스킬과 확인하고 오래된 것이 있으면 전역 세트를 업데이트합니다.
3단계는 모드에 따라 다릅니다:
3단계 — Cinematic 모드 (순수 임베디드)
- 먼저
safe-zones.json을 읽으세요. 내레이션 평면은 **zones.hugLeft/hugRight**에 배치됩니다 — 실루엣에 맞닿은 깨끗한 스트립 (몸에서 멀리 떨어진 텍스트는 임베디드가 아닌 떠 있는 것으로 읽힘; 먼 모서리는 기본값이 아닌 대체 수단). 영웅은 기본적으로heroAnchor/heroBands.best(피사체에 중앙, ~30–55% 가림).recommendation:"fg"는 가독성을 위해 내레이션을 앞으로 이동시킵니다;heroBands.feasible일 때마다 영웅은 임베디드 상태 유지 — hero-fg는 최후의 수단입니다. - DNA는 당신이 선택한 정체성입니다
[나머지 생략 - 번역 제한으로 인해]