Clips
경로: ${CLAUDE_SKILL_DIR}는 이 SKILL.md가 들어 있는 폴더를, ${CLAUDE_SKILL_DIR}/../..는 그 위 두 단계 위의 에디터 폴더(이 저장소의 .claude/)를 가리킵니다.
먼저 ${CLAUDE_SKILL_DIR}/../../PRINCIPLES.md를 읽으십시오: 모든 동영상이 따라야 하는 규칙(질문하기, 실제처럼 보이기, 움직임, 스토리와 프레이밍, 개인정보, 비용)입니다.
사용자에게 하는 모든 질문은 질문 상자에 넣으십시오: AskUserQuestion 도구를 호출하십시오(2~4개 옵션, 추천 옵션을 맨 앞에). 해당 도구가 없는 에이전트에서만 번호가 매겨진 질문을 텍스트로 하십시오.
하나의 긴 동영상을 입력받아 최고의 몇 개의 짧은 클립을 출력합니다. 각 클립은 사용자 스타일의 완성된 세로 편집본입니다.
clips/<이름>/
source.mp4 긴 동영상(로컬 파일의 경우 심볼릭 링크, 원본은 절대 수정하지 않음)
source.mp3, cover.jpg (오디오 전용 팟캐스트인 경우) 오디오와 쇼의 아트워크
words.raw.json 전체 동영상의 자막 한 개(절대 읽지 않음)
candidates.json 각 후보와 그 특성(절대 읽지 않음)
shortlist.md 서로 겹치지 않는 상위 8개 후보, 약 1,500 토큰: 유일하게 읽는 파일
shortlist.json 페이지용으로 동일한 정보
picks.html 사용자가 선택하는 페이지
edits/<이름>-clip<N>/ 선택된 각 클립당 하나의 편집 폴더: source.mp4, words.raw.json(재타이밍됨), clip.json
스크립트는 Mac과 Linux에서 python3, Windows에서 py로 실행합니다.
PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py"; python3 "$PY" 아래 명령어는 에디터의 venv Python을 실행합니다(Windows에서는 py "$PY").
만약 없다면 먼저 setup 스킬을 실행하십시오. K="${CLAUDE_SKILL_DIR}/scripts/clips.py",
C="${CLAUDE_SKILL_DIR}/../../skills/cut/scripts", S="${CLAUDE_SKILL_DIR}/../../skills/style-edit/scripts"입니다.
0. 한 번 질문하기
먼저 프로필과 취향을 읽으십시오(python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" show,
python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show). 프로필이 아직 없으면 먼저
start 스킬의 스타일 인테이크를 실행하여 클립이 사용자의 스타일로 나오게 하십시오.
그런 다음 질문 상자 호출 한 번, 추천 옵션을 먼저:
| 질문 | 옵션 |
|---|---|
| 클립 몇 개? | 3 (추천) / 5 / 1 |
| 각각 길이는? | 20-40 초 (추천) / 40-60 초 / 60-90 초 |
| 말하는 사람은 몇 명? | 한 명 (추천) / 두 명 (팟캐스트 또는 인터뷰) |
사용자가 이미 답변한 것은 건너뛰십시오. 이 질문은 cut 스킬의 "먼저 자를지 한 번에 할지" 질문을 대체합니다: 클립은 바로 진행되며, 사용자는 선택 항목과 스틸 시트를 승인합니다.
1. 동영상
로컬 파일 (같은 드라이브의 하드 링크, 아니면 심볼릭 링크, 마지막 수단으로만 복사):
python3 "${CLAUDE_SKILL_DIR}/../../skills/clips/scripts/clips.py" link "<절대 경로>" clips/<이름>
링크:
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/links.py" fetch "<url>" clips/<이름> --max-height 1080
venv의 yt-dlp를 사용하며(설치 시 PATH가 아닌 venv에 설치됨), 다운로드를 1080p로 제한합니다(1080x1920 클립에 4K는 필요 없으며, 20분 분량의 4K 영상은 수 GB입니다). 파일 경로를 출력합니다: clips/<이름>/source.mp4. 종료 코드 3: 사이트에서 로그인을 요구하는 경우(YouTube의 "로봇이 아닙니다" 확인). 질문 상자에 물어본 후 --cookies-from-browser chrome(또는 사용자 브라우저) 옵션을 추가하여 다시 실행하십시오.
팟캐스트(RSS 피드 또는 Apple Podcasts 쇼 링크): route가 최신 에피소드를 ask 옵션으로 나열합니다. 질문 상자에서 하나를 고르게 한 후(최신순), fetch "<옵션 url>" clips/<옵션 이름> --direct --cover "<옵션 이미지>"를 실행하면: 오디오는 source.mp3(또는 해당 확장자)로, 쇼의 아트워크는 cover.jpg로 저장됩니다.
사용자가 재사용할 권한이 있는 동영상만 다운로드하십시오: 자신의 동영상 또는 허가를 받은 동영상만 해당합니다. 링크가 타인의 것이라면 한 번 알려주십시오.
2. 한 번 자막 추출
python3 "$PY" "$C/transcribe.py" clips/<이름>/source.mp4 clips/<이름>/words.raw.json # fetch가 출력한 파일: 오디오의 경우 source.mp3
먼저 시간을 알려주십시오: Whisper는 노트북에서 동영상 3분당 1~4분이 소요되며(무료), Scribe는 13분 동영상에 약 20초가 소요됩니다. cut 스킬과 동일한 엔진입니다. Scribe는 웃음 및 기타 오디오 이벤트를 추가하며, 점수 산정에 사용됩니다. 모든 클립이 이 자막을 재사용하므로, 두 번 추출하지 않습니다.
3. 후보와 쇼트리스트
python3 "$K" candidates clips/<이름> --min 20 --max 40 [--speakers 2] [--style creator-teardowns/<핸들>/style.json]
사용자가 선택한 길이를 전달하십시오. --style은 프로필의 첫 번째 크리에이터입니다: 거기서 측정된 "잘 통하는" 동작이 쇼트리스트에 나열됩니다. 코드는 자막을 문장으로 분할하고, 지정된 길이 안에 들어오는 모든 연속된 문장들을 후보로 만든 후(절대 "음"으로 시작하거나 단어 중간에 끝나지 않음), 각각을 측정하고 특성별로 순위를 매겨 shortlist.md에 기록합니다.
shortlist.md만 읽으십시오. 각 항목에는 후킹 문장, 각 중간 문장의 시작 단어, 마지막 문장 및 측정된 특성이 있습니다. 각 항목을 네 가지 질문으로 평가하십시오: 후킹이 단독으로 통하는가, 낯선 사람이 따라갈 수 있는가, 결말이 있는가, 구체적인 주장, 숫자 또는 이야기가 있는가.
words.raw.json이나 candidates.json은 절대 읽지 마십시오. 쇼트리스트에서 사용자가 요청한 수의 클립을 골라내되, 가장 좋은 것부터 선택하십시오. 점수와 관계없이 다음은 제외하십시오:
- 광고, 스폰서 세그먼트, 인트로 또는 마무리;
- 이전 맥락에 의존하는 후킹("아까 말했듯이", "그래서", "이건");
- 시점이 지난 주장("이걸 녹음하는 지금은 40위야")을 핵심으로 하는 클립으로, 해당 주장이 이후 변경된 경우: 라이브로 오늘 페이지를 캡처하면 모순될 수 있음.
4. 선택 페이지, 그리고 질문 상자
python3 "$K" page clips/<이름> --recommend c12,c40,c7
open clips/<이름>/picks.html # Windows: start "" ..., Linux: xdg-open ...
한 페이지: 각 쇼트리스트 클립에 대해 360px 미리보기, 자막(후킹 부분은 굵게), 점수 분석 및 측정된 특성, 사용자가 선택한 항목이 표시됩니다. 그런 다음 질문 상자에서 (다중 선택) 질문: 사용자가 선택한 항목을 먼저 표시하고 각 항목에 시간과 후킹을 레이블로 붙이며, "페이지에서 다른 항목" 옵션도 포함합니다. 답변을 기다리십시오.
5. 각 선택된 클립
python3 "$K" trim clips/<이름> c12 c40 c7 # -> edits/<이름>-clip1, -clip2, -clip3
각 편집 폴더는 source.mp4(프레임 정확, 다음 단어를 자르지 않도록 여백 포함)와 words.raw.json(해당 클립에 맞게 재타이밍)을 받습니다. 오디오 전용 소스(source.mp3)는 영상이 없습니다: trim은 각 클립의 source.mp4를 팟캐스트 자체 커버(커버를 블러 처리하고 어둡게 하여 1080x1920을 채우고, 선명한 커버는 자막 위에 위치, 아트워크가 없으면 검은 배경) 위에 오디오를 입힌 형태로 만들며, clip.json에는 audio_only라고 표시됩니다. 커버가 있는 경우, 렌더링은 이를 움직이게 처리합니다: 커버에 느린 푸시, 바닥이 미끄러지듯 움직임, 각 문장 시작에 작은 펀치 효과. 이 경우 레이아웃을 묻지 마십시오: 오버레이, 리프레임 없음, 컷아웃 없음, 자막 켜짐(profile.py style이 자막을 켜 둠). 각 클립은 쇼의 커버 위에 오디오와 화자의 단어가 자막으로 표시된다고 한 번 알려주십시오. 클립을 실행하기 전에 모든 클립에 대해 음악을 한 번에 결정하십시오(style-edit references/plan.md "Music"; 사용자가 sound.music을 설정하지 않았다면 스타일이 결정).
모든 클립을 한 번에 (Claude Code 또는 하위 에이전트를 지원하는 모든 에이전트): 각 클립당 하나의 clip-editor 에이전트(clip-editor)를 모두 같은 메시지에 실행하여 동시에 실행되도록 하십시오. 각 에이전트에 EDIT(클립 폴더의 절대 경로), ROOT(${CLAUDE_SKILL_DIR}/../..), PY 라인, 그리고 답변(화면비, 레이아웃, 음악, 자막 엔진, 리프레임 여부(가로 소스인 경우, 플랫폼이 YouTube가 아니라면 예), 소스에 자막이 하드코딩되어 있는지 여부)을 전달하십시오. 각 에이전트는 해당 클립을 cut 및 style-edit을 통해 스틸 시트까지 진행하고 짧은 JSON(status, cut_s, verify, cut_page, sheet, error)을 반환합니다. 이 결과들을 병합하십시오. 각 클립의 자막이나 페이퍼 에디트를 열지 마십시오. 그런 다음 ready 상태인 모든 클립의 시트에 대해 stills-critic 에이전트를 다시 모두 같은 메시지에 실행하고, 실패한 부분을 수정하십시오(해당 클립에 대해 계획 및 스틸 다시 생성). failed 클립은 아래와 같이 수동으로 실행하십시오.
하나씩 (하위 에이전트 없음), 각 클립을 순서대로:
- 가로 동영상에서 세로로:
python3 "$PY" "$K" reframe edits/<이름>-clip<N>명령어는 샷별로 화자의 머리를 따라가는 크롭으로 9:16 비율로 자릅니다(ffmpeg로 카메라 컷을 찾음). 프로필의 플랫폼이 YouTube이거나 소스가 이미 세로인 경우 건너뛰십시오. - Cut: cut 스킬의 2단계(
retakes.py propose)부터 진행: 자막은 이미 있습니다. 그런 다음 해당 스킬에 따라 빌드, 렌더링, 검증 및 cut 페이지를 진행합니다. 음성 아래의 음악은 파일별로 측정됩니다:build_timeline.py는 거기서 단어 사이만 다듬습니다. - Style:
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" style edits/<이름>-clip<N>, 그런 다음 style-edit 스킬의 2단계부터 진행합니다. 소스에 이미 하드코딩된 자막이 있는 경우, 해당 편집의style.json에"captions": {"present": false}를 설정하지 않으면 자막이 겹칩니다.
어느 쪽이든, 모든 클립의 cut-check.html을 열고 모든 스틸 시트를 함께 표시하여 한 번에 승인을 받고, 모든 클립에 대해 렌더링 질문을 한 번 하고 렌더링합니다. 승인 후, 각 클립 폴더에 대해 python3 "${CLAUDE_SKILL_DIR}/../../skills/cut/scripts/judge_cut.py" score를 실행합니다(cut references/judge.md). 하나의 리뷰 페이지에 각 클립을 탭으로 표시하여(start는 clip 1, alt는 나머지, 폴더 clips/<이름>; ${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/review.md 참조) 렌더링 결과를 전달한 후, 백그라운드에서 serve와 wait를 실행합니다.
스크립트가 중단되는 경우
| 메시지 | 조치 |
|---|---|
no run of whole sentences lasts <lo>-<hi> s | 질문 상자에서 더 넓은 길이를 물어보고 candidates를 다시 실행 |
no candidate <id> | shortlist.md의 id 사용 |
links.py fetch exit 3 (로그인 또는 "로봇이 아닙니다" 확인) | --cookies-from-browser <브라우저> 옵션을 추가하여 다시 실행하기 전에 질문 |
| cut 또는 style-edit 메시지 | 해당 스킬의 "스크립트가 중단되는 경우" 표 참조 |
규칙
- 화면에 표시되는 모든 단어, 숫자 및 이름은 해당 클립 자체의 단어에서 가져옵니다. 동영상의 나머지 부분이나 화자가 말하지 않은 것은 사용하지 않습니다.
- AI 티가 나는 모양은 금지:
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/ai-tells.md가 모든 클립에 적용됩니다. - 클로즈업 팟캐스트 프레임에는 빈 공간이 없습니다: 머리 위에 카드나 로고를 배치하지 않습니다. 시각 요소는 적을수록 좋으며, 자막과 줌이 이를 대신합니다.
- 클립을 문장 중간에 자르지 마십시오. 요청한 길이보다 짧거나 긴 것은 끊긴 생각보다 낫습니다.
긴 동영상당 비용
13분 분량의 2인 팟캐스트와 12분 분량의 1인 토크 동영상 기준(2026-10):
- 자막 추출: Scribe는 16-18초 소요; Whisper는 무료이며 더 느림. 긴 동영상당 한 번.
- 후보 및 특성 추출: 코드 실행 4-6초, 비용 $0.
- Claude가
shortlist.md(약 1,500 토큰)를 읽고, 자막(약 20,000 토큰)은 읽지 않음. - 선택 페이지: 8개 미리보기용 ffmpeg 30-40초, 7-9MB.
- 각 클립은 이후 cut 한 번과 style edit 한 번의 비용이 듭니다.
자체 점검
python3 "$K" demo
파일
scripts/clips.py: 후보 생성, 페이지, 트림, 리프레임 및 오프라인 데모(합성 자막). Stdlib만 사용, 단reframe은 venv를 통해 OpenCV 사용.${CLAUDE_SKILL_DIR}/../../agents/clip-editor.md: 하나의 클립을 cut 및 style-edit을 통해 스틸 시트까지 진행.