Video Use
원칙
- LLM은 원시 트랜스크립트와 온디맨드 시각 자료로부터 추론합니다. 유일한 필수 파생 아티팩트는 구문 레벨의 패킹된 트랜스크립트(
takes_packed.md)입니다. 그 외의 모든 것(필러 태깅, 재테이크 탐지, 샷 분류, 강조 점수 등)은 결정 시점에 도출합니다. → 확인: 단계 출력이 예상 결과와 일치해야 함 - 오디오가 우선이고, 시각 자료는 그 다음입니다. 컷 후보는 음성 경계와 무음 간격에서 나옵니다. 결정 시점에만 시각 자료를 자세히 살펴봅니다. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 질문 → 확인 → 실행 → 반복 → 저장. 사용자가 평이한 영어로 전략을 확인하기 전에는 절대 컷을 건드리지 않습니다.
- 일반화하십시오. 이 영상이 어떤 종류인지 가정하지 마십시오. 자료를 보고, 사용자에게 질문한 후 편집하십시오. → 확인: diff가 의도한 변경 사항과 일치해야 함
- 예술적 자유가 기본값입니다. 이 문서의 모든 특정 값, 프리셋, 폰트, 색상, 지속 시간, 피치 구조, 그리고 기법은 하나의 검증된 영상에서 가져온 작업 예시일 뿐이며, 명령이 아닙니다. 가능한 것과 각각이 왜 효과가 있었는지 이해하기 위해 읽으십시오. 그런 다음 자료가 실제로 무엇이고 사용자가 실제로 원하는 것이 무엇인지에 따라 자신의 취향을 반영하여 결정하십시오. 반드시 따라야 하는 것은 아래의 Hard Rules 섹션뿐입니다. 나머지는 여러분의 몫입니다. → 확인: 파일 내용이 예상 형식과 일치해야 함
- 자유롭게 창안하십시오. 자료가 여기에 설명되지 않은 기법(분할 화면, 화면 속 화면, 하단 서드 신원 카드, 리액션 컷, 스피드 램프, 프리즈 프레임, 크로스페이드, 매치 컷, L-컷, J-컷, 호흡 구간 스피드 램프 등 어떤 것이든)을 요구한다면 직접 구축하십시오. 도우미는 ffmpeg와 PIL입니다. 형식이 지원하는 모든 것을 할 수 있습니다. 허락을 기다리지 마십시오. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 사용자에게 보여주기 전에 자신의 출력을 검증하십시오. 출시할 준비가 되지 않았다면 제시하지 마십시오.
Hard Rules (프로덕션 정확성 — 협상 불가)
이것들은 위반 시 무음 오류 또는 깨진 출력을 초래하는 사항들입니다. 취향이 아니라 정확성의 문제입니다. 반드시 숙지하십시오.
- 자막은 모든 오버레이 이후 필터 체인의 마지막에 적용됩니다. 그렇지 않으면 오버레이가 캡션을 가립니다. 무음 오류. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 세그먼트별 추출 → 무손실
-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 드리프트가 있습니다. 패딩이 이 드리프트를 흡수합니다. 빠른 템포에서는 더 좁게, 시네마틱에서는 더 넓게. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 단어 수준의 축어적 ASR만 사용하십시오. SRT/구문 모드 사용 금지(1초 미만 갭 데이터 손실). 정규화된 필러 금지(편집 신호 손실). → 확인: diff가 의도한 변경 사항과 일치해야 함
- 소스별로 트랜스크립트를 캐시하십시오. 소스 파일 자체가 변경되지 않는 한 다시 트랜스크라이브하지 마십시오. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 여러 애니메이션에 대해 병렬 서브 에이전트를 사용하십시오. 절대 순차적으로 하지 마십시오.
Agent도구를 통해 N개를 동시에 생성하십시오. 총 소요 시간 ≈ 가장 느린 하나의 시간. → 확인: 단계 출력이 예상 결과와 일치해야 함 - 실행 전 전략 확인. 사용자가 평이한 영어 계획을 승인하기 전에는 절대 컷을 건드리지 마십시오. → 확인: 단계 출력이 예상 결과와 일치해야 함
- 모든 세션 출력은
<videos_dir>/edit/에 저장됩니다.video-use/프로젝트 디렉토리 내에는 절대 쓰지 마십시오. → 확인: 출력이 존재하고 오류 없이 파싱되어야 함
이 문서의 다른 모든 내용은 작업 예시입니다. 자료가 요구할 때마다 자유롭게 변경하십시오.
디렉토리 구조
스킬은 video-use/에 있습니다. 사용자 영상은 사용자가 저장한 곳에 있습니다. 모든 세션 출력은 <videos_dir>/edit/로 이동합니다.
<videos_dir>/
├── <소스 파일, 수정되지 않음>
└── edit/
├── project.md ← 메모리; 매 세션마다 추가됨
├── takes_packed.md ← 구문 레벨 트랜스크립트, LLM의 주요 읽기 뷰
├── edl.json ← 컷 결정 사항
├── transcripts/<name>.json ← 캐시된 원시 Scribe JSON
├── animations/slot_<id>/ ← 애니메이션별 소스 + 렌더 + 추론
├── clips_graded/ ← 그레이딩 및 페이드가 적용된 세그먼트별 추출물
├── master.srt ← 출력 타임라인 자막
├── downloads/ ← yt-dlp 출력
├── verify/ ← 디버그 프레임 / 타임라인 PNG
├── preview.mp4
└── final.mp4
설정
- 프로젝트 루트 또는 환경 변수에 있는
.env파일의ELEVENLABS_API_KEY. 없으면 사용자에게 요청하고.env파일을 작성하십시오. ffmpeg+ffprobe가 PATH에 있어야 함.- Python 의존성:
pip install -e .. yt-dlp,manim, Remotion은 최초 사용 시에만 설치됩니다.- 이 스킬은
skills/manim-video/를 제공합니다. Manim 슬롯을 구축할 때는 해당 SKILL.md를 읽으십시오.
도우미
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>— 세그먼트별 추출 → 연결 → 오버레이(PTS 이동) → 자막을 마지막에 적용.--preview는 720p 고속용.--build-subtitles는 master.srt를 인라인으로 생성합니다.grade.py <in> -o <out>— ffmpeg 필터 체인 그레이딩. 프리셋 + 커스텀용--filter '<raw>'.
애니메이션의 경우 Bash를 사용하여 <edit>/animations/slot_<id>/ 디렉토리를 생성하고 Agent 도구를 통해 서브 에이전트를 생성하십시오.
프로세스
-
인벤토리. 모든 소스에 대해
ffprobe실행. 디렉토리에 대해transcribe_batch.py실행.pack_transcripts.py실행하여takes_packed.md생성. 시각적 첫인상을 위해timeline_view를 한두 개 샘플링. → 확인: 단계 출력이 예상 결과와 일치해야 함 -
문제 사전 스캔.
takes_packed.md를 한 번 훑어보며 언어적 실수, 명백한 잘못된 발언, 또는 피해야 할 구문을 기록. 평이한 목록을 작성하여 편집기 브리핑에 제공. → 확인: 단계 출력이 예상 결과와 일치해야 함 -
대화. 평이한 영어로 보이는 것을 설명. 자료에 기반한 질문을 던짐. 수집할 항목: 콘텐츠 유형, 목표 길이/종횡비, 미적/브랜드 방향, 페이스 느낌, 반드시 유지할 순간, 반드시 제거할 순간, 애니메이션 및 그레이딩 선호도, 자막 필요 여부. 고정된 체크리스트를 사용하지 마십시오. 매번 적합한 질문이 다릅니다. → 확인: 모든 테스트 통과
-
전략 제안. 4–8문장: 구조, 테이크 선택, 컷 방향, 애니메이션 계획, 그레이딩 방향, 자막 스타일, 예상 길이. 확인을 기다림. → 확인: 단계 출력이 예상 결과와 일치해야 함
-
실행. 편집기 서브 에이전트 브리핑을 통해
edl.json생성. 모호한 순간에timeline_view로 세부 확인. 병렬 서브 에이전트에서 애니메이션 구축. 세그먼트별로 그레이딩 적용.render.py를 통해 합성. → 확인: 명령어 종료 코드 0 -
미리보기.
render.py --preview. → 확인: 단계 출력이 예상 결과와 일치해야 함 -
자체 평가(사용자에게 보여주기 전). 렌더링된 출력(소스 아님)에 대해 모든 컷 경계(±1.5s 윈도우)에서
timeline_view실행. 각 이미지에서 다음 항목 확인: → 확인: 명령어 종료 코드 0- 컷 지점의 시각적 불연속성 / 플래시 / 점프
- 경계에서의 파형 스파이크(30ms 페이드를 통과한 오디오 팝)
- 오버레이 뒤에 숨겨진 자막(Rule 1 위반)
- 오버레이 정렬 불량 또는 잘못된 프레임 표시(Rule 4 위반)
또한 샘플 확인: 처음 2초, 마지막 2초, 중간 지점 2~3곳 — 그레이딩 일관성, 자막 가독성, 전반적인 응집력 확인. 출력에
ffprobe실행하여 지속 시간이 EDL 예상과 일치하는지 확인.실패 시: 수정 → 재렌더링 → 재평가. 자체 평가는 최대 3회로 제한 — 3회 이후에도 문제가 남아 있으면 무한 반복 대신 사용자에게 문제를 알립니다. 자체 평가를 통과한 경우에만 미리보기를 제시합니다.
-
반복 및 저장. 자연어 피드백, 재계획, 재렌더링. 다시 트랜스크라이브하지 마십시오. 확인 후 최종 렌더링.
project.md에 추가. → 확인: 단계 출력이 예상 결과와 일치해야 함
컷 제작 기법
- 오디오 우선. 단어 경계와 무음 간격에서 컷 후보 도출.
- 피크는 보존하십시오. 웃음, 결정적 대사, 강조 비트. 결정적 대사 이후 리액션을 포함하도록 연장 — 웃음 자체가 비트입니다.
- 화자 전환에는 발화 사이에 공백이 있는 것이 좋습니다. 일반적인 값: 400–600ms. 빠른 템포에서는 더 짧게, 시네마틱에서는 더 길게. 취향 결정.
- 오디오 이벤트를 신호로 활용.
(웃음),(한숨),(박수)는 비트를 표시합니다. 이들을 지나 연장하십시오. - 무음 간격은 컷 후보입니다. 400ms 이상의 무음이 일반적으로 가장 깔끔합니다. 150–400ms의 구문 경계는 시각적 확인과 함께 사용 가능합니다. 150ms 미만은 안전하지 않습니다(구문 중간).
- 컷 패딩 예시(함께 제공된 런칭 영상): 첫 번째 유지 단어 앞 50ms, 마지막 단어 뒤 80ms. 몽타주 에너지에는 더 타이트하게, 다큐멘터리에는 더 느슨하게. 30–200ms 작업 윈도우 내에 유지하십시오(Hard Rule 7).
- 오디오와 비디오를 독립적으로 추론하지 마십시오. 모든 컷은 두 트랙 모두에서 작동해야 합니다.
패킹된 트랜스크립트 (주요 읽기 뷰)
pack_transcripts.py는 모든 transcripts/*.json을 읽고 각 테이크가 구문 수준 라인 목록이고 각 라인 앞에 [시작-끝] 시간 범위가 붙은 하나의 마크다운 파일을 생성합니다. 구문은 0.5초 이상의 무음 또는 화자 변경 시 분할됩니다. 이것은 편집기 서브 에이전트가 컷을 선택하기 위해 읽는 아티팩트로, 원시 JSON의 1/10 토큰으로 텍스트만으로 단어 경계 정밀도를 제공합니다.
예시 라인:
## C0103 (지속 시간: 43.0초, 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).