컷
경로: ${CLAUDE_SKILL_DIR}는 이 SKILL.md가 포함된 폴더를 의미하며, ${CLAUDE_SKILL_DIR}/../..는 두 단계 위에 있는 에디터 폴더(이 저장소의 .claude/)입니다.
먼저 ${CLAUDE_SKILL_DIR}/../../PRINCIPLES.md를 읽으세요: 모든 비디오가 따라야 하는 규칙입니다.
모든 질문은 질문 상자에 넣습니다: AskUserQuestion 도구(2–4개 옵션, 첫 번째 권장). 이 도구가 없는 에이전트에서만 텍스트로 번호가 매겨진 질문을 합니다.
edits/<name>/ transcript.txt (이것을 읽고 절대 words.raw.json을 읽지 마세요), spans.json (제거할 대상, 인용), candidates.md (코드가 플래그한 내용), paper-edit.md (컷을 텍스트로), cut-check.html (대본), review.json (노트), cut.mp4 + words.json (렌더링과 그 단어들)
<name>은 파일 이름의 슬러그입니다 (IMG_1234.MOV -> img-1234). 라이브러리(PRINCIPLES.md "위치")에 있습니다. 소스 파일을 수정, 이동 또는 복사하지 마세요: 경로를 전달하면 됩니다.
PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py"; python3 "$PY"가 툴 venv를 실행합니다. Windows에서는 python3 대신 py를 사용하세요.
venv가 아직 없으면: 먼저 setup 스킬을 실행하세요. S="${CLAUDE_SKILL_DIR}/scripts"입니다.
아직 비디오가 없나요?
테이크의 경로를 물어보세요. 여러 파일: references/takes.md. 없음: AI_EDITOR_SAMPLE_URL이 설정되어 있으면 해당 샘플 테이크를 제공하고 사용자 폴더에 다운로드하세요 (curl -L -o sample-take.mp4 "$AI_EDITOR_SAMPLE_URL"); 그렇지 않으면 하나를 녹화해 달라고 요청하세요 (30~60초 동안 말하는 모든 폰 비디오면 됩니다).
0. 묻기: 컷 먼저, 아니면 한 번에 전부?
무엇보다 먼저 질문 상자에 하나의 질문을 하세요 (start는 전체 편집을 위해 이걸 결정합니다):
컷만 먼저 하시겠습니까, 아니면 컷과 스타일 편집을 한 번에 하시겠습니까?
- 컷만 먼저 (권장). 캡션이나 줌, 비주얼을 추가하기 전에 컷을 승인하므로, 변경된 컷이 비주얼을 다시 빌드하지 않습니다 (토큰 절약).
- 한 번에 전부. 컷을 한 다음 기다리지 않고 스타일을 적용합니다. 그래도 컷 페이지와 스틸 시트를 보여드리기 전에 보여드립니다.
사용자가 이미 답변한 경우("그냥 잘라줘", "한 번에 잘라서 스타일까지 해줘") 또는 start나 clips가 이 스킬을 호출한 경우에만 건너뜁니다. 컷만 먼저: 1-6단계를 수행한 후 사용자가 컷을 승인 하고 스타일을 요청할 때까지 중단합니다. 한 번에 전부: 1-5단계를 수행하고, 컷 페이지를 연 후 바로 style-edit으로 진행합니다; 이후 컷이 변경되면 plan 단계부터 style-edit을 다시 실행합니다.
0b. 사용자 취향 읽기
python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show --edit edits/<name>
모든 규칙을 따르세요. 결과에 대한 반응("너무 느려요")은 다시 하기 전에 taste 스킬로 저장하세요.
1. 전사
python3 "$PY" "$S/transcribe.py" <source> edits/<name>/words.raw.json [--script <their script>]
스크립트(또는 반복 가능한 --keyterm 이름)는 이름과 전문 용어를 올바르게 처리합니다 (Scribe에서 +20% 향상).
먼저 시간을 알려주세요: Whisper는 3분 테이크에 1-4분, CrisperWhisper는 테이크 길이 정도 걸립니다. 키가 저장되어 있으면 Scribe를 선택하고, 없으면 CrisperWhisper가 설치되어 있으면 그것을, 아니면 무료 로컬 Whisper를 선택합니다 (--engine whisper|crisper|scribe로 재정의 가능). 로컬 Whisper는 몇몇 음과 잘못된 시작을 제거합니다. 둘 다 없으면 setup이 하나를 추가할 수 있다고 한 번 말하세요 (CrisperWhisper의 가중치는 비상업용만 가능합니다). 편집 중간에 절대 모델을 다운로드하지 마세요: 설치되지 않은 모델이 필요한 재확인(종료 코드 4)은 건너뛰고 해당 라운드 노트에 기록합니다.
절대 words.raw.json을 읽지 마세요: 2단계에서 크기가 1/12인 transcript.txt를 작성합니다.
2. 무엇을 자를지 결정
python3 "$S/retakes.py" propose edits/<name>
코드가 모든 가능한 컷(반복된 대사, 끝나지 않은 문장, "잠깐, 미안해요", 필러 등)을 찾아 candidates.md에 저장합니다. 각각은 봐야 할 지점이며 결정이 아닙니다. transcript.txt와 candidates.md를 읽고, references/retake-detection.md를 따라 spans.json (references/shapes.md)을 작성하세요.
script.md가 있는 경우: python3 "$S/script_match.py" edits/<name>, script-match.md (references/script.md)를 읽으세요.
마지막 테이크가 승리하며, 대체 훅은 예외입니다. 절대 타임스탬프를 입력하거나 일시 중지를 범위로 지정하지 마세요.
사용자가 더 짧게 만들고 싶어하거나(또는 취향에 에디토리얼 패스를 실행하라고 명시된 경우)에만 references/editorial-rules.md를 읽고 redundant 컷(내용 호출)을 추가하세요.
잘못 들은 이름은 JSON을 다시 작성하지 않고 한 번의 명령으로 처리합니다: python3 "$S/retakes.py" fix edits/<name> cloud=Claude jiv=Jev (전체 단어, fixes.json에 보관되어 캡션에 사용됩니다).
3. 빌드
python3 "$S/build_timeline.py" <source> edits/<name> && python3 "$PY" "$S/mirror.py" <source> edits/<name>
--max-pause(0.15초)를 초과하는 모든 일시 중지(숨쉬기 포함)는 0.10초가 됩니다. 음악이 있을 때만 단어 간격이 잘립니다. 빌드에서 ERROR가 발생하면 아무 것도 쓰지 않습니다: 해당 범위를 수정하고 다시 실행하세요.
mirror.py는 책, 셔츠, 표지판이 거꾸로 읽힐 때(전면 카메라 테이크) mirrored라고 말합니다: 한 번 물어보세요. 촬영 그대로 유지 (권장) (대부분의 크리에이터가 그대로 게시합니다) / 텍스트가 읽히도록 뒤집기; 뒤집기로 선택하면 아래 모든 render.py에 --flip을 추가하세요.
한 메시지에서, 백그라운드에서 범위 인코딩(run_in_background)과 페이퍼 검사를 시작하고; 4단계에서는 변경된 부분만 인코딩합니다:
python3 "$S/render.py" <source> edits/<name> --segments-only
cut-judge 에이전트가 paper-edit.md를 평가하고 (남아있는 실수, 잘못된 연결, 좋은 대사 손실) spans.json을 수정합니다. 5분 이상 테이크는 리더가 먼저 실행되고, 그 후 심사자가 실행됩니다: references/judge.md. paper-edit.md를 직접 읽지 마세요.
paper-edit.md에CLIPPED가 있음: 일시 중지 컷이 단어를 잘라먹었습니다.--pad를 높이세요. 여전히 있으면 레이블이 잘못된 것입니다.- 발화 내부의 연결은 조용한 프레임으로 이동합니다.
still in speech가 있으면 5단계에서 들어보세요.
4-5. 렌더링 및 검증
포그라운드 (render.py는 백그라운드 인코딩을 기다립니다):
R="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/review.py"
python3 "$S/build_timeline.py" <source> edits/<name> && \
python3 "$S/render.py" <source> edits/<name> && \
python3 "$PY" "$S/verify_cut.py" edits/<name> --engine <1단계와 동일한 엔진> && \
python3 "$S/preview_cut.py" edits/<name> --no-open && \
python3 "$R" edits/<name> start --video edits/<name>/cut.mp4 --stage cut --transcript edits/<name>/words.json
Verify clean: 컷 페이지 준비 완료. Verify는 컷의 대본과 유지된 단어를 비교합니다 (exit 1이 체인을 중단):
- MISSING: 유지된 단어가 렌더링에 없습니다.
--pad를 높이거나 범위를 좁히고, 다시 빌드하고, 다시 렌더링하세요. - SURVIVED: 실제 반복이나 말 실수에 대한 추가할 범위로, 유지된 대사를 자르는 경우는 절대 없습니다.
- HEARD DIFFERENTLY ("jev -> jeff") 및 필러 노트는 전사 변동입니다: 다시 빌드하지 마세요.
- DOUBLED: 단어가 연속으로 두 번 말해짐. 자연스러운 경우 ("very, very"): 유지. 말 실수: 해당 범위를 추가하세요.
- N join(s) in speech: 들어보세요. 잘렸음:
splice_check.py edits/<name> --fix, 다시 렌더링.
한 번의 수정 사이클 (동일한 체인), 그런 다음 남은 것을 사용자에게 보여줍니다.
6. 사용자 승인
체인이 리뷰 페이지를 열었습니다 (../style-edit/references/review.md). serve와 wait를 백그라운드에서 실행하세요. 잘린 초를 알려주세요. 노트: " 유지": 해당 범위를 좁히거나 삭제; " 잘라": 범위 추가; 일시 중지 끔: --max-pause. 그런 다음 4-5단계, 각 노트를 resolve (--reply: 변경 사항), 마지막으로 round --video edits/<name>/cut.mp4 (두 번째 start는 절대 안 됨), 그런 다음 학습 질문을 합니다.
승인 후, Bash 호출 하나: python3 "$S/trend.py" log edits/<name> (tally: 추세), 훅 확인. 그런 다음 hooks.json이 있으면 훅 변형 (references/retake-detection.md); start에 의해 호출되며, style-edit의 스틸 승인과 동일한 질문 상자에 물어보고, 그 전에는 물어보지 마세요.
승인만으로 컷이 완료됩니다; cut.mp4, words.json은 style-edit으로 전달됩니다. "컷만 먼저"인 경우 스타일을 요청할 수 있다고 말하세요. 절대 스스로 style-edit을 시작하지 마세요. start에 의해 호출됨: 페이지가 열리면 백그라운드에서 visual-prep을 시작하고; motion_briefs: 각각 한 번에 하나씩 백그라운드 clip-builder; motion_note는 한 번만 말하세요.
스크립트가 중단되면
| 메시지 | 할 일 |
|---|---|
no such file / ffmpeg could not read audio | 올바른 경로를 물어보세요; 소스를 절대 복사하거나 변환하지 마세요 |
faster-whisper missing / CrisperWhisper missing | python3 "$PY"로 실행하거나 setup 스킬의 3단계를 실행하세요 |
no ElevenLabs key (exit 2) / HTTP 4xx, unreachable (3) | --engine scribe를 제거하거나 setup 스킬로 키를 다시 저장하세요 |
인용문에서 build ERROR | 해당 범위의 인용문을 수정하거나 occurrence를 추가하고 다시 빌드하세요 |
cannot derive a silence threshold / marked no silence | 음성과 배경이 10 dB 이하로 차이남: ffmpeg -i <source> -af volumedetect -vn -f null -, 평균보다 약 10 dB 높게 --noise를 전달하세요 |
render ERROR ... | 말하고 render를 한 번 다시 실행하세요 |
규칙
- 모든 컷은 대본을 인용합니다. 인용문 없음, 컷 없음.
- 스크립트는 테이크 간의 동점을 깨고, 한 대사를 두 번 말하면 각 테이크를 유지합니다. 스크립트에서 벗어났다고 해서 잘리지 않습니다.
- 컷을 가로질러 절대 스트림 복사(
-c copy)하지 마세요: 최대 2초까지 어긋날 수 있습니다. - 검증되고 승인되지 않은 렌더링을 절대 넘기지 마세요.
자체 점검
test_build_timeline.py, test_retakes.py, test_media.py (ffmpeg); transcribe.py, trend.py, splice_check.py, script_match.py, mirror.py에 대한 demo.