모션 그래픽 편집 + 편집 인터페이스
사용자와 그들의 언어로 대화하세요. 자막은 화자의 정확한 단어로 작성하세요 (절대 의역하지 마세요).
경로: ME = 이 스킬 폴더, W = 비디오당 하나의 프로젝트 폴더. 모든 스크립트는 bash/python/node입니다. scripts/env.sh는 ffmpeg, node, python, Chrome 및 번들 엔진(engine/)을 찾습니다. 처음 사용 시: README.md → 설치 (npm install in the skill folder, pip install -r requirements.txt).
규칙 (협상 불가)
- 공식 로고만 사용하세요. 언급된 브랜드에 대해 다시 그린 "영감을 받은" 아이콘은 절대 사용하지 마세요. 브랜드 웹사이트에서 가져오거나(
capture_site.js) 사용자에게 요청하세요. - 브랜드 차터: 클라이언트의 경우, 웹사이트(
captures/info.json)에서 색상, 글꼴 및 로고를 읽고parts/top.js상단에 팔레트를 작성하세요. 사용자 자신의 비디오의 경우, 한 번 차터를 요청하고theme.json+top.js에 보관하세요. - 웹사이트 캡처: 클라이언트 사이트의 전체 페이지(데스크톱 + 모바일)를 캡처하고 패널(스크롤하는 브라우저, 자른 공식 일러스트레이션)에 사용하세요. 쿠키 배너는 숨기고, 절대 수락하지 마세요. 로그인된 제품 화면은 접근할 수 없습니다: 그렇게 말하고 사용자가 제공하는 스크린샷을 통합하겠다고 제안하세요.
- 리듬: 전체 화면 ↔ 패널 (축소 IN, 확대 OUT), 강한 단어에 펀치인 (~2-3초마다 1회), 정확히 하나의 시그니처 순간 (로고/이름 리빌), 배경 음악은 음성 아래로 덕킹, 음향 효과 (모든 줌에 우슈, 팝, 클릭, 타이핑, 리빌에 임팩트), 점프 컷에 라이트 플래시.
- 유료 광고: 상단 14%(y < 270) 및 y ≈ 1250(릴/틱톡 UI) 아래에는 중요한 내용을 배치하지 마세요. 자막 올림(
CAPDY), 패널 내부에는 자막 없음 (패널이 단어를 제목으로 표시함), 엔드 카드 = 브랜드 로고 + URL + 화자의 단어, 허위 주장이나 숫자 금지. - 자막은 절대 얼굴 위에 있지 않습니다. LTR 언어 →
projet.json에"sens": "ltr"(빌드가 단어 순서를 수정함), RTL(아랍어) →"rtl". 브랜드 이름은 알약 모양으로 (fx: "pill", 색상은projet.json → pill). - 믹싱: 사용자가 에디터에서 음성/음악/효과를 설정합니다. 기본값: 음성 100%, 음악 46%, 효과 36%. 항상 -14 LUFS로 라우드니스 노멀라이즈하세요.
- 모든 애니메이션은 레지스트리 ELEMENT입니다 (아래 참조). 사용자가 선택, 이동, 숨기기 및 댓글을 달 수 있습니다. 레지스트리 밖의 애니메이션은 없습니다.
- 앵커: 모든
wS(card, word)는 애니메이션이 설명하는 단어를 가리켜야 합니다.scripts/ancres.py를 실행하고 테이블을 읽으세요. 절대 인덱스를 추측하지 마세요.
워크플로우
- 준비:
bash $ME/scripts/preparer.sh <video> <W> <lang> "<Whisper 프롬프트: 고유 명사>"→ 소스 복사, 전체 프레임 크롭, 프레임, 예상 컷, 단어 수준 타임라인. 그런 다음 배경에서 인물 분리(~1초/프레임; Whisper와 동시에 실행하지 마세요 — RAM):python $ME/engine/mask.py u2net_human_seg <W> && python $ME/engine/make_head.py <W>. - 클라이언트 (있는 경우):
node $ME/scripts/capture_site.js <url> <W>→captures/,assets/logo-*.png, 색상/글꼴. 캡처를 살펴보고 유용한 시각 자료를W/assets/로 자르세요 (일러스트레이션, 스크롤러 브라우저용 긴 페이지). - 자막:
W/cartes.json작성 (정확한 단어 + Whisper 타이밍; 2-5단어 카드;hot,fx) →python $ME/scripts/cartes.py <W>. 템플릿:templates/cartes.EXAMPLE.json. - 편집 계획: 스크립트를 비트(훅, 문제, 제품, 증거, CTA…)로 나누고, 각각에 대해 전체 화면 또는 패널, 보여줄 구체적인 오브젝트, 하나의 시그니처 순간, 사운드를 선택하세요.
W/plan-montage.md작성 (템플릿templates/plan.EXAMPLE.md) 후 애니메이션 전에 사용자에게 간략히 보여주세요. - projet.json (템플릿
templates/projet.EXAMPLE.json):nom,titre,langue,sens,outro,vol,musique_gain,pill,coupes,cadrage(패널에 들어갈 샷 → 측정 창),cadrage_force(마스크가 배경을 잡을 경우). 그런 다음python $ME/scripts/framing.py <W>. - 씬 in
W/parts/:top.js←templates/top.EXAMPLE.js(팔레트,CUTS/SEGB,PANELS, 줌ZP,CAPDY);primitives.js←templates/primitives.js;gfx.js←templates/gfx.EXAMPLE.js(SCENES_ED, 애니메이션당 하나의EL(...), 레이어, 엔드 카드, 폰트). - 사운드:
W/sons.json(템플릿templates/sons.EXAMPLE.json):musique{bpm, intro_filtree, coupure = 리빌 전 무음, accords} 및events=[element|null, time|"fin+x", "sound[:param]", gain, [repeat, step]]. 사운드: pop, bulle, clic, shutter, succes, buzz, tick, touche, impact, tape, whoosh_in:dur, whoosh_out:dur, ding:freq:dur, shimmer:dur, riser:dur, souffle:dur. 각 사운드를 해당 요소에 연결하여 요소가 이동되거나 숨겨질 때 따라가도록 하세요. - 앵커:
python $ME/scripts/ancres.py <W>. - 프리뷰:
python $ME/scripts/build.py <W>후node $ME/engine/04_render_frames.js <W> preview t1 t2 …→ 콘택트 시트 → 까다로운 편집자처럼 검토 (읽을 수 있는가? 얼굴이 선명한가? 광고 안전 영역?)하고 수정 후 렌더링. - 렌더링:
bash $ME/scripts/rendu.sh <W>(백그라운드, 3-6분) →<nom>.mp4(+.srt/.txt), 스템은mixage/pistes/, 에디터 미디어. MP4의 6-8프레임, -14 LUFS, 크기를 확인하세요. - 에디터:
python $ME/scripts/editor_server.py <W> <port>실행 (Claude Code 데스크톱:.claude/launch.json에 추가하고 프리뷰 도구 사용),http://localhost:<port>/editeur/를 여세요. 프리뷰, 클릭-선택 및 재생이 작동하는지 확인하세요. - 댓글 감시:
W/comments.json을 모니터링하고status == "à faire"인 새 댓글당 한 줄씩 출력하세요 (references/editor.md에 명령 있음).
댓글 처리
- 읽기 (
target=el:<id>|scene:<id>|cap:<n>|audio:<track>,t, 클릭x,y). - 상태를 "en cours"로 설정:
POST /api/comments/status {"id":…,"status":"en cours"}. parts/gfx.js(또는 줌/패널의 경우top.js, 자막의 경우cartes.json, 사운드의 경우sons.json)에서 요소를 변경하되, 차터와 레지스트리 내에서 유지하세요. 요청이 모호하면 최선의 옵션을 적용하고 답변에 대안을 언급하세요.python $ME/scripts/build.py <W>(+ 사운드 변경 시sons.py) → 에디터가 스스로 프리뷰를 다시 로드합니다. 1-2 프리뷰 프레임을 확인하세요.- 상태 "fait" + 짧은
reply(무엇이 변경되었는지) — 에디터에 표시됩니다. 사용자에게 "비디오 렌더링"을 클릭할 수 있음을 알리세요. - 일반적인 선호사항 ("X는 절대 원하지 않음") → 이 파일의 규칙에 추가하세요.
요소 레지스트리 (에디터와의 계약)
EL(id, name, scene, layer, [x,y,w,h], ()=>[start,end], t=>{…draw…})
layer:'panel'(패널 내부, 튀어나오는 헤드 뒤에 그려짐) ·'full'(전체 화면, 앞에) ·'none'(전역: 플래시, 엔드 카드).- 받은
t= 에디터가 이동시킨 시간 (EDITS.off); 자신의 윈도우 내에서만 그리기;EDITS.hide[id]이면 숨김. - 박스
[x,y,w,h]는 프리뷰에서 클릭하는 데 사용됩니다: 정확하게 유지하세요. SCENES_ED= 에디터 왼쪽에 나열된 씬 (id,label,a,b,kind).- 줌: 각
ZP항목은 요소zoom<i>입니다 (에디터에서 제거 가능).
프로젝트 파일
projet.json · cartes.json → caps.json (caps.orig.json = 에디터 베이스) · sons.json · parts/{top,primitives,gfx}.js · framing.js · edits.json (에디터 설정: off, hide, caps, vol) · comments.json · captures/, assets/ · mixage/pistes/ · editeur/ · <nom>.mp4/.srt/.txt.