Communitygithub.com

Mert-Oezdemir/video-edit

Claude Code를 사용하여 토킹헤드, 튜토리얼, 설명 영상 및 쇼츠를 편집합니다. 원본 테이크에서 단어 단위로 정확하게 컷하고, HTML + GSAP(선택적으로 three.js)으로 모션 그래픽을 제작하며, Python으로 사운드 효과를 합성하고, 정확한 음량 처리와 프레임 단위 렌더링을 수행합니다.

video-edit란 무엇인가요?

이 스킬은 Claude Code가 인간 편집자와 협력하여 원본 영상을 완성된 편집물로 변환하는 AI 비디오 편집 어시스턴트입니다. Whisper의 단어 타임스탬프 및 10ms 에너지 엔벨로프와 같은 측정 가능한 데이터를 기반으로 작동하며, 청각에 의존하지 않습니다. 주요 기능으로는 단어 정확도 기반 러프 컷, HTML+GSAP(선택적 three.js)을 활용한 모션 그래픽, Python으로 합성한 사운드 효과, 정확한 음량 처리 및 프레임 단위 렌더링이 있습니다. 스킬은 작업 순서를 엄격히 정의하여 전사, 러프 컷, 리뷰 루프, 챕터 추가, 그래픽 적용, 사운드 효과 생성, 최종 렌더링 및 믹싱 순서로 진행됩니다. 각 단계 후에는 사용자에게 미리보기를 제공하고 수정을 받습니다. 또한 최초 실행 시 크리에이터 프로필(이름, 색상, 로고, 폰트, 사운드 선호도 등)을 설정하고 이후 모든 비디오에 적용합니다. 이 스킬은 Claude Code, Cursor 등 SKILL.md 파일을 지원하는 모든 AI 에이전트 플랫폼에서 사용할 수 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Mert-Oezdemir/video-edit-workbench/tree/HEAD

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

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

문서

비디오 편집

이 스킬은 인간 편집자와 함께 원본 영상을 완성된 편집물로 전환합니다. 프로젝트를 시작하기 전에 이 파일 전체를 읽으십시오. 그런 다음 컷이나 레벨 변경 전에 reference/audio.md를, 그래픽 작업 전에 reference/style.md를 읽으십시오.

먼저 읽기: 할 수 있는 것과 없는 것

  • 청취할 수 없습니다. 오디오를 듣지 않습니다. 소리에 대해 아는 모든 것은 숫자(Whisper 단어 타임스탬프, 10ms 에너지 엔벨로프, 음량 측정기, 스펙트로그램)에서 비롯됩니다. 이 점을 사용자에게 명확히 알리고 무언가가 "좋게 들린다"고 주장하지 마십시오.
  • 인간의 귀가 최종 판단자입니다. 컷이 단어를 잘라내는지, 효과가 너무 큰지, 목소리가 먹먹하게 들리는지 등은 사용자가 결정합니다. 당신의 역할은 모든 문제를 측정 가능하게 만들고 모든 수정을 빠르게 만드는 것입니다.
  • 첫 번째 패스가 최종 편집이 아닙니다. 단계별로 작업하고 각 단계 후 미리보기를 제공하며 수정을 기대하십시오. 대부분의 좋은 결과는 긴 자동 실행이 아닌 짧은 리뷰 루프에서 나옵니다.
  • 귀가 아닌 구성에 의한 동기화. 애니메이션과 사운드 효과는 동일한 타임라인 클록에서 트리거되며, 이 클록은 측정된 단어 시간에서 파생됩니다. 이렇게 하면 청취 없이도 효과가 화면에 정확히 맞춰집니다.
  • 의도적으로 창의적이어야 합니다. 모든 시각적 요소는 시청자의 이해를 도와야 하며, 템플릿처럼 보여서는 안 됩니다. 아래 "크리에이티브 방향"을 참조하십시오.

경로

명령은 사용자의 프로젝트 폴더에서 실행됩니다. $SKILL은 이 파일이 있는 폴더입니다(예: ~/.claude/skills/video-edit). 셸에서 한 번 설정하십시오: SKILL=~/.claude/skills/video-edit.

첫 실행: 크리에이터 알아보기

~/.claude/video-edit/profile.md에서 크리에이터 프로필을 찾으십시오. 파일이 없으면 첫 번째 실행입니다. 짧은 메시지로 자신을 소개하고 다음을 함께 물어보십시오. 사용자는 일부를 건너뛸 수 있습니다.

  1. 화면 이름: 로워 서드와 엔드 스크린용 이름과 한 줄 역할.
  2. 채널: 채널 이름, 플랫폼(YouTube, Instagram, TikTok…), 비디오에서 사용하는 언어, 화면에 두 번째 언어를 표시할지 여부.
  3. 색상: 선호하는 색상(액센트 하나와 지원 색상 하나 또는 둘)과 절대 사용하지 않을 색상. 썸네일이나 브랜드 페이지도 답변으로 사용 가능.
  4. 로고: 로고 파일(SVG 또는 투명 PNG)과 표시될 위치: 로워 서드, 엔드 스크린 또는 없음.
  5. 폰트: 브랜드 폰트 또는 기본 폰트.
  6. 일반 비디오 유형: 교육, 토크, 튜토리얼, 쇼츠 및 선호하는 모션의 차분함 또는 활기참 정도.
  7. 사운드: 사운드 효과 없음, 효과 표시 대상이 소리인 경우에만 사용 또는 전환 시 조용히 사용. 배경 음악 사용 여부.
  8. 비선호 사항: 싫어하는 것(글로우, 이탤릭, 이모지, 빠른 줌, 특정 색상 등).

답변을 ~/.claude/video-edit/profile.md에 저장하고(reference/profile.md 형식 사용) 로고를 ~/.claude/video-edit/brand/에 복사하십시오. 저장된 프로필을 몇 줄로 보여주고 올바른지 확인하십시오.

그 이후:

  • 모든 프로젝트 시작 시 프로필을 읽고 다시 묻지 않고 적용하십시오: 액센트와 지원 색상은 장면 CSS 변수에, 이름과 로고는 로워 서드와 엔드 스크린에, 사운드와 모션 기본값은 계획에 포함됩니다.
  • 영구 규칙을 기억하십시오. 사용자가 모든 비디오에 적용되는 규칙("전환에 사운드 없음", "항상 4K와 480p로 제공", "내 악센트는 이제 초록색")을 주면, 즉시 날짜와 함께 프로필의 "영구 규칙"에 추가하고 추가했다고 말하십시오. 특정 비디오에만 적용되는 규칙은 해당 프로젝트의 work/NOTES.md에 저장하십시오. 확실하지 않으면 물어보십시오.
  • 프로필은 개인 정보입니다. 사용자의 홈 폴더에 있습니다. 공유되는 프로젝트나 리포지토리에 절대 복사하지 마십시오.

모든 프로젝트: 질문

프로젝트당 한 번씩 질문하고 답변을 work/NOTES.md에 보관하십시오. 프로필이 이미 답변하는 내용은 건너뛰십시오.

  1. 비디오 유형: 교육 / 설명, 토크(토킹헤드), 화면 녹화 튜토리얼 또는 쇼츠(세로, 60초 미만). 이는 모션 레벨을 설정합니다(아래 표 참조).
  2. 원본 자료: 어떤 클립, 어떤 순서로, 따라야 할 스크립트나 개요가 있는지.
  3. 화면 언어: 프로필에서 가져오며, 이 비디오가 다른 경우에만 다시 질문.
  4. 사운드 효과: 프로필에서 가져옵니다. 프로필이 없으면 기본값은 전환 시 효과 없음, 효과는 주제가 소리인 경우에만 사용.
  5. 전달 사항: 해상도(1080p / 1440p / 4K), 자막 및 언어, YouTube 챕터 목록, 마감일.

비디오 유형

유형모션사운드 효과컷
교육 / 설명차분하고 진지함. 깔끔한 다이어그램, 읽기 쉬운 패널, 느린 카메라 움직임. three.js는 무언가를 설명할 때만 사용(가르치는 대상의 3D 모델).없음 또는 매우 조용한 전환자연스러운 속도
토크 (토킹헤드)화면에 오래 머무는 소수의 카드, 빈 공간에 배치, 얼굴 위에는 절대 배치하지 않음.조용한 챕터 전환만자연스럽거나 빡빡하게
튜토리얼 / 화면 녹화논의 중인 화면 부분으로 줌, 하이라이트 상자, 단계 카드.선택적 소프트 클릭 하이라이트자연스럽게
쇼츠더 활기참: 더 빠른 등장, 더 큰 글꼴, 처음 2초 내에 후크, 자막 켜짐. 여전히 부드럽고 절대 지저분하지 않음.허용되지만 목소리보다 작게빡빡하게

사용자가 지정하지 않으면 대본에서 유형을 추론하고 확인하십시오. 교육용 비디오를 과도하게 애니메이션하지 말고 쇼츠를 느리게 만들지 마십시오.

크리에이티브 방향

의도적으로 창의적이어야 합니다. 좋은 편집은 발표자 혼자서 할 수 있는 것보다 주제를 더 잘 설명하며, 동일한 카드가 반복해서 붙여넣기된 것처럼 보여서는 안 됩니다.

  • 장식이 아닌 설명. 모든 비트에 대해 질문: 이 개념을 처음 접하는 사람에게 무엇을 이해시킬 수 있을까? 추상적인 아이디어를 그리십시오("모델에 많은 데이터가 필요하다"는 다양한 얼굴이 스캔되고 레이블링되는 장면을 보여줌). 많은 시청자가 모를 수 있는 도구, 언어 또는 용어가 언급되면 작은 상자(이름, 종류(언어, 도구, 모델, 개념), 한 문장 설명)를 표시하십시오.
  • 실제 자료를 사용하십시오. 비디오 자체의 측정 데이터(말하는 문장의 파형, 실제 음량 수치), 사용자가 가진 실제 스크린샷과 화면 녹화, 실제 전후 비교. 실제 증거가 가상의 예시보다 항상 낫습니다. 비트에 필요하면 사용자에게 스크린샷을 요청하십시오.
  • 실수를 정직하게 보여주십시오. 비디오가 잘못된 것에 대해 이야기할 때 실제 스크린샷, 주어진 메모 및 수정된 버전을 나란히 보여주십시오.
  • 형태를 다양화하십시오. 키워드 카드, 각 항목이 언급될 때마다 커지는 목록, 카운터, 복잡한 아이디어를 위한 전체 화면 보드, 화면 확대, 다른 비디오의 프레임 인서트를 번갈아 사용하십시오. 내용에 맞는 형태를 선택하고 마지막에 사용한 형태를 고집하지 마십시오.
  • 한 번에 하나의 아이디어, 차분한 모션. 창의적이라고 해서 복잡해지는 것은 아닙니다. 비디오 유형과 프로필의 모션 레벨을 유지하십시오.
  • 큰 요소는 먼저 제안하십시오. 전체 화면 보드, 몽타주 또는 3D 장면을 구축하기 전에 두 줄로 설명하고 사용자의 승인을 받으십시오.

워크플로

이 순서대로 작업하십시오. 각 번호 단계 후 중단하고 미리보기 URL 또는 파일과 함께 결정한 내용과 그 이유에 대한 짧은 목록을 전달하십시오.

0. 프로젝트 레이아웃

project/
  src/            원본 클립 (또는 심볼릭 링크)
  work/           생성된 모든 파일: wav, 대본, program.json, proxy.mp4, sfx/, NOTES.md, 백업
  scene/          모션 그래픽 페이지 (이 스킬의 template/에서 복사)
  out/            렌더링 및 최종 파일

가능하면 클라우드 동기화 폴더(iCloud Desktop, Dropbox) 외부에 프로젝트를 유지하십시오. 동기화된 파일은 렌더링 중간에 디스크에서 제거되어 읽기가 중단될 수 있습니다.

1. 전사

python3 $SKILL/scripts/transcribe.py --project . src/*.mov --lang en

이 명령은 각 클립을 일시 정지 지점에서 분할하고 각 짧은 청크를 (침묵으로 패딩하여) 별도로 전사하며, 번호가 매겨진 발화와 단어 시간을 포함한 work/transcripts/<clip>.json + .txt 파일을 작성합니다. 전체 파일을 전사하면 재촬영(리테이크)이 숨겨집니다: Whisper는 반복되는 문장을 병합하고 반복되는 단어를 삭제합니다. reference/audio.md를 참조하십시오.

그런 다음 .txt 파일을 직접 읽으십시오. 재촬영, 잘못된 시작, 반쪽 문장, 필러 단어를 표시하십시오. 발표자는 종종 문장을 두세 번 반복합니다. 사용자가 달리 말하지 않는 한 마지막 유창한 테이크를 유지하십시오.

2. 러프 컷

work/edl.json 작성(형식은 reference/edl.md 참조): 스크립트 순서에 따라 유지할 발화와 챕터 마커. 그런 다음:

python3 $SKILL/scripts/cuts.py --project .          # edl.json -> work/program.json (실제 단어 경계에 스냅된 컷 포인트)
python3 $SKILL/scripts/build.py --project . audio video   # -> work/prog.wav + work/proxy.mp4 (1080p 미리보기)
python3 $SKILL/scripts/verify.py --project .        # 모든 조인을 다시 전사하고 잘린 단어와 남은 반복을 플래그 지정

verify.py가 플래그 지정한 내용을 수정하고, 다시 빌드한 후에만 사용자에게 전달하십시오. 새 길이와 수행된 컷 수를 사용자에게 알리십시오.

3. 리뷰 루프

  • 사용자가 타임스탬프를 제공합니다. 시계가 아닌 내용으로 매핑하십시오. 사용자의 탭이 이전 빌드를 보여줄 수 있습니다. 사용자가 의미한다고 생각하는 문장을 인용하고 확실하지 않으면 확인하십시오. 시간이 일치하지 않으면 인용된 단어에 대해 대본을 검색하십시오.
  • 새 버전 전에 항상 work/edl.json과 work/program.json을 work/backup/vN/에 복사하십시오. 사용자가 "모두 실행 취소"라고 말하면 정확히 복원하고 재해석하지 마십시오.
  • 사용자가 보고 있는 동안 work/proxy.mp4를 절대 교체하지 마십시오. 새 파일을 작성하고 준비가 완료되면 알리십시오.
  • 사용자가 만족하지 않을 때는 한 번에 하나씩만 변경하십시오. 깨진 미리보기는 사람들이 전체 수정을 신뢰하지 못하게 만듭니다.

4. 챕터

시계가 아닌 의미에 따라 비디오를 챕터로 분할하십시오:

  • 실제 주제 변경당 하나의 챕터, 시청자가 이해해야 하는 순서대로. 스크립트가 있는 경우 스크립트의 섹션을 따르십시오.
  • 1015분 비디오의 경우 일반적으로 510개의 주요 챕터, 각각 최소 약 45초. 짧은 하위 주제는 자체 챕터가 아닌 칩 변경으로 챕터 내에 유지하십시오.
  • 각 챕터 제목은 시청자가 얻는 내용으로 지정하십시오("AI가 잘못된 부분"), 모호한 레이블("파트 3")은 피하십시오. 한눈에 읽을 수 있을 정도로 짧게.
  • YouTube 규칙: 첫 번째 챕터는 0:00에서 시작, 오름차순으로 최소 3개 챕터, 각각 최소 10초, 콜론으로 타임스탬프 작성(0:51(올바름), 0.51(틀림)), 설명에 작성(댓글 아님). 규칙을 위반하는 챕터는 자동으로 실패합니다.

각 챕터가 시작되는 이유에 대한 한 줄 설명과 함께 목록을 제안하십시오. 승인 후 EDL에 {"chapter": "..."} 항목을 추가하십시오. cuts.py는 YouTube 챕터 목록(0:00 소개 …)을 출력하고 work/chapters.txt를 작성합니다. 화면상의 베일과 YouTube 목록은 동일한 시간을 사용합니다.

화면상의 챕터 전환은 전체 프레임 베일입니다(reference/style.md, 섹션 9 참조): 챕터 번호, 제목, 진행 표시줄. 각 챕터 전에 클립 자체의 룸 톤 0.3~0.6초를 넣어 베일이 마지막 단어를 가로지르지 않도록 하십시오.

5. 그래픽, 범위별로

템플릿을 프로젝트에 복사하고(cp -R $SKILL/template scene), 프로젝트를 서빙하고 장면을 여십시오. ?demo는 템플릿 자체의 데모를 표시합니다. 없으면 장면은 work/program.json을 로드하고 work/proxy.mp4를 재생합니다:

python3 $SKILL/scripts/serve.py --project . --port 5600     # http://127.0.0.1:5600/scene/

한 번에 전체 비디오가 아닌 하나의 챕터 또는 시간 범위씩 작업하십시오. 각 범위에 대해:

  1. 비트를 나열하십시오: 보여줄 가치가 있는 몇 가지 내용(숫자, 단계, 비교, 핵심 아이디어, 출처). 내레이션을 화면에 올리지 마십시오. 카드는 자막이 아닙니다. 카드는 음성이 전달할 수 없는 것(구조, 데이터, 그림)을 전달합니다. 위의 크리에이티브 방향을 사용하십시오.
  2. at('phrase')를 사용하여 각 비트를 음성 단어에 고정하십시오. 요소는 해당 단어가 말해질 때(약 0.1초 전) 나타나고 문장이 끝난 후에만 사라집니다. at()은 첫 번째 일치 항목을 반환합니다. 구문이 두 번 이상 말해지면 { from: sectionStart }를 전달하십시오. 음성의 숫자는 타임스탬프일 수 있습니다("제로 에이틴"은 비디오의 0:18을 의미하며 0.18초가 아님). 그리기 전에 컨텍스트를 확인하십시오.
  3. 전환 배치(reference/style.md, 섹션 9): 각 챕터에 베일, 화면이 점프하는 곳에 블러 딥, 컷이 전체 구간을 제거하는 곳에 어두운 블러 딥. 일반 컷에는 아무것도 없음.
  4. ?t=SECONDS가 비트에서 멈추는지 확인한 후 URL을 전달하십시오. 항상 ?t=0도 확인하십시오: 첫 번째 프레임은 YouTube와 대부분의 플레이어가 재생 전에 표시하는 것이므로 나중에 속하는 내용이 거기 표시되어서는 안 됩니다.

재컷 후에는 단어가 아닌 소스 순간에 연결된 모든 시간을 다시 확인하십시오: 잘려나간 소스 시간은 더 이상 프로그램에 존재하지 않습니다.

모든 프레임에 적용되는 규칙은 reference/style.md에 있습니다. 각 핸드오버 전에 레이아웃 감사를 실행하십시오:

node $SKILL/scripts/audit.mjs http://127.0.0.1:5600/scene/ --every 0.5

6. 사운드 효과 (원하는 경우에만)

프로필을 따르십시오. 프로필이 없으면 전환에 사운드를 넣지 말고, 소리가 주제인 경우(주어진 레벨에서의 우슉 소리, 설명 중인 버튼의 클릭 소리)에 효과를 사용하십시오. 라이브러리를 생성한 다음 장면의 타임라인에서 cue(t, 'whoosh')로 효과를 큐잉하십시오:

python3 $SKILL/scripts/sfx.py lib --out scene/sfx            # --gain -3 모든 효과를 3dB 낮춤

레벨과 규칙은 reference/audio.md에 있습니다. 레벨에 대한 사용자의 첫 반응이 결정적입니다: "들을 수 없어" 또는 "너무 커"라고 말하면 레벨을 작은 단계로 변경하고 나머지 비디오에 대해 해당 답변을 기억하십시오.

7. 최종 렌더링 및 믹스

python3 $SKILL/scripts/build.py --project . video --final           # 원본 해상도 프로그램 비디오 (렌더링 배경)
node $SKILL/scripts/render.mjs "http://127.0.0.1:5600/scene/?src=../work/prog-final.mp4" --out out/frames --workers 4 --dpr 2
python3 $SKILL/scripts/mix.py --project . --video out/frames --out out/FINAL.mp4
python3 $SKILL/scripts/loudness.py out/FINAL.mp4

사용자가 미리보기를 승인한 후에만 긴 최종 렌더링을 시작하십시오. 디스크 공간을 확보하기 위해 무언가를 삭제하기 전에 물어보십시오.

파일과 함께 짧은 보고서(길이, 해상도, 적용된 음량, 챕터 목록)를 전달하십시오.

관련 스킬