AUTOPILOT - 사용자가 /short-form-video-editor를 입력했을 때 해야 할 일
사용자가 비디오(선택적으로 로고 이미지)를 업로드하고 명령어를 입력합니다. 질문 없이 전체 작업을 수행하십시오; 진정으로 작업을 차단하는 경우에만 멈추십시오(비디오 없음, ffmpeg 없음). 명령어 뒤의 추가 텍스트 = 스타일/브랜드 노트이므로 적용하십시오.
- 입력 찾기: 세션 업로드에서 가장 최근 비디오(
ls -t /root/.claude/uploads/*/*.{mp4,mov,webm}또는 메시지에 주어진 경로); 로고 = 첨부된 이미지가 있으면 사용(로고 없으면 워터마크/히어로/아웃트로-로고 생략, 깔끔한 텍스트 없는 아웃트로 사용). 언어 =asr_chunks.py ... auto로 자동 감지. - 툴킷 찾기: 이 스킬의 폴더(이 SKILL.md를 포함하는 디렉토리)에는
template/이 있습니다. 새 프로젝트 폴더에서 작업: Video-editing 저장소 클론 내부에projects/<slug>-<YYYYMMDD>/로 (해당 저장소가 세션에 있을 경우), 그렇지 않으면 임시 공간에서.cp -r template/. <project>/. - 의존성 확인/설치(한 번만):
ffmpeg, Node + Playwright Chromium (/opt/pw-browsers, 절대playwright install실행 금지),pip install numpy pillow sherpa-onnx,scripts/fetch_asr_model.sh. Huggingface 네트워크 불가; GitHub 릴리스 + npm + PyPI는 작동. - 아래 워크플로우를 처음부터 끝까지 실행하고, 디자인 결정은 직접 내리십시오(로고에서 브랜드 색상 추출; 없으면 코럴/틸 테크 팔레트; 장면은
reference/scene-patterns.md에서 실제 내용에 맞게 선택). - 전달:
SendUserFile로 mp4 전송(렌더 표시), 그런 다음 짧은 요약: 사양, 추가된 그래픽, 귀로 확인해야 할 LOW-CONFIDENCE 전사 구간, 푸티지 해상도 주의사항, "오디오 청취 안 함". 프로젝트(work/제외)와 최종 mp4를 저장소에 저장하고 세션 지정 브랜치(또는 지정 없으면main)로 푸시. 요청 없으면 절대 PR을 생성하지 마십시오. - 60초 비디오 기준 약 15~25분 예상(전사 ~3분, 렌더링 ~4분, 인코딩 ~2분). 시작 시 사용자에게 한 줄로 알리고, 완료될 때까지 조용히 작업하십시오.
DUB MODE - 번역 + 새 목소리 + 립싱크 (Glow 클립에서 한 번 테스트 완료: 아랍어 -> 영어)
사용자가 "입술이 단어를 따라가도록" 다른 언어로 비디오를 원할 때 사용합니다.
- 스크립트: 편집 모드처럼 원본을 전사하고 확인한 후, 번역을 직접
data/phrases.<lang>.json에 작성합니다 =[[win_start, win_end, "text with *key words and DISPLAY|spoken overrides (NBSP inside multi-word tokens)"], ...]. 원래 구문 창을 유지하여 카메라/그래픽 비트가 살아남도록 합니다; 인접 창은 병합 가능. 창당 약 2.5~3단어/초(영어)를 예산으로 잡음 - 의미를 유지하고, 새로운 주장을 추가하지 않으며, 압축합니다. 발음 재정의 예:*COSRX|Cosrex,Axis-Y|Axis\u00a0Y. - 모델:
scripts/fetch_dub_models.sh(+ 확인용fetch_asr_model.sh). - 음성(기본값 = 화자에 CLONED):
work/ref.wav구축 = 화자의 원래 음성 중 4-5개의 깨끗한 일시 정지 구간 클립(약 15초, 16k 모노, 연결됨).python3 -I scripts/tts_clone.py data/phrases.en.json work/ref.wav 8 <total_seconds>->work/voice_en.wav+ 실제 음성 범위가 포함된data/transcript.source.json. YourTTS(coqui,fetch_dub_models.sh로 다운로드)가 음색을 제로샷으로 복제; 스크립트는 라인당 N개의 테이크를 생성하고, Whisper 리드백이 스크립트와 가장 일치하는 테이크를 유지한 다음, 원래 창의 약 90%를 채우도록 시간 늘리기(0.72~1.25배, 피치 보존)합니다. Glow 클립에서 입증된 수치: 중앙 피치 144 Hz 대 화자 154 Hz(기본 Kokoro 음성 123 Hz), 장기 스펙트럼 유사도 0.96 대 0.90, 모든 라인이 올바르게 읽힘. 브랜드 이름은DISPLAY|spoken을 통해 음성학적으로 표기하고(점수에서 제외 - 자동). 폴백tts_phrases.py= 기본 Kokoro 음성(명확하지만 화자 아님). 악센트: 모델은 음색/피치를 전달하지만, 원어민 악센트는 아님 - 이집트 억양 영어를 약속하지 말고; 달성된 내용을 말하십시오. - 원본 해상도 프레임에 립싱크:
ffmpeg -t <end> -i src -vf fps=30 work/raw/%05d.png;ffmpeg -i work/voice_en.wav -ac 1 -ar 16000 work/en16k.wav;MODELS=work/models python3 -I scripts/lipsync2.py work/raw work/en16k.wav work/ls --model wav2lip_gan_96.onnx --enhance 0.7(먼저--range a b로 테스트; 전체 실행은 4 CPU에서 1700 프레임 기준 약 25분: Haar 박스, 모든 프레임의 2dfan4 랜드마크, 그 다음 Wav2Lip + GFPGAN). lipsync2 = 랜드마크 정렬 FFHQ-512 크롭, 부드러워진 랜드마크, 랜드마크 얼굴 박스에 Wav2Lip, GFPGAN 복원 블렌드 0.7, 입 모양 마스크(코에 닿지 않음), 다시 붙여넣기. 그런 다음scripts/01b_upscale_lipsynced.sh. 이전lipsync.py사용 금지(조잡한 Haar 크롭: 번진 입술, 혀 같은 아티팩트 - 사용자가 "매우 나쁘다"고 함). EDTalk-256도 시도했지만 더 나쁨(유령 같은 입). 모델: facefusion-assets GitHub 릴리스에서 2dfan4, gfpgan_1.4, wav2lip_gan_96. - 시각적 동기 증명: 각 타일 아래에 오디오 엔벨로프가 있는 입 크롭의 연락처 시트 - 막대가 올라가는 동안 입은 조용한 간격에서 닫히고 막대가 올라갈 때 열리고 다양해야 함. 픽셀 상관 메트릭은 여기서 너무 시끄러움; 의존하지 마십시오.
- 그래픽:
python3 -I scripts/build_transcript.py work/en16k.wav(소스 json에서 영어의 경우max_chars~22로 설정),composition/transcript.js재생성, 그런 다음 새 언어로scene.js사본 + 트리거 단어 다시 작성(LTR:.row/.chunk방향 ltr, Inter 폰트, 스트라이크 원점 왼쪽, 흐름 화살표 왼쪽->오른쪽). 다중 단어 토큰은 전사에서 별도 단어: 단일 단어 조회(ts('skin',0,43.5)), 절대ts('your skin')사용 금지. - 평소처럼 렌더링(
LAST_SRC_FRAME=<n> scripts/02_render_all.sh, 큐, sfx)하고VOICE=work/voice_en.wav OUT=out/name-en.mp4 scripts/03_mix_and_encode.sh로 믹스. - 요약에서 정직하게: Wav2Lip은 ~100px 얼굴에서 부드럽고 약간 스무딩된 입(가까이서 보면 보임)을 제공하며, 머리/손 움직임은 여전히 원래 화자의 것이고, 음성은 합성이며, 화자는 자신의 초상화를 더빙한 버전을 승인해야 하며, AI 더빙으로 레이블링하는 것을 고려해야 합니다. 저신뢰도였던 번역된 구문이 있으면 이름을 지정하십시오.
숏폼 비디오 편집기 (자막 + 모션 그래픽 + SFX)
두 가지 모드: 편집(언어 유지, 자막/그래픽/SFX 추가) 및 더빙(다른 언어로 번역, 새 목소리, 립을 새 오디오에 다시 애니메이션 - 사용자가 영어/번역/더빙/립싱크를 말할 때 트리거). 57초 이집트 아랍어 약국 프로모션(Glow Cosmetics)에서 입증된 파이프라인. 출력: 1080x1920 @30, H.264/AAC, -14 LUFS.
작업 예제 프로젝트: projects/glow-kbeauty-reel/ (https://github.com/MuhammadToffaha/Video-editing)
"전문적, 템플릿 아님"을 정의하는 규칙
- 화자, 목소리 및 의미를 그대로 유지하십시오. 절대 주장(숫자, "100%", 가격)을 지어내지 마십시오. 그래픽에 말하지 않은 텍스트가 필요한 경우 일반적인 내용(카테고리 이름, 눈썹 레이블)으로 유지하십시오.
- 모든 시각적 요소는 말한 구문을 지원하며, 구문 시작이 아닌 단어 자체에서 트리거됩니다(
ts('word')). 카드는 다음 카드가 들어오기 전에 종료됩니다; 겹치는 잔상 없음. - 하나의 시각 언어: 브랜드 색상(로고에서 샘플링) + 흰색 + 딥 잉크 유리 패널, 라틴 레이블은 Inter, 아랍어 제목/자막은 Cairo. 민트는 성공 상태에만 사용.
- 레이아웃 영역(1080x1920, 화자 얼굴
y 790-1110): 카드 y 235-735(1.15x 줌 후에도 얼굴 위 절대 금지), 자막 y1545, 하단 220px 및 상단 130px는 주요 콘텐츠 비우기(플랫폼 UI). 각 소스에 대해 얼굴 위치를 다시 확인하십시오. - 유지 장치, 적당히: 문장 시작 시 펀치인 스냅(1.12-1.15x)과 느린 이동, 2-4초마다 그래픽, 활성 단어 자막 강조, 취소선/체크/카운트업 마이크로 애니메이션, 브랜드 언급 시 히어로 로고 모먼트, 브랜드 엔드 카드.
- SFX: 카드인 시 후시, 요소에 팝/틱, 성공 시 징글, 로고에 썽. 조용함(음성 아래 약 -10dB). 사용자가 제공하지 않는 한 음악 없음.
워크플로우
- 검사:
ffprobe, 연락처 시트(ffmpeg -vf "fps=1/6,scale=239:-1,tile=5x2"), 끝나는 엔드 카드(WhatsApp/CapCut 검은 프레임)를 찾고 화자 위치를 기록하십시오. 소스는 일반적으로 저해상도(휴대폰/WhatsApp): lanczos로 업스케일, 사용자에게 푸티지는 부드럽지만 그래픽은 선명하게 유지된다고 알리십시오. - 프로젝트:
cp -r <skill>/template/. my-project/ && cd my-project;cp <logo> assets/;python3 -I scripts/extract_logo.py assets/logo_original.png assets/logo_white.png(브랜드 16진수 출력).composition/style.css와#wm/#outro에서--coral/--brand업데이트. - 준비:
END=<트림_초> scripts/01_prepare.sh input.mp4(프레임, 16k wav, 음성). - 전사(샌드박스에서 HF 접근 불가; GitHub 릴리스 작동):
scripts/fetch_asr_model.sh; 그런 다음python3 -I scripts/asr_chunks.py work/asr16k.wav <lang|auto> 3.2 a, 2.4와 4.5로 반복. Whisper는 청크 꼬리를 자름; 3개의 가설을 직접 병합하고 자신의 언어 지식으로 수정하십시오.- 불확실한 단어/브랜드 이름:
python3 -I scripts/asr_probe.py work/asr16k.wav ar,en 14.0-16.8 14.5-16.6 ...(en패스는 라틴 브랜드 이름 철자). 겹치는 창에서 일관된 것만 신뢰하고; 나머지는 최종 메시지와 README에서 LOW-CONFIDENCE로 나열하십시오. 추측한 이름으로 그래픽을 만들지 마십시오.
- 타이밍:
python3 -I scripts/pauses.py work/asr16k.wav-> 일시 정지는 신뢰할 수 있는 구문 경계입니다.data/transcript.source.json을[start, end, "text"]구문으로 작성하십시오(data/transcript.source.example.json참조;*word= 악센트 알약; 다중 단어 라틴 이름 내부에는 NBSP 사용; RTL 텍스트의 라틴 브랜드: 아랍어و접두사를 붙이지 말고و Brand로 작성). 그런 다음python3 -I scripts/build_transcript.py work/asr16k.wav및echo "window.TRANSCRIPT=$(cat data/transcript.json);" > composition/transcript.js. 각 구문 내 음절 가중치로 단어 시간을 분배하고 에너지 계곡에 스냅한 다음 균형 잡힌 2-4 단어 자막 청크를 만듭니다. 온전성 검사: 묵음 내에 단어 시작 없음. composition/scene.js에서 장면 디자인(reference/scene-patterns.md참조).card(t0,t1,{y,h,html}),pop,fade,draw,cue,ts사용. 예제 장면을 패턴으로 삼으십시오: 후크 카드, 브랜드 칩(각 이름이 말해질 때 채워지는 골격 슬롯), 카테고리 타일, 이동 점 + 체크가 있는 A->B 매치 다이어그램, 취소선 칩, 흐름 노드, 별점, 체크리스트 행, 로드맵, 막대 차트, 신뢰 링, 히어로 로고 공개, 브랜드 아웃트로.finish(<초>)= 음성 끝 + 약 1.7초 아웃트로로 설정.- 렌더 + QA: 먼저 몇 개의 테스트 프레임 렌더링(
node scripts/render.mjs <f> <f+1> work/test), Pillow로 연락처 시트 구축, LOOK at them. 그런 다음scripts/02_render_all.sh(4개 워커, 약 8fps 총합),node scripts/render.mjs cues work/cues.json && python3 -I scripts/sfx.py work/cues.json work/sfx.wav,OUT=out/name.mp4 scripts/03_mix_and_encode.sh. 소스가 엔드 카드로 끝나면LAST_SRC_FRAME=<n>을 전달하여 마지막 깨끗한 프레임을 고정하십시오. - 전달: mp4 전송(SendUserFile), 사양, 저신뢰도 전사 구간, 푸티지 해상도 한계, 오디오를 귀로 청취하지 않았음을 명시(들을 수 없음) - 음량 측정기와 시작 대 에너지 테스트로만 확인.
이미 해결된 함정(다시 배우지 마십시오)
- Python
str.split()은 NBSP에서 분할됨 - 대신split(' ')사용(build_transcript.py에 이미 있음). - Headless Chromium에서 CSS
scaleY로 SVG<rect>를 애니메이션하면 뒤집히거나 오프셋됨 - 대신attr:{y,height}를 트윈하십시오. 획 그리기:draw(path,t,d). - 숨겨진 상태로 시작하는 요소는 CSS
opacity:0(클래스hid)과immediateRender:false가 있는 트윈이 필요함; 모든 트윈은 검색 가능해야 함(워커가 시작 프레임으로 바로 점프). backdrop-filter가 있는 카드는 비디오 프레임이 같은 페이지(#bgimg)에 있을 때만 블러됨 - 이것이 프레임이 페이지 내에서 합성되는 이유.- 빈 블러 카드는 깨져 보임: 트리거 단어에서 카드를 시작하거나 말할 때 밝아지는 희미한 플레이스홀더 행/슬롯을 표시하십시오.
- 아랍어는 실제 모양이 필요함: Chromium + Cairo woff2(유니코드 범위 분할 아랍어/라틴)가 작동함; Pillow/ffmpeg drawtext는 작동하지 않음.
- sherpa-onnx의 Whisper에는 단어 타임스탬프가 없고 꼬리를 자름; 따라서 짧은 창 + 일시 정지 앵커링.
- opencv 5.x에는
CascadeClassifier가 없음(4.10.0.84로 고정); Haar 얼굴 박스는 손/셔츠에 오탐지를 주고 ~30% 프레임을 놓침 -> 중앙값 박스 이상치 제거 + ROI 두 번째 패스 + 보간(lipsync.py에 이미 있음). - Kokoro/Whisper 스타일 TTS는
COSRX를 글자로 읽음:DISPLAY|spoken재정의 사용. - GitHub MCP
create_repository는 403이 될 수 있음 - 사용자에게 저장소 생성을 요청한 다음add_repo+ 클론(경로가 존재하면 새 디렉토리로 클론).