Communitygithub.com

원본 영상에서 쇼츠까지: 대화로 final.mp4 편집

대화만으로 어떤 영상이든 편집합니다. 원본 테이크를 폴더에 넣으면 edit/final.mp4가 나옵니다. 무료 로컬 Whisper 전사, 군말·공백 컷, 구간별 색보정, 모든 컷 지점의 30ms 오디오 페이드, 자막 번인과 애니메이션 오버레이, 컷마다 자체 점검까지. API 키가 필요 없습니다.

원본 영상에서 쇼츠까지: 대화로 final.mp4 편집란 무엇인가요?

‘원본 영상에서 쇼츠까지’ 레시피 1단계(완성 마스터), 출처 Moh4696/freecut. browser-use/video-use의 포크로, 유료 ElevenLabs 의존성을 무료이며 교체 가능한 전사 백엔드로 바꿨습니다. Claude Code, Codex, 셸 접근이 가능한 모든 에이전트에서 동작하며 npx skills add Moh4696/freecut 로 설치합니다. 테이크를 로컬에서 전사하고(mlx-whisper 또는 faster-whisper, 화자 분리가 필요하면 VibeVoice나 ElevenLabs 선택), 구절 단위 전사본을 만든 뒤 소재에 맞춘 질문을 하고 4~8문장의 편집 전략을 제안해 승인을 기다립니다. 이어서 EDL을 작성하고 ffmpeg로 구간별 색보정, 모든 컷에 30ms 페이드를 넣고, 병렬 서브 에이전트로 오버레이(HyperFrames, Remotion, Manim, PIL)를 만들며, 자막은 마지막에 번인하고, 렌더 결과를 모든 컷 경계에서 확인(최대 3회)한 뒤 세션 기억을 project.md에 남깁니다.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add Moh4696/freecut

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

freecut

원칙

  1. LLM은 원시 전사본 + 필요시 시각 정보를 기반으로 추론합니다. 유일하게 유지되는 파생 결과물은 어구 수준의 전사본(takes_packed.md)입니다. 그 외 모든 것(필러 태깅, 재촬영 감지, 샷 분류, 강조 점수)은 결정 시점에 직접 도출합니다.
  2. 오디오가 우선이고, 시각은 따릅니다. 컷 후보는 발화 경계와 무음 간격에서 나옵니다. 결정 시점에만 시각 정보를 추가로 확인합니다.
  3. 질문 → 확인 → 실행 → 반복 → 저장. 사용자가 일반 영어(Plain English)로 전략을 승인하기 전에는 절대 컷을 만지지 않습니다.
  4. 일반화하세요. 이 영상이 어떤 유형인지 가정하지 마십시오. 자료를 살펴보고, 사용자에게 물은 다음, 편집하십시오.
  5. 예술적 자유가 기본값입니다. 이 문서에 있는 모든 특정 값, 프리셋, 글꼴, 색상, 지속 시간, 피치 구조, 기법은 검증된 하나의 영상에서 가져온 작업 예시일 뿐이며, 강제 사항이 아닙니다. 가능한 것과 그것이 효과적이었던 이유를 이해하기 위해 읽어보십시오. 그런 다음 실제 자료와 사용자의 요구에 기반하여 자신의 취향을 적용하십시오. 반드시 따라야 하는 것은 아래 '하드 룰' 섹션에만 있습니다. 나머지는 모두 여러분의 자유입니다.
  6. 자유롭게 창안하십시오. 자료가 여기에 설명되지 않은 기법(분할 화면, PIP(Picture-in-Picture), 하단 서드 아이덴티티 카드, 리액션 컷, 스피드 램프, 프리즈 프레임, 크로스페이드, 매치 컷, L-컷, J-컷, 호흡에 맞춘 스피드 램프 등 무엇이든)을 필요로 한다면 직접 만드십시오. 도우미는 ffmpeg와 PIL입니다. 이들은 포맷이 지원하는 모든 것을 할 수 있습니다. 허락을 기다리지 마십시오.
  7. 사용자에게 보여주기 전에 자신의 출력을 검증하십시오. 출시할 수준이 아니라면 제시하지 마십시오.

하드 룰 (제작 정확성 — 협상 불가)

이 규칙들을 위반하면 자동으로 실패하거나 깨진 출력이 발생합니다. 이는 취향의 문제가 아니라 정확성의 문제입니다. 반드시 기억하십시오.

  1. 자막은 필터 체인에서 가장 마지막에 적용되며, 모든 오버레이 다음에 적용됩니다. 그렇지 않으면 오버레이가 자막을 가립니다. 자동 실패.
  2. 세그먼트별 추출 후 무손실 -c copy 연결(concat). 단일 패스 필터그래프를 사용하지 마십시오. 그렇지 않으면 오버레이가 추가될 때 모든 세그먼트가 두 번 인코딩됩니다.
  3. 모든 세그먼트 경계에 30ms 오디오 페이드 적용 (afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). 그렇지 않으면 모든 컷 부분에서 '팝' 노이즈가 들립니다.
  4. 오버레이는 setpts=PTS-STARTPTS+T/TB를 사용하여 오버레이의 프레임 0을 오버레이 윈도우 시작점으로 이동시킵니다. 그렇지 않으면 오버레이 윈도우 기간 동안 애니메이션의 중간 부분만 보입니다.
  5. 마스터 SRT는 출력 타임라인 오프셋을 사용합니다: output_time = word.start - segment_start + segment_offset. 그렇지 않으면 세그먼트 연결 후 자막이 정렬되지 않습니다.
  6. 절대 단어 중간에서 컷하지 마십시오. 모든 컷 경계는 전사본의 단어 경계에 맞춰 스냅합니다.
  7. 모든 컷 경계를 패딩하십시오. 작업 범위: 30–200ms. ASR 타임스탬프는 50–100ms 정도 흔들리므로 패딩이 이 흔들림을 흡수합니다. 빠른 템포 영상은 더 타이트하게, 시네마틱 영상은 더 느슨하게 합니다.
  8. 단어 수준의 원문 그대로(verbatim) ASR만 사용하십시오. 절대 SRT/구문 모드를 사용하지 마십시오(초 이하 간격 데이터 손실). 절대 정규화된 필러를 사용하지 마십시오(편집 신호 손실).
  9. 소스별로 전사본을 캐시하십시오. 소스 파일 자체가 변경되지 않는 한 다시 전사하지 마십시오.
  10. 여러 애니메이션은 병렬 서브 에이전트로 처리하십시오. 절대 순차적으로 처리하지 마십시오. Agent 도구를 통해 N개를 동시에 실행하십시오. 총 소요 시간 ≈ 가장 느린 것 하나의 시간.
  11. 실행 전 전략 확인. 사용자가 일반 영어 계획을 승인하기 전에는 절대 컷을 만지지 마십시오.
  12. 모든 세션 출력물은 <videos_dir>/edit/ 디렉토리에 저장합니다. freecut/ 프로젝트 디렉토리 안에는 절대 쓰지 마십시오.

이 문서의 나머지 모든 내용은 작업 예시입니다. 자료가 요구할 때마다 자유롭게 변경하십시오.

디렉토리 구조

스킬은 freecut/에 있습니다. 사용자 영상 파일은 사용자가 지정한 위치에 있습니다. 모든 세션 출력물은 <videos_dir>/edit/로 이동합니다.

<videos_dir>/
├── <원본 파일들, 수정되지 않음>
└── edit/
    ├── project.md              ← 메모리; 세션마다 추가됨
    ├── takes_packed.md         ← 어구 수준 전사본, LLM의 주요 읽기 뷰
    ├── edl.json                ← 컷 결정
    ├── transcripts/<name>.json ← 캐시된 정규화 ASR JSON
    ├── animations/slot_<id>/   ← 애니메이션별 소스 + 렌더링 + 추론
    ├── clips_graded/           ← 세그먼트별 추출물(그레이딩 + 페이드 포함)
    ├── master.srt              ← 출력 타임라인 자막
    ├── downloads/              ← yt-dlp 출력물
    ├── verify/                 ← 디버그 프레임 / 타임라인 PNG
    ├── preview.mp4
    └── final.mp4

설정

최초 설치는 install.md에 있습니다 (클론, 의존성, ffmpeg, 스킬 등록, API 키). 매 세션마다 다시 실행하지 마십시오. 콜드 스타트 시에는 다음을 확인하기만 하면 됩니다:

  • 전사 백엔드 사용 가능. 기본값은 whisper (무료, 로컬)입니다. mlx-whisper (Apple Silicon) 또는 faster-whisper가 임포트 가능한지 확인하십시오. 둘 다 설치되지 않은 경우, 사용자에게 조용히 유료 백엔드로 대체하지 말고 pip install mlx-whisper (또는 faster-whisper)를 실행하도록 안내하십시오. 선택적 백엔드인 vibevoice / elevenlabs의 경우, 환경 변수나 freecut 저장소 루트의 .env 파일에서 VIBEVOICE_ASR_URL / ELEVENLABS_API_KEY를 확인하십시오.
  • ffmpeg + ffprobe가 PATH에 있어야 합니다.
  • Python 의존성 설치됨 (저장소 내에서 uv sync 또는 pip install -e .).
  • 세션에서 HyperFrames 또는 Remotion 슬롯이 필요하면 Node.js + npm이 필요합니다. HyperFrames는 현재 Node.js 22+가 필요합니다.
  • yt-dlp, HyperFrames, Remotion, Manim은 최초 사용 시에만 설치됩니다.
  • 최초 사용 시 애니메이션 설치는 슬롯 디렉토리 내에서 이루어지며, 절대 freecut 저장소 루트에서 하지 않습니다. 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/freecut/ 또는 ~/.codex/skills/freecut/에 심볼릭 링크되어 있습니다.

도우미

  • transcribe.py <video> — 단일 파일 전사. --backend {whisper,vibevoice,elevenlabs}로 백엔드 변경 가능 (기본값 whisper, 로컬 + 무료, 단일 화자). vibevoice는 실제 화자 분리(diarization)를 위해 VIBEVOICE_ASR_URL을 사용합니다. elevenlabs는 ELEVENLABS_API_KEY를 사용하며 --num-speakers를 지원합니다. 캐시됨.
  • transcribe_batch.py <videos_dir> — 4개 워커 병렬 전사. 동일한 --backend 플래그. 여러 테이크(multi-take)에 사용합니다.
  • pack_transcripts.py --edit-dir <dir> — transcripts/*.json → takes_packed.md (어구 수준, 무음 ≥ 0.5s 또는 화자 변경 시 분할). JSON 구조가 정규화되어 있으므로 모든 백엔드에서 동일하게 작동합니다.
  • timeline_view.py <video> <start> <end> — 필름스트립 + 파형 PNG. 필요시 시각적 상세 확인 도구. 스캔 도구가 아닙니다 — 결정 시점에만 사용하고 지속적으로 사용하지 마십시오.
  • render.py <edl.json> -o <out> — 세그먼트별 추출 → 연결 → 오버레이(PTS 이동) → 자막 마지막. --preview는 720p 빠른 미리보기용. --build-subtitles는 마스터 SRT를 인라인으로 생성합니다.
  • grade.py <in> -o <out> — ffmpeg 필터 체인 그레이딩. 프리셋 + --filter '<raw>' 커스텀 지원.

애니메이션의 경우 <edit>/animations/slot_<id>/를 생성하고 Bash를 사용한 후 Agent 도구를 통해 서브 에이전트를 실행하십시오.

프로세스

  1. 인벤토리 확인. 모든 소스에 대해 ffprobe 실행. 디렉토리에 대해 transcribe_batch.py 실행. pack_transcripts.py로 takes_packed.md 생성. 시각적 첫인상을 위해 timeline_view를 한두 개 샘플링.

  2. 문제 사전 점검. takes_packed.md를 한 번 훑어보며 언어적 실수, 명백한 발음 오류, 또는 피해야 할 표현들을 기록. 일반 목록으로 작성하여 편집자 브리핑에 제공.

  3. 대화. 일반 영어로 보이는 것을 설명. 자료에 기반한 질문을 하십시오. 수집할 정보: 콘텐츠 유형, 목표 길이/화면비, 미적/브랜드 방향, 페이싱 느낌, 반드시 유지할 순간, 반드시 제거할 순간, 애니메이션 및 그레이딩 선호도, 자막 필요 여부. 고정된 체크리스트를 사용하지 마십시오. 적절한 질문은 매번 다릅니다.

  4. 전략 제안. 4–8문장: 형태, 테이크 선택, 컷 방향, 애니메이션 계획, 그레이딩 방향, 자막 스타일, 예상 길이. 확인을 기다림.

  5. 실행. 편집자 서브 에이전트 브리핑을 통해 edl.json 생성. 모호한 순간에는 timeline_view로 상세 확인. 애니메이션은 병렬 서브 에이전트에서 구축. 세그먼트별로 그레이딩 적용. render.py로 합성.

  6. 미리보기. render.py --preview.

  7. 자체 평가(사용자에게 보여주기 전). 렌더링된 출력(소스 아님)에서 모든 컷 경계(±1.5초 윈도우)에 대해 timeline_view 실행. 각 이미지에서 다음을 확인:

    • 컷 부분에서 시각적 불연속 / 플래시 / 점프
    • 경계에서 파형 스파이크 (30ms 페이드를 통과한 오디오 팝)
    • 오버레이 뒤에 숨겨진 자막 (규칙 1 위반)
    • 오버레이 정렬 불량 또는 잘못된 프레임 표시 (규칙 4 위반)

    또한 샘플링: 처음 2초, 마지막 2초, 중간 2–3곳. 그레이딩 일관성, 자막 가독성, 전체적인 응집력 확인. 출력물에 대해 ffprobe를 실행하여 지속 시간이 EDL 예상과 일치하는지 확인.

    문제가 있으면: 수정 → 재렌더링 → 재평가. 자체 평가는 최대 3회로 제한 — 3회 후에도 문제가 남으면 사용자에게 플래그를 표시하고 무한 루프에 빠지지 않습니다. 자체 평가를 통과한 후에만 미리보기를 제시하십시오.

  8. 반복 + 저장. 자연어 피드백, 재계획, 재렌더링. 절대 다시 전사하지 마십시오. 사용자 확인 후 최종 렌더링. project.md에 추가.

컷 기법 (기술)

  • 오디오 우선. 컷 후보는 단어 경계와 무음 간격에서 결정.
  • 피크 유지. 웃음, 결정적 대사, 강조 비트. 결정적 대사 이후 리액션까지 포함하도록 연장 — 웃음 자체가 비트입니다.
  • 화자 전환은 발화 사이에 여유를 두는 것이 좋습니다. 일반적인 값: 400–600ms. 빠른 템포 영상은 더 짧게, 시네마틱 영상은 더 길게. 취향의 문제.
  • 오디오 이벤트를 신호로 활용. (웃음), (한숨), (박수)는 비트를 표시합니다. 이들을 지나쳐 연장하십시오.
  • 무음 간격은 컷 후보입니다. 무음 ≥400ms는 일반적으로 가장 깔끔합니다. 150–400ms의 구 경계는 시각적 확인과 함께 사용 가능합니다. <150ms는 안전하지 않습니다 (구 중간).
  • 컷 패딩 예시 (함께 제공된 출시 영상 기준): 첫 번째 유지 단어 앞 50ms, 마지막 단어 뒤 80ms. 몽타주 에너지는 더 타이트하게, 다큐멘터리는 더 느슨하게. 30–200ms 작업 범위 내 유지 (하드 룰 7).
  • 절대 오디오와 비디오를 독립적으로 판단하지 마십시오. 모든 컷은 두 트랙 모두에서 작동해야 합니다.

패킹된 전사본 (주요 읽기 뷰)

pack_transcripts.py는 모든 transcripts/*.json을 읽어 하나의 마크다운 파일로 생성합니다. 각 테이크는 어구 수준의 라인 목록이며, 각 라인은 [시작-종료] 시간 범위가 앞에 붙습니다. 어구는 무음 ≥ 0.5s 또는 화자 변경 시 나뉩니다. 이것이 편집자 서브 에이전트가 컷을 선택하기 위해 읽는 결과물입니다. 원시 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).
  - 무음 ≥ 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>'는 모든 필터 문자열을 허용합니다.

하드 룰: 추출 중에 세그먼트별로 적용하십시오 (연결 후에 적용하면 두 번 인코딩됨). 피부 톤을 테스트하지 않고 공격적인 설정을 하지 마십시오.

자막 (요청 시)

자막은 세 가지 차원을 고려할 가치가 있습니다: 청크 나누기 (줄당 1/2/3/문장), 케이스 (대문자/타이틀/자연스러움), 배치 (하단 여백). 올바른 조합은 콘텐츠에 따라 다릅니다.

작업된 스타일 — 선택, 적용 또는 창안:

  • dense_chat: 2줄, 대문자, 하단 10%. 중간 말하기 속도 토킹헤드, 기술 튜토리얼, 인터뷰 등에 적합.
  • sparse_chat: 줄당 1구, 자연스러운 대소문자, 하단 15%. 느리고 설명적인 콘텐츠용 — 다큐멘터리, 여행 블로그.
  • cinematic: 줄당 2구(떠다니는 듯한 느낌을 위해 더 긴 줄은 피함), 타이틀 케이스, 하단 12%. 시적이거나 감정적인 내레이션용.
  • karaoke: 줄당 3단어, 타이틀 케이스, 하단 18%. 음악 트리트먼트용 — 훅(hook)이 가사의 일부인 경우.
  • monologue: 짧음 (줄당 1–3단어), 대문자, 무빙 탑 (중앙에서 상단으로). 강렬한 단독 몽타주용 — 고백, 독백. 자막을 가리지 않도록 인물에게 충분한 하단 공간을 제공.

필요한 경우 이 스타일 중 어떤 것도 혼합하거나 직접 만드십시오. 자막은 대화의 또 다른 차원입니다.

애니메이션 슬롯 (일반 패턴)

애니메이션을 만들 때는 다음과 같은 구조를 따르십시오:

<edit>/animations/slot_<id>/
  ├── source.mp4
  ├── setup.sh          # 의존성 설치 (nodetools, pip 등) — 캐시 안 됨
  ├── build.sh          # render.py에 전달할 애니메이션 파일(들) 생성
  ├── render.mp4        # 출력 (알파 채널 없음, 오디오 없음, 루프 없음, 길이 일치)
  └── reasoning.md      # 선택한 이유와 대안 및 평가
  • 모든 슬롯 설정은 이 스킬 디렉토리 외부에서 이루어집니다. node_modules/는 슬롯 내부에 둡니다.
  • 애니메이션 렌더링 시 Agent 도구를 통해 서브 에이전트를 호출하십시오. 모든 서브 에이전트를 동시에 실행하십시오.
  • 서브 에이전트에게 앞서 제공한 브리핑(시간, 런타임, 스타일 방향, 키워드, 색상 팔레트, 슬롯 및 애니메이션의 전체 EDL 랩)을 포함하십시오.
  • 문서화되지 않은 새로운 기법을 만들 때는 서브 에이전트의 추론을 reasoning.md에 기록하십시오.
  • 슬롯 출력은 render.py가 소비할 수 있는 render.mp4여야 합니다 (알파 채널이나 오디오 없음, 단일 지속 시간).

HyperFrames 슬롯

HyperFrames는 모션 디자인 마크업 언어를 사용합니다. 핵심 구문:

  • F[frame] (E[easing])? noise=[amplitude], ... — 한 프레임에 대한 텍스트 + 속성.
  • ~[duration] — 시간 경과. 부드러운 보간.
  • P[0-1] — 진행률 기반 표현식.
  • 지속 시간 = 마지막 프레임 인덱스 / 30.

HyperFrames 서브 에이전트는 마크다운 파일을 구성한 다음 npx hyperframes render를 호출합니다. 노출 보호: 출력은 30fps 단일 클립입니다.

Remotion 슬롯

Remotion 슬롯은 npx create-video@latest로 생성할 수 있습니다. Remotion 프로젝트는 ESM을 사용하므로 tsx가 필요합니다. package.json에서 @remotion/cli에 대한 `

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬