Community코딩 & 개발github.com

/bb:edit

원본 영상을 유료 광고 및 오가닉 릴스로 편집하여 9:16 및 4:5 마스터 파일을 완성합니다. ffmpeg를 사용하며, 편집 전에 질문을 하고, 모든 클립을 듣고, 세 권의 편집 서적을 참고하여 각 비트를 계획한 후 옵션을 보여주고, 러프 컷에 대해 별도의 비평가 패스를 실행합니다.

bb:edit란 무엇인가요?

`/bb:edit`는 원본 영상을 15~60초 분량의 짧은 비디오(릴스, 유료 광고, 오가닉 콘텐츠)로 완전히 편집해주는 AI 에이전트 기술입니다. 9:16(세로) 및 4:5(피드) 마스터를 제작하며, 전문 편집 워크플로우를 따릅니다. 먼저 사용자에게 영상의 목적과 대상을 질문하여 맥락을 파악한 후, 모든 클립을 전사하고 음악의 비트를 분석합니다. Murch, Pearlman, Block의 편집 이론을 기반으로 한 네 가지 비트(훅, 전환, 페이오프, 클로즈) 계획을 세우고, 사용자에게 3가지 옵션을 제시합니다. 러프 컷 후에는 별도의 AI 비평가가 객관적으로 평가하여 최대 3개의 수정 사항을 제시합니다. 모든 과정은 명확한 근거와 함께 문서화되며, 주장이나 아이디어를 임의로 변경할 수 없습니다. 이 도구는 ffmpeg, whisper, CoreText 등을 사용하는 macOS 환경에서 작동하며, 사용자(Britherbird 팀 구성원)가 직접 의사 결정을 내리는 것을 돕습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/tianbester-ZA/butcherbird-skills/tree/main/plugins/bb/skills/edit

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

문서

bb:edit은(는) 무엇을 하나요?

목표

원본 영상을 낯선 사람이 멈춰서 보고, 무언가를 느끼고, 행동으로 옮기는 짧은 비디오로 만듭니다: 1080x1920 마스터와 적절한 1080x1350 피드 마스터, 둘 다 약 -14 LUFS, 그리고 각 컷이 왜 그 자리에 있는지 설명하는 편집 계획을 포함합니다.

시작하기 전에: 이 Mac 확인

python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --data "${CLAUDE_PLUGIN_DATA}"

각 도구에 대한 상태 한 줄과 정확한 수정 방법을 출력하고, 마지막에 READY 또는 NOT READY를 표시합니다. 다시 실행해도 안전하며, 모든 것이 준비되면 몇 초 안에 완료됩니다. 첫 번째 실행은 Python 도구를 빌드하는 데 몇 분이 걸립니다.

NOT READY 상태인 경우, 사용자에게 수정 명령어를 알려주고 중단합니다. 모델만 누락된 경우 약 490MB이며, 사용자가 동의하면 같은 명령어에 --download-models를 추가하라고 알립니다. OPTIONAL 줄은 아무것도 차단하지 않습니다.

그 다음: 무엇을 하려는지 질문

이 명령을 실행하는 사람이 맥락을 가지고 있으며, 그들이 여기서 말하는 것이 작업의 질을 결정합니다. 우리의 광고 중 하나는 아무것도 묻지 않아서 실패했습니다. 어떤 릴스는 누군가 실제 맥락을 제공해서 성공했습니다.

먼저 무엇이 있는지(영상, 스크립트, 브리프, 노트) 살펴보고 다시 설명하여 사용자가 다시 입력하는 대신 확인하도록 합니다. 한 라운드로 짧게 질문하십시오(준비되면 AskUserQuestion, 그렇지 않으면 메시지로).

항상 먼저 질문하십시오. 단, 사용자가 이미 알려주지 않은 경우에만.

  1. 우리가 무엇을 하려고 하며, 어떤 종류의 비디오인가요? 인지도 비디오, 쇼케이스 릴스, 무언가를 판매하는 유료 광고, UGC 또는 창립자 토크, 비하인드, 다른 것?

그런 다음 누락된 것만 질문:

  1. 누구를 위한 것이며, 시청자가 본 후에 무엇을 느끼거나 행동해야 하나요?
  2. 어떤 스타일인가요? 어떤 레퍼런스가 가장 가깝나요? 실제 영상에서 옵션을 보여드리겠습니다.
  3. 영상, 사운드 또는 음악, 길이, 그리고 어디에 게시되나요?

광고인 경우, 스크립트의 구매자와 단계가 이어지거나 /bb:script가 먼저 실행됩니다. 편집은 아이디어나 주장을 바꾸지 않습니다. 그런 경우 스크립트로 돌아갑니다.

답변을 job/brief.md에 저장한 후 끝까지 작업합니다. 유일한 다른 중단점은 2단계의 옵션입니다. 사용자가 모든 것을 제공했거나 그냥 진행하라고 하면 묻지 마십시오. 아무도 대답할 수 없는 경우(무인 실행), 물었을 질문을 말하고 합리적인 해석을 적용합니다.

취향은 작업에 속함

질문 1이 작업을 설정합니다: job/brief.md의 첫 줄에 작성합니다. 어떤 비디오에서 좋았던 것이 다른 비디오로 이어지지 않습니다. 오가닉 릴스와 광고는 다른 작업입니다: 광고는 판매하기 위한 것입니다. 따라서 광고는 대상, 제품의 판매 포인트, 증거 및 구매 이유로 판단되며, 오가닉 작업의 농담이나 느낌이 아닙니다. 오가닉 컷의 교훈은 광고에 적용되지 않으며, 그 반대도 마찬가지입니다.

이유

일반적인 AI 편집은 모든 음악 비트에 맞춰 자르고, 모든 샷에 같은 길이를 주고, 모든 것을 확대하고, 마지막 단어가 끝나는 순간 멈춥니다. 이러한 각각은 여기서 거부되었습니다(lessons.md 참조). 편집 서적은 동일한 질문에 더 잘 답하므로, 결정마다 질문합니다: Murch는 생각이 끝나는 지점, Pearlman은 리듬과 열린 질문, Block은 시선이 가는 곳. 서적은 질문과 구절이며, 목소리가 아닙니다.

좋은 것의 기준

  • 프레임 0은 소리를 꺼도 이미 스틸로 작동합니다: 제품, 결과 또는 놀라움, 로고나 인사말이 아닙니다.
  • 하나의 질문이 훅에서 열리고 페이오프까지 열려 있습니다.
  • 컷은 그리드가 아닌 생각이나 움직임이 끝나는 지점에 위치합니다. 최소한 하나의 샷은 더 빠른 샷들 옆에 유지되어 의도적인 멈춤으로 읽힙니다.
  • 각 샷에서 가장 밝거나 움직이는 것이 봐야 할 대상입니다. 텍스트는 턱 아래나 깨끗한 하늘에 위치하며, 입 위에 절대 놓이지 않고, 같은 단어를 말하는 다른 줄과 절대 겹치지 않습니다.
  • 클로즈는 그 앞의 샷보다 차분하고 요청은 평범합니다. 엔딩이 제대로 끝납니다: 음악은 자체 엔딩이나 실제 구절에서 끝나며, 아직 진행 중인 노래 위에 페이드 아웃되지 않고, 자체 마지막 히트 위로 끝나지 않습니다.
  • 실제 소리가 포함됩니다. 영상 속 사람들은 음악 위에서 들리며, 노래의 가장 큰 순간은 화면의 가장 큰 순간에 맞춰집니다.
  • 영상은 촬영된 그대로 보입니다: iPhone의 자체 색상, 고정 프레이밍, 제품에만 약간 확대, 움직이는 줌 없음, 미러 필 없음, 검은 띠 없음.
  • 4:5는 동일한 EDL에서 다시 레이아웃되므로 캡션과 얼굴이 프레임 안에 남습니다.

명령어

참조 파일은 이를 짧게 작성합니다. 셸 상태는 명령어 간에 유지되지 않으므로 항상 전체 형식을 사용하고, 비평가 에이전트에게도 전체 형식을 제공하십시오.

  • PY는 "${CLAUDE_PLUGIN_DATA}/venv/bin/python"을 의미하며, setup이 빌드한 Python입니다. 여기서 모든 Python 스크립트를 실행하십시오.
  • scripts/...는 ${CLAUDE_SKILL_DIR}/scripts/...를 의미합니다. references/...는 ${CLAUDE_SKILL_DIR}/references/...를 의미합니다.
  • search.py는 python3 "${CLAUDE_PLUGIN_ROOT}/skills/books/scripts/search.py"를 의미합니다.

워크플로우

작업 폴더: 사용자가 있는 폴더의 <client>-<job>/ 또는 브리프가 명명한 폴더(job/). 영상은 원래 위치에 그대로 두고, 렌더링된 결과만 작성됩니다.

  1. 읽고, 듣기. 계획을 세우기 전에 PY scripts/listen.py clips <footage> --out job/sound를 실행하십시오: 모든 클립을 전사하고 말, 웃음, 외침 및 레벨 피크를 찾습니다. 모두 읽으십시오. 카메라 밖의 대사는 종종 아이디어이며, 샷이 실제로 무엇인지 알려줍니다(한 광고의 "application" 샷은 감독이 "아무것도 적용할 필요 없어"라고 말한 것이었습니다). PY scripts/listen.py song <track>도 실행하고 가사를 읽으십시오: 화면과 싸울 수도 있고 도울 수도 있습니다. 그런 다음 클라이언트 노트, lessons.md, 클라이언트의 과거 편집 폴더(해당 클라이언트만, examples/README.md 참조), 스크립트 또는 브리프를 읽습니다. scripts/probe.sh <footage> > job/footage-log.md를 실행한 다음 클립을 보고 타임코드별로 최고의 순간을 추가합니다. 다른 작업보다 먼저 scripts/proxies.sh로 HDR을 변환합니다. 다른 사람이 작성한 영상 로그는 사실이 아닌 단서입니다: EDL에 넣기 전에 모든 선택 항목의 프레임을 확인하십시오(scripts/sheet.sh <clip> <start> <len> job/sheets를 사용하여 영상 옆에 아무것도 기록되지 않도록 함). 스크립트 또는 브리프가 만드는 각 주장을 해당 주장을 보여주는 클립 순간과 나열하십시오. 클립이 보여주지 않는 주장은 지금 변경하거나 삭제하며, 비평가가 아닙니다. 분위기를 한 줄로, 사용자의 말로 작성하십시오.
  2. 계획. references/plan.md, rhythm.md, eye.md, sound.md를 로드합니다. PY scripts/beats.py <track>으로 음악을 측정합니다: 템포, 첫 번째 비트 및 음량 맵. 이는 music.start를 위해 트랙이 이미 움직이는 위치를 보여줍니다. 비트(훅, 전환, 페이오프, 클로즈)당: 느낌, 리듬, 시선이 가는 곳, 사운드. 열당 한 번씩 검색합니다. job/plan.md를 작성하고, 각 줄에 구절 ID를 포함합니다.
  3. 옵션. 섹션당 약 세 가지 처리 방법(캐주얼, 중간, 극단)을 타일로 제공합니다: 각각 하나의 프레임과 한 줄. 사용자가 선택합니다. 사용자가 없거나 그냥 진행하라고 하면 선택하고, 그 이유를 options.md에 기록하고, 다른 옵션을 계속 볼 수 있도록 합니다. 여기서는 옵션 표만으로 충분합니다.
  4. 러프 컷. references/formats.md를 로드합니다. job/edl.json을 작성한 다음, mix.py(사운드)와 cut.py --draft를 프록시에서 실행합니다. 결과에 대해 scripts/sheet.sh를 실행하고, 결과에 대해 listen.py cut을 실행하고, 보고서와 그 파형 그림을 읽습니다. 직접 시트, 훅 스트립 및 프레임 0을 살펴보고, 소리를 끄고 한 번 시청합니다.
  5. 비평가. 새로운 에이전트가 job/brief.md(작업에 대해 판단), 전체 크기의 프레임 0, 프레임, 스트립, 듣기 보고서, 믹스 로그, 주장 목록, references/critic.md 및 전체 search.py 명령을 받습니다. 프레임 0이 먼저 옵니다. 썸네일이 잘못 읽을 수 있기 때문입니다. 귀하의 노트나 이 채팅은 아닙니다. 비트별 노트, 최대 3개의 수정 사항(구절 ID 포함) 및 평결을 반환합니다.
  6. 최종. 비평가가 찾은 문제를 수정하거나(또는 브리프가 이기는 이유를 기록)합니다. EDL을 전체 품질 SDR 파일로 지정하고, --draft 없이 렌더링한 다음, 4:5를 위해 reframe.py를 실행하고, 결과에 대해 check_cut.py와 listen.py cut을 실행합니다. 모든 FAIL을 수정하고 모든 WARN을 읽습니다. 아무도 듣지 못했다고 분명히 말하십시오: 보고서는 측정할 뿐 듣지 않으므로, 음성 라인과 믹스는 사용자의 귀에 맡깁니다. 두 마스터의 시트. formats.md에 설명된 대로 README.txt 및 전달.

두 개의 파일, 프레임 0, 비평가 이후 변경된 사항에 대한 비트당 한 줄, 그리고 서적을 한 번 언급하는 한 문장으로 답변합니다. 인용은 plan.md에 남으며, 비디오에는 절대 표시되지 않습니다.

엄격한 제한

  • 변경된 주장이나 아이디어는 /bb:script로 돌아갑니다. 영상이나 사운드가 아이디어를 죽이면, 중단하고 비평가와 함께 진단과 스크립트를 다시 수행합니다. 컷 도중에 새로운 대사를 절대 바꾸지 마십시오. 우리의 광고 중 하나는 편집에서 대사를 바꾸고 출시되어 청중도 존재 이유도 없었습니다.
  • 드래프트 전에 항상 옵션을 제공합니다. 아무도 없으면 선택하고 기록합니다. 절대 건너뛰지 마십시오.
  • 음성 속도를 늦추거나 빠르게 하지 마십시오. cut.py는 속도가 1이 아닐 때 샷의 자체 오디오를 음소거합니다.
  • 노이즈 제거, 블러, 움직이는 줌, 미러 필, 검은 띠 없음. HDR은 먼저 avconvert로 SDR로 변환합니다. 토킹 헤드와 UGC에는 그레이딩 없음. 브리프가 요청할 때만 가벼운 룩(EDL의 look), 답변에서 명시적으로 언급.
  • 클립 사운드를 끄고 계획에 이유를 기록하지 않은 상태로 절대 출시하지 마십시오.
  • 샷은 발생한 것 이상을 증명하지 않습니다: 오디오가 연기되었다고 말하면 증거가 아닙니다.
  • 사용된 언어의 캡션, 중요한 모든 단어, 입 위에 절대 놓지 않으며, 콜아웃과 절대 겹치지 않음.
  • 주장, 가격 및 제안은 브리프나 클라이언트의 라이브 사이트에서 가져오며, 절대 임의로 만들지 않음.
  • 사용자의 승인 없이는 클라이언트에게 전송되거나 게시되거나 비용이 지출되지 않음. 클라이언트의 Drive로 전달하고 메시지는 사용자를 위해 초안 작성됩니다. 사용자가 보냅니다.

노하우

  • 텍스트: Homebrew의 ffmpeg에는 drawtext와 libass가 없으므로, 텍스트는 scripts/text_png.swift(CoreText, cut.py에 의해 한 번 컴파일됨)로 PNG로 그려지고 overlay로 배치됩니다. 글꼴은 assets/fonts/에 있습니다(Geist Black, Geist Bold, Playfair Display Italic). 클라이언트의 자체 글꼴은 경로로 EDL styles 블록에 들어갑니다.
  • Whisper는 영어이며 오프카메라 음성을 잘못 듣습니다. listen.py는 소형 영어 모델을 사용합니다. 캡션할 모든 줄은 프레임을 읽어 확인하십시오. 의심스러운 줄을 더 명확하게 읽으려면 setup.py --download-large가 더 큰 모델(1.6GB)을 추가하며, listen.py clips --large가 사용합니다.
  • 속도: 최종 렌더링은 1080p 소스에서 1080x1920으로 약 초당 35프레임으로 실행되며, 다른 인코딩이 실행되는 동안에도 마찬가지입니다. 30초 광고는 35분이 걸립니다. 러프 컷에는 --draft를 사용하십시오. 긴 렌더링은 백그라운드 작업으로 실행하십시오.
  • 비트 정렬 컷: beats.py는 파일에서 bpm과 offset을 측정합니다. 전체 트랙을 측정하십시오: 두 반쪽이 일치하는지 확인하며, 인트로의 짧은 창은 잘못된 펄스에 고정될 수 있습니다. 음악에 bpm과 offset(첫 번째 다운비트의 파일 내 초) 또는 beats 목록을 제공하십시오. 끝이 비트에 맞아야 하는 샷을 "snap": true로 표시하십시오. 기본값은 해당 샷만 스냅합니다. cut.py --beats는 현재 컷에 대한 그리드를 출력합니다. 모든 컷이 아닌 전환과 페이오프를 스냅하십시오: check_cut.py는 컷의 80% 이상이 비트에 있을 때 경고합니다.
  • 텍스트 타이밍: 텍스트를 절대 초 대신 샷에 연결하십시오("shot": 2, "at": 0.3, "dur": 1.2). 비트 스냅이 컷을 이동할 때 샷을 따릅니다.
  • 음량: 선형 모드에서 -14 LUFS로의 2패스 loudnorm, 그런 다음 샘플 속도의 4배에서 리미터. cut.py는 파일을 측정하고 AAC가 -1 dBTP를 초과하면 더 낮은 천장으로 다시 인코딩합니다. 음악은 기본적으로 클립 오디오보다 14dB 낮게 설정됩니다(샷이 자체 사운드를 유지하는 경우). music.gain_db로 변경하십시오.
  • 4:5: reframe.py는 각 샷을 9:16과 정확히 동일하게 프레임하고 샷당 1350행 창(y45, 기본값 285)을 사용합니다. 텍스트는 그림에서 그 위치를 유지하고 안쪽으로 40px 당겨집니다. 9:16 텍스트를 행 330과 1590 사이에 유지하면 4:5에 추가 작업이 필요하지 않습니다.
  • 안전 영역 (9:16): 전체 화면 카드를 제외하고 행 270 위 또는 1590 아래에는 아무것도 없습니다. 하단 12%는 Meta의 버튼입니다.
  • 시트: sheet.sh <video> [start] [len]는 40프레임 시트(옆에 .txt 파일에 시간), 훅(또는 모든 창)의 10fps 스트립 및 프레임 0을 작성합니다. 플래시 프레임은 시트가 아닌 스트립에 나타납니다.
  • 클립 끝: cut.py는 샷의 out이 그림의 마지막 프레임을 넘을 때 경고하고 해당 프레임을 유지하여 마스터가 오디오보다 짧아지지 않도록 합니다. 프리즈가 보이면 out을 당기십시오.
  • 핸드헬드 및 확대: x는 샷당 하나의 숫자이므로, 표류하는 핸드헬드 피사체가 창 밖으로 걸어 나가고 확대는 표류를 증가시킵니다. 프레이밍을 신뢰하기 전에 해당 샷의 창을 동작 중에 확인하십시오(sheet.sh <render> <shot start> <len>은 10fps 스트립을 제공합니다).
  • 단어 시간 표류: whisper의 단어당 시간은 최대 2초까지 차이가 날 수 있습니다. 대사가 들어가기 전에 슬라이스만 전사하십시오. 끝에서 단어가 손실되면 컷이 잘못된 것입니다.
  • 립싱크: 전화 복사본은 오디오를 약 0.1초 일찍 전달할 수 있습니다. 컷팅 전에 하나의 클립을 확인하십시오. 음성이 앞서면 그림의 in을 조정하고, 단어는 절대 조정하지 마십시오.
  • 책 검색: search.py "<리터럴 단어>" --job feel|rhythm|eye --book murch|pearlman|block --k 6, 그런 다음 --show <id>로 하나의 노트를 읽습니다. 리터럴 단어가 작동합니다. 질문은 작동하지 않습니다.

참조 (결정별 로드)

  • references/plan.md: 4비트 계획, 열당 한 줄, 열당 쿼리.
  • references/rhythm.md: 컷이 떨어지는 위치, 유지, 패턴 변경, 열린 질문.
  • references/eye.md: 시선이 가는 곳, 텍스트 배치, 안전 영역, 4:5 밴드.
  • references/sound.md: 듣기 단계, 음성, 음악, 효과, 음량, 엔딩.
  • references/critic.md: 루브릭, 비평가 에이전트만 로드.
  • references/formats.md: EDL 모양, 순서대로 스크립트, 출력물, 최종 파일 위치.
  • references/drawings.md: 브리프가 요청할 때 컷 위의 손으로 그린 애니메이션.

교훈

lessons.md는 실제 반응과 결과의 날짜가 적힌 줄을 보관합니다. 0단계에서 읽으십시오. 비평가는 최근 5개 항목에 대해 컷을 확인합니다. 이 폴더는 업데이트할 때마다 교체되므로, 클라이언트의 자체 교훈은 해당 클라이언트의 폴더에 들어가고, 모든 사람을 위한 교훈은 저장소를 통해 제공됩니다(CONTRIBUTING.md).

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

관련 스킬