Communitygithub.com

Reel 편집 (editar-reel)

사용자의 릴(인스타그램용 수직 카메라 영상)을 승인된 워크플로우에 따라 편집합니다: Whisper를 이용한 로컬 자막 추출, 침묵/군말/반복 테이크 제거, 대문자 갈고리, 2-3초마다 애니메이션 그래픽이 있는 헤드라인, 실제 브랜드 로고, 한 줄 자막, 보정된 효과음, -14 LUFS 음성, HyperFrames 렌더링.

Reel 편집 (editar-reel)란 무엇인가요?

이 기술은 승인된 워크플로우에 따라 인스타그램 릴을 편집하는 AI 에이전트 스킬입니다. 사용자가 ‘편집’, ‘조립’, ‘자르기’, ‘자막 넣기’, 또는 ‘릴 준비 완료’를 요청할 때 실행됩니다. 이 스킬은 Whisper를 사용한 로컬 자막 추출, 필러 단어 및 침묵 제거, 반복 테이크 정리, 그래픽이 포함된 헤드라인 배치, 실제 브랜드 로고 표시, 한 줄 자막, 보정된 효과음, -14 LUFS 표준화된 오디오, 그리고 HyperFrames CLI를 이용한 최종 렌더링을 포함한 완전한 편집 파이프라인을 구현합니다. macOS에서 작동하며, HyperFrames CLI, faster-whisper, FFmpeg 같은 종속성이 필요합니다. 사용자 프로필과 승인된 스타일(스타일 1: 카드 스타일 헤드라인, 스타일 2: 문구 스타일, 스타일 3: 시네마 스타일)을 유지하며, 품질 보증 단계에서 골든 샘플과의 비교를 포함합니다. 이 스킬은 수동 편집의 필요성을 없애고, 모든 릴에 적용되는 일관된 고품질 출력을 보장하며, 내용과 타이밍에 대한 사용자 피드백에 따라 스타일을 조정할 수 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Alexandrevnc/editar-reel/tree/HEAD

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

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

문서

릴 편집하기

이것은 WhatsApp 릴(references/ejemplo-whatsapp.reel.json)로 이미 승인된 워크플로우입니다. 목표는 다음 릴이 다시 설명할 필요 없이 동일하게 나오도록 하는 것입니다: 같은 스타일, 같은 기준, 같은 검증. 사용자에게 스페인어로, 불필요한 기술 용어 없이 말하세요.

시작 전: 프로필 및 설치

~/.claude/skills/editar-reel/perfil.json을 읽으십시오 (사용자 이름, 브랜드, 클로징 로고 및 클립 저장 위치). 사용자 이름을 부르고 1단계에서 클립 폴더를 사용하십시오. perfil.json이 없거나, 환경의 어떤 도구가 누락된 경우, 이 Mac에서 처음입니다: 편집 전에 INSTALAR.md를 따르십시오 (모든 것을 설치하고 프로필 생성).

환경 (install.sh가 준비, INSTALAR.md 참조)

  • HyperFrames CLI: ~/.npm-global/bin/hyperframes (원격 측정 비활성화). 항상 PATH="$HOME/.npm-global/bin:$PATH" HYPERFRAMES_NO_TELEMETRY=1 HYPERFRAMES_SKIP_SKILLS=1을 내보내십시오; Claude 셸은 ~/.zshrc를 로드하지 않습니다.
  • faster-whisper: ~/.venvs/whisper/bin/python (av<16 포함; 새 PyAV 버전은 faster-whisper를 깨뜨림).
  • FFmpeg: /opt/homebrew/bin. 시스템 python3 (3.9)는 numpy가 없는 스크립트에 사용됩니다.
  • 효과음 라이브러리: ~/Movies/Reels/_sfx/. 원본 13개(whoosh_1/2, pop_1/2, tick, ding, message, counter, typing, clock, slide, hit, riser)는 그래픽과 함께 단독으로 재생됩니다. "Apple 사운드" 스타일: 짧고, 깨끗하고, 부드럽습니다. 수동으로 사용할 수 있는 ~45개 더 있음 (임팩트, whoosh, 금전등록기, 클릭, iPhone…): 카탈로그 및 각각 사용 시기는 references/sfx.md 참조.
  • 이 스킬의 스크립트: SK=~/.claude/skills/editar-reel/scripts.
  • 클로징 로고: perfil.json의 cierre. vinagre.tech 로고(벡터화)는 assets/vinagre-tech/에 있음; 다른 브랜드 로고는 assets/marca/에 저장됨 (INSTALAR.md 참조).

스타일

사용자는 스타일에 따라 릴을 요청합니다 ("스타일 2로 편집해 줘"). 아무 것도 말하지 않으면 스타일 1을 사용하십시오. 모든 스타일은 아래 워크플로우를 공유합니다 (자막 추출, 자르기, QA, 사운드, 마스터); 5-6단계가 변경됩니다. 모든 스타일은 브랜드 로고 클로징(perfil.json의 로고; 1.6초, 흰색 배경, scripts/outro.py)로 끝납니다: 비디오가 갑자기 끝나지 않습니다. 기본적으로 나옵니다 (perfil.json에 "cierre": null인 경우 제외); reel.json에서 "outro": null이면 제거, "outro": {"bg": "#000"}이면 변경됩니다.

스타일설명스크립트참조
1 · 카드2-3초마다 위쪽 어두운 카드에 헤드라인 그래픽 + 아래쪽 한 줄 작은 자막.build.pyreferences/ejemplo-whatsapp.reel.json
2 · 문구아래쪽에 큰 흰색 문구 (오는 것, 반투명), 키워드는 알약 모양, 인라인 및 플로팅 아이콘, 약간의 흰색 카드 및 전체 화면 그래픽 샷.build_frases.pyreferences/estilo-frases.md
3 · 시네마검은색 배경 위에 16:9 시네마 스트립의 가로 클립 (스트립 비움), 따뜻한 색상, 느린 줌, 얼굴 양쪽에 작은 소문자 자막, 마지막 단어는 큰 대문자. 가깝거나 감정적인 비디오용.cut_cine.py + build_cine.pyreferences/estilo-cine.md

모션 v2 (2026-11-02 승인, 스타일 1 기본값): references/motion-reglas.md 규칙 (헤드라인이 회전, 숫자가 한 자리씩 회전, 그래픽이 통째로 도착). 이전에 만들어진 릴은 reel.json에 "anim": 1이 있어서 수정이 이미 승인된 모션을 변경하지 않습니다.

스타일 1과 2는 전체 화면 모션 샷(Mac 터미널, 숫자가 있는 점 그리드, 카드 궤도)을 가질 수 있으며, reel.json의 "motion"에 있습니다: 언제, 어떻게 사용할지 references/motion.md를 읽으십시오.

사용자가 스타일 변경을 요청하고 승인하면, 해당 스타일의 스크립트와 시트에 저장하십시오. 새로운 것을 원하면, 승인된 스타일을 변경하는 대신 새 스타일(4, 5…)을 만드십시오. 전체 릴을 조립하기 전에 먼저 ~10초 샘플을 만드십시오 ("sample_end" in reel.json, 스타일 2 및 3).

각 릴의 구조

~/Movies/Reels/<short-name>/
  reel.json            이 릴의 내용 (당신이 작성; 형식은 references/reel-json.md)
  work/                자막, 컷, QA 프레임, 중간 렌더링
  proyecto/            HyperFrames 프로젝트 (생성된 index.html + assets/)
  reel-<name>.mp4      결과물
  portada-<name>.jpg   인스타그램 커버 (8b단계)

워크플로우

1. 클립 찾기

보통 perfil.json의 clips 폴더 (기본값 ~/Movies/CapCut/) 또는 하위 폴더에 있습니다. 후보가 여러 개이고 명확하지 않으면, 옵션을 묻습니다 (이름, 길이, 날짜); 잘못된 것을 편집하는 데는 많은 시간이 듭니다. ffprobe로 해상도, fps 및 길이를 확인하십시오.

2. 자막 추출

mkdir -p ~/Movies/Reels/<n>/work
~/.venvs/whisper/bin/python -I $SK/transcribe.py "<clip>" ~/Movies/Reels/<n>/work medium es

src.words.json (시간이 있는 단어), fillers.txt (Whisper가 "eh", "mmm", "o sea"를 쓰도록 강제하는 패스; 일반적으로 무시함) 및 silences.json을 만듭니다. 세 가지를 모두 읽으십시오.

3. 제거할 내용 결정 (당신의 판단)

  • 반복 테이크: 문장을 반복하거나 시작하고 자르면, 마지막 테이크를 유지하고 이전 것을 제거하십시오.
  • 군말: fillers.txt에 나타나고 깨끗한 것에 없는 것.
  • 침묵: 표시할 필요 없음; cut.py는 ≥0.2초를 제거하고 각 측면에 0.07초 공기를 남깁니다. 범위(원래 시간)를 reel.json의 remove에 source와 함께 기록하십시오. 아무것도 없으면, "remove": []를 입력하고 말하십시오 ("군말이나 반복 테이크가 없었습니다", 해당되는 경우: 확인했고, 가정하지 마십시오).
cd ~/Movies/Reels/<n> && hyperframes init proyecto --example blank --resolution portrait --non-interactive
python3 -I $SK/cut.py ~/Movies/Reels/<n>

HyperFrames 프로젝트를 만듭니다 (자르기 전: init는 proyecto 폴더가 존재하지 않아야 함) 그런 다음 자르고, 1080×1920, 30fps로 출력하고, 음성을 proyecto/assets/cut_norm.mp4에서 -14 LUFS로 남깁니다; 새 시간이 있는 단어는 work/cut.words.json에 남습니다.

4. 프레이밍 확인

프레임 스트립을 추출합니다 (ffmpeg -i proyecto/assets/cut_norm.mp4 -vf "fps=1/5,scale=270:-1,tile=6x1" -frames:v 1 work/contact.png) 그리고 얼굴을 찾습니다: 참조 릴에서는 세로로 5201160px, 오른쪽에 빈 벽이 있었습니다. 헤드라인은 머리 위(170~430px 카드), 자막은 셔츠 위 라펠 마이크 아래, 인트로 로고는 머리 옆 벽에 있습니다. 이 클립에 다른 프레이밍이 있으면, layout과 reel.json의 logos 위치를 조정하십시오.

5. reel.json에 콘텐츠 작성

references/reel-json.md와 references/graficos.md를 읽으십시오. 결정된 사항:

  • 갈고리 (0–2초): 대문자 두 줄, 노란색 상자에 검은색 텍스트. 비디오가 제기하는 고통을 요약하는 질문 또는 진술, 문자 그대로의 문장이 아님. 첫 프레임부터 보임.
  • 헤드라인: 2–5 단어, 2–3초마다 변경, 해당 섹션에서 말하는 내용 요약, 각각 애니메이션 그래픽 포함.
  • 로고: 도구나 브랜드를 언급할 때마다 실제 로고 (Simple Icons; 없는 경우, proyecto/assets/logos/<slug>.svg의 공식 PR 키트 SVG). 절대 가짜 또는 근사 로고 사용 금지.
  • 자막: 작게, 한 줄, 아래, 액센트 색상의 활성 단어. 보이는 Whisper 오류를 fixes에서 수정하십시오 (고유명사, "una gente" → "un agente" 등).
  • 모션 샷 (선택 사항, 릴당 1-2개): Claude에게 무언가를 요청하거나 자동화 단계를 설명할 때 → terminal; 숫자를 말할 때 → dots; 연간 손익을 계산할 때 → months; "내가 만든 모든 것을 봐" → orbit; 고객이 쓰거나 메시지가 올 때 → notify; 수익 또는 결과 수치를 말할 때 → chart. 원함: 비디오에 숨을 쉴 공간을 줍니다 (없으면 하나 제안). references/motion.md 참조. 말하는 내용을 설명하는 경우에만 제안하십시오; 의심되면 물어보십시오.
  • 최종 호출: 단어를 쓰거나 브랜드를 언급하도록 요청하면, "graphic": "logo"와 함께 마지막 블록, 그 단어를 말할 때 ding을 sfx_extra에 넣습니다.
  • 문자 그대로의 사운드 (선택 사항): 고유한 소리가 있는 것을 말할 때 (돈 → cash, 휴대폰 내려놓기 → iphone_lock, 메시지 쓰기 → phone_typing), 해당 단어의 sfx_extra에 추가하십시오. references/sfx.md 읽기; 10초당 최대 1-2개, 밈은 요청할 때만.

6. 사운드 준비 및 컴포지션 생성

python3 -I $SK/prep_sfx.py ~/Movies/Reels/_sfx ~/Movies/Reels/<n>/proyecto/assets/sfx
python3 -I $SK/build.py ~/Movies/Reels/<n>
cd ~/Movies/Reels/<n>/proyecto && hyperframes lint

prep_sfx는 각 사운드의 초기 침묵을 제거하고 (그렇지 않으면 애니메이션에 비해 늦게 재생됨), 긴 사운드를 페이드 아웃으로 자르고, 피크를 -3 dBFS로 정규화합니다. Riser는 최고점에서 끝나도록 잘립니다 (현재 파일의 0.2–2.0초); 파일이 변경되면 엔벨로프를 확인하고 SPEC을 조정하십시오. lint에서 예상되고 무시됨: nested_structure_needs_subcomposition 및 timeline_track_too_dense. 다른 유형의 오류 또는 경고는 수정됩니다.

7. 프레임 품질 관리 (렌더링 전, 항상)

각 블록 중간, 애니메이션이 완료된 후 프레임 하나를 추출합니다:

hyperframes snapshot --at <hanger≈1.0>,<each block: start+1.3>,... --no-end --describe false -o ../qa

시트에 배치 (ffmpeg -pattern_type glob -i 'qa/frame-*.png' -vf "scale=360:-1,tile=6x2" ...), 보고 의심스러운 영역을 확대합니다 (카드 및 자막의 실제 크기로 자르기). 다음을 찾아 수정하십시오:

  • 잘리거나 카드를 벗어나는 텍스트 / 한 줄에 단어 하나.
  • 얼굴 위에 무언가 있음 (모든 블록에서, 컷의 1.08 줌에서도).
  • 대비 부족 (흰 벽에 밝은 텍스트 → 어두운 배경 필요).
  • 자막이 라펠 마이크 또는 셔츠 로고를 추하게 가림.
  • 이해할 수 없거나 이상해 보이는 그래픽 (첫 번째 head에서 발생; 다시 만들어짐). 각 수정 후 스냅샷을 반복하십시오. 자막 앞으로 지나가는 손은 피할 수 없습니다; 결함이 아닙니다.

골드와 비교. references/oro/에는 각 스타일의 승인된 릴의 12프레임 시트가 있습니다 (estilo1-whatsapp, estilo1-18k, estilo2-fras, estilo3-reto40). 렌더링(8단계) 후 python3 -I $SK/hoja.py <reel>.mp4 work/hoja.png로 새 릴의 시트를 추출하고, 해당 스타일의 시트 옆에 놓고 답하십시오: 둘 중 어느 것이 더 비어 있고, 더 평평하고, 그래픽이 더 작습니까? 새 것이면, 그것이 가장 먼저 수정됩니다. 사용자가 자신의 스타일 골드보다 더 좋아 보이는 릴을 승인하면, 해당 시트를 references/oro/에 추가하십시오.

8. 렌더링, 오디오 확인 및 마스터링

hyperframes render --fps 30 -o ../work/render_mix.mp4
~/.venvs/whisper/bin/python -I $SK/measure_sfx.py ~/Movies/Reels/<n> ~/Movies/Reels/<n>/work/render_mix.mp4
python3 -I $SK/master.py ~/Movies/Reels/<n>/work/render_mix.mp4 ~/Movies/Reels/<n>/reel-<n>.mp4
  • measure_sfx는 각 효과가 음성에 비해 얼마나 크게 재생되는지 알려줍니다. 목표: hit -6 dB, ding -8, message ≈-8, pop/whoosh/slide -11 to -13, tick -14, clock/counter/riser -16, typing -18 to -20. 하나라도 >2 dB 벗어나면 (예: _sfx 파일이 변경된 경우), sfx_vol로 수정하고 다시 렌더링하십시오. 효과가 음성보다 더 크게 재생되는 것은 심각한 오류입니다: 말하는 내용을 가립니다.
  • master.py는 릴을 -14 LUFS (피크 -1.5 dB)로 가져오고 비디오는 건드리지 않고 복사합니다. HyperFrames 믹서가 믹스를 ~1.8 dB 낮추고 ~-16 LUFS로 남기기 때문에 필요합니다.
  • 결과물 확인: 1080×1920, 30fps, 예상 길이, -14 LUFS.

8b. 커버

python3 -I $SK/cover.py ~/Movies/Reels/<n>

비디오의 깨끗한 프레임, 노란색 상자의 갈고리, Instagram이 프로필 그리드(3:4)에 표시하는 스트립 중앙에 위치하여, 피드에서 각 비디오가 무엇에 관한 것인지 읽을 수 있습니다. portada-<n>.jpg와 work/portada-feed.png (잘렸을 때 어떻게 보일지)를 남깁니다. 제목과 함께 중앙에 위치 (2026-11-02 결정, 얼굴 일부를 가리더라도; 비디오에서 갈고리는 여전히 위, 머리 위에 있음). 확인하십시오: 프레임 ("cover": {"at"})은 좋은 얼굴 표정이 있고 아무것도 잘리지 않아야 합니다. "cover": {"y"} 또는 python3 -I $SK/cover.py <reel> 560은 다른 높이를 요청하는 경우에만. 사용자는 게시할 때 '커버 편집 → 갤러리에서 추가'로 업로드합니다.

9. 전달

.mp4와 커버 위치를 알려주고, 몇 줄로 요약하십시오: 얼마나 잘렸는지 (X초에서 Y초, 무엇이 제거되었는지), 갈고리, 헤드라인(또는 가장 대표적인 것), 어떤 로그가 나오는지, 어떤 자막 수정을 했는지, 품질 관리에서 무엇을 수정했는지. 논란의 여지가 있는 결정(예: 갈고리가 요약이고 문자 그대로의 문장이 아닌 경우)이 있으면 말하고 변경을 제안하십시오.

10. 정리 (사용자가 릴을 승인한 경우에만)

각 릴은 ~150MB의 중간 파일을 남기고 디스크가 부족한 경우가 많습니다. 릴이 괜찮다고 확인된 경우에만 (그 전에는 아님: 수정하는 동안 필요함), 재생 가능한 모든 것을 휴지통으로 이동 (~/.Trash/reel-<n>-intermedios-<date>/, 절대 rm: 복구 가능): work/*.mp4, work/*.mov, work/*.png, qa/, 폐기된 릴 버전, index.html가 더 이상 사용하지 않는 모든 assets/*.mp4, 그리고 index.html이 이름을 지정하지 않는 assets/sfx/*.wav (prep_sfx는 전체 라이브러리를 복사, ~15MB; 수정에 다른 사운드가 필요하면 다시 실행). 보존 reel.json, work/*.json, proyecto/ (assets/cut_norm.mp4 및 sfx/ 포함) 및 최종 .mp4: 이로 다시 자르지 않고 수정할 수 있습니다. 이동된 파일의 크기와 휴지통을 비우면 해제된다고 알려주십시오. 수정 시 cut_norm.mp4가 없으면 cut.py가 원본 클립에서 다시 생성합니다 (CapCut에 여전히 있는 경우).

음악

비디오에 음악을 넣지 마십시오. 사용자는 게시할 때 음악을 추가합니다.


[번역됨]

관련 스킬