릴 편집하기
이것은 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.py | references/ejemplo-whatsapp.reel.json |
| 2 · 문구 | 아래쪽에 큰 흰색 문구 (오는 것, 반투명), 키워드는 알약 모양, 인라인 및 플로팅 아이콘, 약간의 흰색 카드 및 전체 화면 그래픽 샷. | build_frases.py | references/estilo-frases.md |
| 3 · 시네마 | 검은색 배경 위에 16:9 시네마 스트립의 가로 클립 (스트립 비움), 따뜻한 색상, 느린 줌, 얼굴 양쪽에 작은 소문자 자막, 마지막 단어는 큰 대문자. 가깝거나 감정적인 비디오용. | cut_cine.py + build_cine.py | references/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에 여전히 있는 경우).
음악
비디오에 음악을 넣지 마십시오. 사용자는 게시할 때 음악을 추가합니다.
[번역됨]