Video Use (비디오 사용)
원칙
- LLM은 원시 트랜스크립트와 요청 시 제공되는 비주얼을 기반으로 추론합니다. 유일하게 가치 있는 파생 아티팩트는 구(phrase) 수준의 압축된 트랜스크립트(
takes_packed.md)입니다. 그 외 모든 것(필러 태깅, 재테이크 감지, 샷 분류, 강조 점수)은 결정 시점에 직접 도출합니다. - 오디오가 우선이며, 비주얼은 그 뒤를 따릅니다. 컷 후보는 음성 경계와 무음 간격에서 나옵니다. 비주얼은 결정 시점에만 집중적으로 분석합니다.
- 질문 → 확인 → 실행 → 반복 → 저장. 사용자가 평이한 영어로 전략을 확인하기 전까지는 절대 컷을 건드리지 마십시오.
- 일반화하세요. 이 비디오가 어떤 종류인지 가정하지 마십시오. 자료를 살펴보고, 사용자에게 질문한 후 편집하세요.
- 예술적 자유가 기본값입니다. 이 문서에 있는 모든 특정 값, 프리셋, 글꼴, 색상, 지속 시간, 피치 구조, 기법은 하나의 검증된 비디오에서 가져온 실제 작업 예시입니다. 이는 명령이 아닙니다. 무엇이 가능하고 왜 각각이 효과적이었는지 이해하기 위해 읽어보십시오. 그런 다음 실제 자료가 무엇이고 사용자가 실제로 원하는 것이 무엇인지에 따라 자신의 취향을 반영하여 결정을 내리십시오. 반드시 해야 하는 일은 아래 '엄격한 규칙' 섹션에만 있습니다. 그 외 모든 것은 여러분의 자유입니다.
- 자유롭게 창안하십시오. 여기에 설명되지 않은 기법(분할 화면, PIP(Picture-in-Picture), 하단 서드 아이덴티티 카드, 리액션 컷, 스피드 램프, 프리즈 프레임, 크로스페이드, 매치 컷, L-컷, J-컷, 호흡에 맞춘 스피드 램프 등)이 자료에 필요하다면 이를 구축하십시오. 도우미는 ffmpeg와 PIL입니다. 이들은 포맷이 지원하는 모든 것을 할 수 있습니다. 허락을 기다리지 마십시오.
- 사용자에게 보여주기 전에 자신의 출력물을 직접 검증하십시오. 당신이 출시할 생각이 없는 출력물이라면, 제시하지 마십시오.
엄격한 규칙 (제작 정확성 — 타협 불가)
이것들은 위반 시 자동으로 실패하거나 깨진 출력물을 생성하는 항목들입니다. 취향의 문제가 아니라 정확성의 문제입니다. 반드시 숙지하십시오.
- 자막은 필터 체인에서 오버레이 다음, 즉 마지막에 적용됩니다. 그렇지 않으면 오버레이가 자막을 가립니다. 자동 실패.
- 세그먼트별 추출 후 무손실
-c copy연쇄(concat) 방식 사용. 단일 패스 필터그래프를 사용하지 마십시오. 그렇지 않으면 오버레이가 추가될 때 모든 세그먼트가 두 번 인코딩됩니다. - 모든 세그먼트 경계에 30ms 오디오 페이드 적용 (
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). 그렇지 않으면 모든 컷에서 들을 수 있는 '팝' 노이즈가 발생합니다. - 오버레이는
setpts=PTS-STARTPTS+T/TB를 사용하여 오버레이의 프레임 0을 해당 윈도우의 시작점으로 이동합니다. 그렇지 않으면 오버레이 윈도우 동안 애니메이션의 중간 부분이 보입니다. - 마스터 SRT는 출력 타임라인 오프셋을 사용합니다:
output_time = word.start - segment_start + segment_offset. 그렇지 않으면 세그먼트 연결 후 자막이 정렬되지 않습니다. - 단어 중간에서 절대 컷하지 마십시오. 모든 컷 가장자리를 Scribe 트랜스크립트의 단어 경계에 맞춰 정렬하십시오.
- 모든 컷 가장자리에 패딩을 추가하십시오. 작업 윈도우: 30–200ms. Scribe 타임스탬프는 50–100ms 정도 오차가 있습니다. 패딩이 이 오차를 흡수합니다. 빠른 템포의 영상은 더 좁게, 시네마틱한 영상은 더 넓게 적용하십시오.
- 단어 수준의 축어적(verbatim) ASR만 사용하십시오. 절대 SRT/구(phrase) 모드를 사용하지 마십시오 (초 단위 이하의 갭 데이터 손실). 절대 정규화된 필러를 사용하지 마십시오 (편집적 신호 손실).
- 소스별로 트랜스크립트를 캐싱하십시오. 소스 파일 자체가 변경되지 않았다면 절대 다시 트랜스크립션을 실행하지 마십시오.
- 여러 개의 애니메이션은 병렬 하위 에이전트를 사용하십시오. 절대 순차적으로 실행하지 마십시오.
Agent도구를 통해 N개를 동시에 실행하십시오. 총 소요 시간은 가장 느린 애니메이션 하나의 시간과 동일합니다. - 실행 전 전략 확인. 사용자가 평이한 영어로 된 계획을 승인하기 전에는 절대 컷을 건드리지 마십시오.
- 모든 세션 출력물은
<videos_dir>/edit/디렉토리에 저장합니다. 절대video-use/프로젝트 디렉토리 내부에 쓰지 마십시오.
이 문서의 다른 모든 내용은 실제 작업 예시입니다. 자료가 요구할 때마다 자유롭게 변경하십시오.
디렉토리 구조
스킬은 video-use/ 디렉토리에 있습니다. 사용자 영상 파일은 사용자가 지정한 위치에 있습니다. 모든 세션 출력물은 <videos_dir>/edit/ 디렉토리로 이동합니다.
<videos_dir>/
├── <원본 파일들, 수정되지 않음>
└── edit/
├── project.md ← 메모리; 세션마다 내용이 추가됨
├── takes_packed.md ← 구(phrase) 수준 트랜스크립트, LLM의 주요 읽기 뷰
├── edl.json ← 컷 결정 사항
├── transcripts/<name>.json ← 캐시된 원시 Scribe JSON
├── animations/slot_<id>/ ← 애니메이션별 소스 + 렌더링 + 추론
├── clips_graded/ ← 그레이딩 및 페이드가 적용된 세그먼트별 추출 파일
├── master.srt ← 출력 타임라인 자막
├── downloads/ ← yt-dlp 출력물
├── verify/ ← 디버그 프레임 / 타임라인 PNG
├── preview.mp4
└── final.mp4
설정
최초 설치는 install.md에 설명되어 있습니다 (클론, 의존성, ffmpeg, 스킬 등록, API 키). 매 세션마다 실행할 필요는 없습니다. 콜드 스타트 시 다음 사항만 확인하십시오:
ELEVENLABS_API_KEY변수가 설정되어 있는지 확인 — 환경 변수 또는 video-use 리포지토리 루트의.env파일에 있어야 합니다. 없으면 사용자에게 키를 입력하도록 요청하고.env파일에 기록하십시오 (절대 사용자의<videos_dir>에는 기록하지 마십시오).ffmpeg+ffprobe가 PATH에 있는지 확인.- Python 의존성 설치 확인 (
uv sync또는 리포지토리 내에서pip install -e .실행). - HyperFrames 또는 Remotion 슬롯이 필요한 경우 Node.js + npm 사용 가능 여부 확인. HyperFrames는 현재 Node.js 22+가 필요합니다.
yt-dlp, HyperFrames, Remotion, Manim은 최초 사용 시에만 설치합니다.- 최초 애니메이션 설정은 슬롯 디렉토리 내부에서 수행하며, 절대 video-use 리포지토리 루트에서 수행하지 않습니다. HyperFrames는
npx --yes hyperframes ...로 호출할 수 있습니다. Remotion은npx create-video@latest로 스캐폴딩하거나 프로젝트 로컬 의존성으로 설치한 후remotion render명령어를 사용할 수 있습니다. - 이 스킬은
skills/manim-video/를 함께 제공합니다. Manim 슬롯을 구축할 때는 해당 SKILL.md를 읽으십시오.
도우미 (helpers/transcribe.py, helpers/render.py 등)는 이 SKILL.md 파일과 같은 디렉토리에 있습니다. 해당 경로는 이 파일이 있는 디렉토리를 기준으로 확인하십시오. 스킬은 일반적으로 ~/.claude/skills/video-use/ 또는 ~/.codex/skills/video-use/에 심볼릭 링크됩니다.
도우미
transcribe.py <video>— 단일 파일에 대한 Scribe 호출.--num-speakers N옵션 선택 가능. 결과 캐싱.transcribe_batch.py <videos_dir>— 4개 워커 병렬 트랜스크립션. 여러 테이크 작업 시 사용.pack_transcripts.py --edit-dir <dir>—transcripts/*.json파일을 읽어takes_packed.md파일 생성 (구 수준, 0.5초 이상 무음에서 분할).timeline_view.py <video> <start> <end>— 필름스트립 + 웨이브폼 PNG 생성. 요청 시 비주얼 분석 도구. 스캔 도구가 아닙니다 — 결정 시점에만 사용하고, 지속적으로 사용하지 마십시오.render.py <edl.json> -o <out>— 세그먼트별 추출 → 연쇄(concat) → 오버레이 (PTS 시프트) → 자막 (마지막).--preview옵션으로 720p 빠른 미리보기 가능.--build-subtitles옵션으로 master.srt를 인라인 생성 가능.grade.py <in> -o <out>— ffmpeg 필터 체인 그레이딩. 프리셋 +--filter '<raw>'옵션으로 사용자 정의 필터 지원.
애니메이션의 경우, <edit>/animations/slot_<id>/ 디렉토리를 생성하고 Bash를 사용하여 Agent 도구를 통해 하위 에이전트를 실행하십시오.
프로세스
-
인벤토리. 모든 소스 파일에 대해
ffprobe실행. 디렉토리 전체에 대해transcribe_batch.py실행.pack_transcripts.py를 실행하여takes_packed.md생성. 시각적인 첫인상을 위해 하나 또는 두 개의timeline_view를 샘플링. -
문제 사전 스캔.
takes_packed.md를 한 번 훑어보며 말실수, 명백한 발음 오류, 피해야 할 표현 등을 기록. 일반 목록으로 작성하여 편집자 브리핑에 포함. -
대화. 당신이 본 것을 평이한 영어로 설명하십시오. 자료에 기반하여 질문을 던지십시오. 다음 정보를 수집하십시오: 콘텐츠 유형, 대상 길이/화면비, 미적/브랜드 방향, 페이싱 느낌, 반드시 유지해야 할 순간, 반드시 잘라내야 할 순간, 애니메이션 및 그레이딩 선호도, 자막 필요 여부. 고정된 체크리스트를 사용하지 마십시오 — 적절한 질문은 매번 다릅니다.
-
전략 제안. 4–8개 문장으로 구성: 형태, 테이크 선택, 컷 방향, 애니메이션 계획, 그레이딩 방향, 자막 스타일, 예상 길이. 확인을 기다리십시오.
-
실행. 편집자 하위 에이전트 브리핑을 통해
edl.json생성. 모호한 지점에서는timeline_view로 집중 분석. 애니메이션은 병렬 하위 에이전트로 구축. 세그먼트별로 그레이딩 적용.render.py를 통해 합성. -
미리보기.
render.py --preview실행. -
자체 평가 (사용자에게 보여주기 전). 렌더링된 출력물 (소스가 아님)에 대해 모든 컷 경계에서
timeline_view실행 (경계 전후 ±1.5초 윈도우). 각 이미지에서 다음 사항 확인:- 컷 지점에서의 시각적 불연속성 / 섬광 / 점프
- 경계 지점의 웨이브폼 스파이크 (30ms 페이드를 넘긴 오디오 팝)
- 오버레이 뒤에 숨겨진 자막 (규칙 1 위반)
- 오버레이 정렬 불량 또는 잘못된 프레임 표시 (규칙 4 위반)
또한 다음 지점도 샘플링: 처음 2초, 마지막 2초, 중간 2–3개 지점 — 그레이딩 일관성, 자막 가독성, 전반적인 일관성 확인.
ffprobe를 실행하여 출력 길이가 EDL 예상과 일치하는지 확인.오디오를 추측하지 말고 직접 측정하십시오:
ffmpeg -i out.mp4 -af ebur128=peak=true -f null -명령어로 통합 런던스(integrated loudness)와 실제 피크(true peak)를 확인하고, 섹션별(대화, 음악만, 엔드 카드) RMS도 확인하십시오. 엔드 카드가 대화보다 15dB 낮거나, 효과음이 음성보다 큰 경우는 버그입니다. 당신은 소리를 들을 수 없습니다: 그 점을 명시하고 숫자로 보고하십시오.사용자가 출시할 콘텐츠 (런칭, 프로모션, 광고)의 경우, 렌더링된 파일, EDL, 사용자가 제공한 참고 비디오를 함께 전달하여 비평 하위 에이전트 하나를 추가로 실행하십시오. 칭찬이 아닌 혹평을 하도록 브리핑하십시오: 평결, 시간 코드와 증거(프레임, 레벨)를 포함한 문제점 순위 목록, 그리고 가장 먼저 해야 할 5가지 수정 사항. 새로운 시각은 작성자가 더 이상 보지 못하는 것을 발견합니다 — 끊긴 페이오프 라인, 0.5초 밈, 폰 크기에서 읽을 수 없는 28px 텍스트 등.
문제가 발견되면: 수정 → 재렌더링 → 재평가. 자체 평가는 최대 3회까지 — 3회 후에도 문제가 남아 있으면 무한 반복하지 말고 사용자에게 알리십시오. 자체 평가를 통과한 경우에만 미리보기를 제공하십시오.
-
반복 + 저장. 자연어 피드백을 받고, 계획을 수정하고, 재렌더링합니다. 절대 다시 트랜스크립션하지 마십시오. 확인 후 최종 렌더링 실행.
project.md에 내용을 추가하십시오.
컷 제작 기법
- 오디오 우선. 컷 후보는 단어 경계와 무음 간격에서 도출.
- 피크 유지. 웃음, 결정적 대사, 강조 비트. 결정적 대사 이후 리액션을 포함하도록 확장 — 웃음 자체가 비트입니다.
- 화자 전환 시 발화 사이에 약간의 공백을 두는 것이 좋습니다. 일반적인 값: 400–600ms. 빠른 템포의 경우 더 짧게, 시네마틱한 경우 더 길게. 취향에 따라 결정.
- 오디오 이벤트를 신호로 활용.
(웃음),(한숨),(박수)는 비트를 표시합니다. 이 이벤트 이후로 확장하십시오. - 무음 간격은 컷 후보입니다. 400ms 이상의 무음은 일반적으로 가장 깔끔합니다. 150–400ms의 구 경계는 시각적 확인과 함께 사용 가능합니다. 150ms 미만은 안전하지 않습니다 (구 중간).
- 컷 패딩 예시 (함께 제공된 런칭 비디오에서 사용): 첫 번째 유지 단어 앞 50ms, 마지막 단어 뒤 80ms. 몽타주 에너지의 경우 더 좁게, 다큐멘터리의 경우 더 넓게. 30–200ms 작업 윈도우 내에서 유지하십시오 (엄격한 규칙 7).
- 오디오와 비디오를 독립적으로 추론하지 마십시오. 모든 컷은 두 트랙 모두에서 작동해야 합니다.
패킹된 트랜스크립트 (주요 읽기 뷰)
pack_transcripts.py는 모든 transcripts/*.json 파일을 읽어 하나의 마크다운 파일을 생성합니다. 각 테이크는 구(phrase) 수준의 라인 목록으로 표시되며, 각 라인은 [시작-종료] 시간 범위로 접두사가 붙습니다. 구는 0.5초 이상의 무음 또는 화자 변경 시 분할됩니다. 이것이 편집자 하위 에이전트가 컷을 선택하기 위해 읽는 아티팩트입니다. 원시 JSON보다 1/10의 토큰만으로 텍스트로부터 단어 경계 정밀도를 제공합니다.
예시 라인:
## C0103 (지속 시간: 43.0s, 8개 구)
[002.52-005.36] S0 웹 에이전트가 하는 일의 90%는 완전히 낭비입니다.
[006.08-006.74] S0 우리는 이것을 고쳤습니다.
편집자 하위 에이전트 브리핑 (멀티 테이크 선택용)
작업이 "여러 클립에서 각 비트의 최고 테이크를 선택하는 것"인 경우, 다음과 같은 형태의 전용 하위 에이전트를 생성하십시오. 구조는 중요하며, 피치 형태 예시는 중요하지 않습니다.
당신은 <유형> 비디오를 편집하고 있습니다. 각 비트의 최고 테이크를 선택하고, 소스 클립 순서가 아니라 비트 순서대로 연대기적으로 조합하십시오.
입력:
- takes_packed.md (모든 테이크의 시간이 주석 처리된 구 수준 트랜스크립트)
- 제품/내러티브 컨텍스트: <사용자로부터 받은 2문장>
- 화자: <이름, 역할, 전달 스타일 참고 사항>
- 예상 구조: <원형 선택 또는 직접 창안>
- 피해야 할 말실수: <사전 스캔 패스에서 추출한 목록>
- 대상 런타임: <초>
일반적인 구조 원형 (선택, 수정, 또는 창안):
- 기술 런칭/데모: HOOK → PROBLEM → SOLUTION → BENEFIT → EXAMPLE → CTA
- 튜토리얼: INTRO → SETUP → STEPS → GOTCHAS → RECAP
- 인터뷰: (QUESTION → ANSWER → FOLLOWUP) 반복
- 여행/이벤트: ARRIVAL → HIGHLIGHTS → QUIET MOMENTS → DEPARTURE
- 다큐멘터리: THESIS → EVIDENCE → COUNTERPOINT → CONCLUSION
- 음악/공연: INTRO → VERSE → CHORUS → BRIDGE → OUTRO
- 또는 직접 창안하십시오.
규칙:
- 시작/종료 시간은 트랜스크립트의 단어 경계에 맞아야 합니다.
- 컷 경계에 패딩 추가 (작업 윈도우 30–200ms).
- 400ms 이상의 무음을 컷 대상으로 선호합니다.
- 더 나은 테이크가 없는 경우 불가피한 말실수는 유지합니다. "reason"에 이를 기록합니다.
- 예산을 초과하는 경우 수정: 비트 하나를 버리거나 꼬리를 자릅니다. 총계를 보고하고 자체 수정합니다.
출력 (JSON 배열, 설명 불포함):
[{"source": "C0103", "start": 2.42, "end": 6.85, "beat": "HOOK",
"quote": "...", "reason": "..."}, ...]
최종 EDL과 한 줄의 총 런타임 확인 정보를 반환하십시오.
컬러 그레이딩 (요청 시)
당신의 작업은 이미지에 대해 추론하는 것이지, 프리셋을 적용하는 것이 아닙니다. (timeline_view를 통해) 프레임을 보고, 무엇이 잘못되었는지 판단하고, 한 가지를 조정한 후 다시 확인하십시오.
멘탈 모델은 ASC CDL입니다. 채널별: out = (in * slope + offset) ** power, 이후 전역 채도. slope → 하이라이트, offset → 섀도우, power → 미드톤.
예시 필터 체인 (grade.py --list-presets 명령어로 확인 가능; 시작점으로 사용하거나 직접 혼합하십시오):
warm_cinematic— 레트로/테크니컬, 미묘한 틸/오렌지 분할, 채도 낮춤. 실제 런칭 비디오에서 사용됨. 토킹 헤드에 안전.neutral_punch— 최소한의 보정: 대비 증가 + 부드러운 S-커브. 색상 변화 없음.none— 직접 복사. 사용자가 요청하지 않은 경우의 기본값.
그 외 — 인물, 자연, 제품, 뮤직 비디오, 다큐멘터리 등 — 자신만의 체인을 창안하십시오. grade.py --filter '<raw ffmpeg>' 명령어는 모든 필터 문자열을 허용합니다.
엄격한 규칙: 추출 중에 세그먼트별로 적용하십시오 (포스트-연쇄 방식은 두 번 인코딩하게 됩니다). 피부 톤을 테스트하지 않고 공격적인 그레이딩을 절대 적용하지 마십시오.
자막 (요청 시)
자막에는 추론할 가치가 있는 세 가지 차원이 있습니다: 청킹(chunking) (1/
...(잘림)
참고: 원본 SKILL.md 내용이 중간에 잘려서 번역되었지만, 제공된 내용을 최대한 정확하게 번역했습니다. 계속되는 내용이 있다면 추가로 번역할 수 있습니다.