클라이언트별 비디오 편집기
인간 편집자처럼 편집하기 위한 엔진 및 워크플로우: 자료 이해, 정밀한 컷, 클라이언트 룩 적용, 검증 및 전달. 엔진은 고유 스타일이 없습니다: 모든 시각적 요소는 clientes/<CLIENTE>/look.py에서 비롯됩니다.
SKILL_DIR = 이 스킬의 폴더. 도구: engine/reel.py, tools/{takes.py, words.py, media.sh}, 템플릿 templates/, 시작 룩 looks/.
요구사항 (처음에 확인하고 누락된 것 설치)
ffmpeg,python3,node/npx· macOS: HDR→SDR 변환 및 HEIC 사진 처리를 위해avconvert및sips(시스템에 기본 포함).- HyperFrames (렌더링 및 SFX 라이브러리):
npx hyperframes skills update general-video(media-use도 설치). - watch (비디오 시청/전사 및 Instagram/TikTok/YouTube 링크 다운로드(yt-dlp 사용)): github.com/bradautomates/claude-video 의
watch스킬, 로컬 WhisperX 엔진(무료):setup.py --engine local및--backend whisperx. - whisper CLI (검증 창):
uv tool install --python 3.12 openai-whisper --with setuptools. - MFA (단어 정렬 ±20 ms):
brew install --cask miniforge,conda create -n mfa -c conda-forge montreal-forced-aligner -y,conda run -n mfa mfa model download acoustic spanish_mfa및… dictionary spanish_mfa(다른 언어: 해당 모델).
폴더 구조 (작업 베이스, 예: ~/Documents/VIDEOS/)
clientes/<CLIENTE>/
├── estilo.md 클라이언트 가이드 (templates/estilo.md) — 편집 전 항상 읽음
├── look.py 엔진 옵션으로 변환된 스타일 (looks/nativo.py 또는 looks/datos.py에서)
├── refs/ 참조 비디오 + 프레임 시트 + 분석
├── marca/ 로고, 색상, 폰트, 자체 음악
└── proyectos/<AAAA-MM-DD_nombre>/
├── crudo/ 사용자 원본 자료 — 절대 수정하거나 삭제하지 않음
├── broll/ 보조 테이크 (선택 사항)
├── guion.md 스크립트 또는 노트 (선택 사항; 이 프로젝트에서는 estilo.md보다 우선)
├── trabajo/ media/ (변환됨), mfa/, gt/, 각 비디오별 config.py + takes.json 폴더
└── final/ 전달 파일만: <cliente>_<tema>_v1.mp4 · 수정사항 = v2, v3 (이전 버전 삭제 금지)
사용자가 폴더를 만들지 않음: "의 새 프로젝트, 자료는 <경로>에 있음"이라고 말하면 여기에 proyectos/<날짜_이름>/을 생성하고 원본을 이동합니다 (베이스 외부에 있고 사용자가 이동을 원하지 않는지 먼저 확인).
워크플로우
0 · 새 클라이언트 → 참조 분석 및 estilo.md 작성
- 참조 영상을
refs/에 다운로드/읽기 (watch로 링크 처리, yt-dlp 사용). 이상적으로 ~5개. - 각 참조에 대해 측정: 후크(처음 3초), 컷/분 (
ffmpeg -vf "select='gt(scene,0.3)',showinfo"→ 카운트), 자막(글꼴 또는 가장 유사한 무료 글꼴, 크기, 위치, 색상, 강조, 애니메이션), 색상/룩, 카드 및 애니메이션, 사운드(음악, SFX, 음성), 프레임, 구조, CTA. 프레임 시트:fps=16/dur,scale=270:480,tile=8x2. - ≥ 2개 참조에서 본 패턴만으로
estilo.md(템플릿) 작성; 측정된 것과 추론된 것 분리; 타사 문구나 브랜드 복사 금지. 참조가 모순되면 우선순위 질문. - 가장 가까운 시작 룩에서
look.py를 생성하고 가이드에 맞게 조정. 가이드 + 테스트 스틸을 보여주고 편집 전 승인 대기.
1 · 원본 자료 이해
estilo.md및guion.md읽기. 각 파일 테스트 (ffprobe: 길이, 회전,color_transfer).- 각 원본에 대해
WATCH_WHISPERX_LANGUAGE=es및--out-dir trabajo/watch옵션으로watch실행: 말한 내용, 유용한 테이크, 재테이크, 자르면 안 되는 부분. 이 전사본이 유일한 완전한 전사본: MFA에 재사용. - 스크립트와 교차 확인: 녹음되지 않았거나 즉흥적으로 변경된 스크립트 부분 → 사용자에게 알림.
- 음성 없는 여러 짧은 클립(이벤트): 클립별 프레임 시트, 주제별 분류 및 그룹화 제안 (주제별 비디오 + 낱개 + 일반 리캡) 후 편집.
2 · 미디어 준비
media.sh video <crudo> trabajo/media/<이름>.mp4 [vertical|horizontal]— HDR(iPhone/DJI)을 SDR로 단일 패스 변환, 키프레임 1초 간격, 30fps. 재압축 금지: 패스마다 디테일 손실.- 사진:
media.sh foto <foto> trabajo/media/<이름>.mp4 2.5. 정렬용 오디오:media.sh audio.
3 · 단어 정렬 (음성 비디오)
corpus/a.wav+corpus/a.txt(watch의 평문) →conda run -n mfa mfa align --clean <corpus 절대경로> spanish_mfa spanish_mfa <출력 절대경로>(절대 경로 필수; 실패 시;--beam없음).words.py textgrid … words.json및words.py show words.json.~가 있는 단어(> 1초)는 일시 중지 또는 재테이크를 숨김; 긴 텍스트 없는 간격은 watch가 전사하지 못한 재테이크일 수 있음. 격리 창으로 확인: 오디오 3~15초 자르기,whisper --model small --language es --word_timestamps True,words.py whisper … <오프셋>. MFA는 노이즈나 재테이크가 있는 곳에서 몇 초씩 벗어날 수 있음.
4 · 테이크 선택 → takes.json → takes.py
- 각 문장에 대해 최상의 테이크 (일반적으로 마지막 것) 선택; 재테이크, 잘못된 시작, 군더더기, 편집자 지시사항("이건 다른 비디오로 하고 싶어") 및 목표에 도움이 되지 않는 것 제거. 최대 길이 준수.
- 단어 시작 기준 스팬: (첫 번째 시작, 마지막 시작 + 0.2). 끝이 마지막 단어 시작보다 앞서면 잘림.
word_fix는 MFA가 잘못 배치한 단어 수정 (격리 창 시간 사용). - 텍스트:
phrases/words는 ASR이 잘못 들은 내용 수정 (이름, 브랜드: "Claude"는 "Klaus" 아님, "IA"는 "ella" 아님). python3 $SKILL_DIR/tools/takes.py trabajo/<video>/takes.json trabajo/<video>→ 길이 및 최종 텍스트 출력. 전체 텍스트 읽기: 마지막 단어 누락 또는 잘린 단어 없는지 확인.
5 · 비디오 조립
trabajo/<video>/:config.py(templates/config.py에서),media → ../media(심볼릭 링크),media.sh sfx trabajo/<video>, 최소hyperframes.json({"paths": {"assets": "assets"}}).edit(e)에서: 카드/POV/CTA, B-roll 및 사운드는 단어에 고정 (e.word_t(None, "palabra")). 가장자리 카드: 확대 시 얼굴 넓어짐. 3초마다 최소 하나의 가시 이벤트 (엔진이 부족 시 자동 펀치 추가).python3 $SKILL_DIR/engine/reel.py trabajo/<video>→npx hyperframes check trabajo/<video>(0 오류; "큰 파일 / 밀집 트랙 / 중첩" 경고는 이 엔진에서 정상).
6 · 렌더링 전 검토
npx hyperframes snapshot trabajo/<video> --at <t1,t2,…> --no-end -o <절대 경로>를 각 카드, 후크 및 CTA에서 실행. 확인: 얼굴 가리는 요소 없음, 텍스트 끊김 없음, 색상 정확, 자막 읽기 쉬움.- 사용자에게 스틸 보여주고 승인 대기 (스타일이 이미 승인되고 "렌더링"이라고 말한 경우 제외).
7 · 렌더링 및 전달
trabajo/<video>내에서npx hyperframes render --quality delivery -o …/raw.mp4실행 →media.sh final raw.mp4 final/<cliente>_<tema>_v1.mp4(−14 LUFS). 방금 생성된 중간raw.mp4만 삭제.watch --detail transcript로 확인: 전체 텍스트, 반복 없음. 시작 부분이 "누락"된 것 같으면 결론 내리기 전에 처음 3초를 whisper로 다시 확인 (전체 전사가 시작 부분을 생략하는 경우 있음).
교훈 (반복 금지)
- 변환되지 않은 HDR은 탁해 보임;
avconvert로 한 번만 변환. - 확대/축소가 있을 경우 4K로 녹화: 1080p를 13–22% 확대하면 부드럽게 보임. 클라이언트에게 알림.
- 더 많은 단어로 수정된 문장은 동일한 시간을 배분할 수 없음: 길이 0 자막이 붙어버림.
- 화면 텍스트의 이모지는 항상 렌더링되지 않음: 사용 자제.
snapshot -o상대 경로는 프로젝트 옆에 기록: 절대 경로 사용.- 비디오의 두 부분에서 동일한 파일 사용 →
takes.json에서 다른 키 사용 (고유 ID). - SFX 라이브러리를 저장소에 업로드하지 않음 (Pixabay의 media-use 라이선스):
media.sh sfx로 프로젝트별 복사. - 단일 비디오에 대한 클라이언트 수정 사항(예: "07번에서 사운드 없음")은
config.py에 작성 (SFX = {"card": null, "broll": null, "cut": null}및 카드의sfx: null),index.html편집 금지 (재구축 시 손실).