Communitygithub.com

MuhammadToffaha/비디오 편집

말하는 얼굴/음성 영상을 세로형 Reel/TikTok/Shorts로 가공합니다. 단어 동기화 자막(아랍어(RTL) 및 영어), 애니메이션 키워드 콜아웃, 인포그래픽/다이어그램/UI 카드, 카메라 펀치인, 브랜드 로고 배치, 합성 SFX, 음량 정규화 오디오를 포함합니다. 또한 영상을 다른 언어로 더빙하고 새로운 목소리와 립싱크를 제공합니다.

비디오 편집란 무엇인가요?

이 스킬은 사용자가 업로드한 토킹헤드/음성 영상을 전문가 수준의 세로형 숏폼 콘텐츠(Reel, TikTok, YouTube Shorts)로 완전 자동 변환합니다. 주요 기능으로는 단어 단위 동기화 자막(아랍어 RTL 및 영어 지원), 애니메이션 키워드 강조, 인포그래픽/다이어그램/UI 카드(말하는 내용에 맞춰 타이밍 조정), 카메라 펀치인(1.12~1.15x 줌), 브랜드 로고 배치, 합성 SFX(후시, 팝, 징글 등), 음량 정규화(-14 LUFS)가 포함됩니다. 또한 전체 더빙 모드를 지원하여 원본 언어를 다른 언어로 번역하고, 화자의 음색을 복제한 합성 음성(TTS)을 생성하며, Wav2Lip+Gan을 이용해 입술 움직임을 새 오디오에 동기화합니다. 이 모든 작업은 완전 오프라인 클라우드 샌드박스(ffmpeg + Headless Chromium + GSAP + sherpa-onnx Whisper)에서 실행됩니다. 스킬은 GitHub 저장소(MuhammadToffaha/Video-editing)에 기반하며, Claude Code, Cursor, Codex와 같은 AI 에이전트 환경에서 `/short-form-video-editor` 명령어로 작동합니다. 자동화된 워크플로우는 입력 분석, 전사(Whisper), 장면 디자인(GSAP 애니메이션), 렌더링(Headless Chromium), 오디오 믹싱을 포함하며, 사용자에게 최종 MP4 파일과 함께 요약(사양, 추가된 그래픽, 저신뢰도 전사 구간, 해상도 한계 등)을 제공합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MuhammadToffaha/Video-editing/tree/HEAD/.claude/skills/short-form-video-editor

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

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

문서

AUTOPILOT - 사용자가 /short-form-video-editor를 입력했을 때 해야 할 일

사용자가 비디오(선택적으로 로고 이미지)를 업로드하고 명령어를 입력합니다. 질문 없이 전체 작업을 수행하십시오; 진정으로 작업을 차단하는 경우에만 멈추십시오(비디오 없음, ffmpeg 없음). 명령어 뒤의 추가 텍스트 = 스타일/브랜드 노트이므로 적용하십시오.

  1. 입력 찾기: 세션 업로드에서 가장 최근 비디오(ls -t /root/.claude/uploads/*/*.{mp4,mov,webm} 또는 메시지에 주어진 경로); 로고 = 첨부된 이미지가 있으면 사용(로고 없으면 워터마크/히어로/아웃트로-로고 생략, 깔끔한 텍스트 없는 아웃트로 사용). 언어 = asr_chunks.py ... auto로 자동 감지.
  2. 툴킷 찾기: 이 스킬의 폴더(이 SKILL.md를 포함하는 디렉토리)에는 template/이 있습니다. 새 프로젝트 폴더에서 작업: Video-editing 저장소 클론 내부에 projects/<slug>-<YYYYMMDD>/로 (해당 저장소가 세션에 있을 경우), 그렇지 않으면 임시 공간에서. cp -r template/. <project>/.
  3. 의존성 확인/설치(한 번만): ffmpeg, Node + Playwright Chromium (/opt/pw-browsers, 절대 playwright install 실행 금지), pip install numpy pillow sherpa-onnx, scripts/fetch_asr_model.sh. Huggingface 네트워크 불가; GitHub 릴리스 + npm + PyPI는 작동.
  4. 아래 워크플로우를 처음부터 끝까지 실행하고, 디자인 결정은 직접 내리십시오(로고에서 브랜드 색상 추출; 없으면 코럴/틸 테크 팔레트; 장면은 reference/scene-patterns.md에서 실제 내용에 맞게 선택).
  5. 전달: SendUserFile로 mp4 전송(렌더 표시), 그런 다음 짧은 요약: 사양, 추가된 그래픽, 귀로 확인해야 할 LOW-CONFIDENCE 전사 구간, 푸티지 해상도 주의사항, "오디오 청취 안 함". 프로젝트(work/ 제외)와 최종 mp4를 저장소에 저장하고 세션 지정 브랜치(또는 지정 없으면 main)로 푸시. 요청 없으면 절대 PR을 생성하지 마십시오.
  6. 60초 비디오 기준 약 15~25분 예상(전사 ~3분, 렌더링 ~4분, 인코딩 ~2분). 시작 시 사용자에게 한 줄로 알리고, 완료될 때까지 조용히 작업하십시오.

DUB MODE - 번역 + 새 목소리 + 립싱크 (Glow 클립에서 한 번 테스트 완료: 아랍어 -> 영어)

사용자가 "입술이 단어를 따라가도록" 다른 언어로 비디오를 원할 때 사용합니다.

  1. 스크립트: 편집 모드처럼 원본을 전사하고 확인한 후, 번역을 직접 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.
  2. 모델: scripts/fetch_dub_models.sh (+ 확인용 fetch_asr_model.sh).
  3. 음성(기본값 = 화자에 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 음성(명확하지만 화자 아님). 악센트: 모델은 음색/피치를 전달하지만, 원어민 악센트는 아님 - 이집트 억양 영어를 약속하지 말고; 달성된 내용을 말하십시오.
  4. 원본 해상도 프레임에 립싱크: 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.
  5. 시각적 동기 증명: 각 타일 아래에 오디오 엔벨로프가 있는 입 크롭의 연락처 시트 - 막대가 올라가는 동안 입은 조용한 간격에서 닫히고 막대가 올라갈 때 열리고 다양해야 함. 픽셀 상관 메트릭은 여기서 너무 시끄러움; 의존하지 마십시오.
  6. 그래픽: 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') 사용 금지.
  7. 평소처럼 렌더링(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로 믹스.
  8. 요약에서 정직하게: 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). 사용자가 제공하지 않는 한 음악 없음.

워크플로우

  1. 검사: ffprobe, 연락처 시트(ffmpeg -vf "fps=1/6,scale=239:-1,tile=5x2"), 끝나는 엔드 카드(WhatsApp/CapCut 검은 프레임)를 찾고 화자 위치를 기록하십시오. 소스는 일반적으로 저해상도(휴대폰/WhatsApp): lanczos로 업스케일, 사용자에게 푸티지는 부드럽지만 그래픽은 선명하게 유지된다고 알리십시오.
  2. 프로젝트: 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 업데이트.
  3. 준비: END=<트림_초> scripts/01_prepare.sh input.mp4 (프레임, 16k wav, 음성).
  4. 전사(샌드박스에서 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로 나열하십시오. 추측한 이름으로 그래픽을 만들지 마십시오.
  5. 타이밍: 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 단어 자막 청크를 만듭니다. 온전성 검사: 묵음 내에 단어 시작 없음.
  6. composition/scene.js에서 장면 디자인(reference/scene-patterns.md 참조). card(t0,t1,{y,h,html}), pop, fade, draw, cue, ts 사용. 예제 장면을 패턴으로 삼으십시오: 후크 카드, 브랜드 칩(각 이름이 말해질 때 채워지는 골격 슬롯), 카테고리 타일, 이동 점 + 체크가 있는 A->B 매치 다이어그램, 취소선 칩, 흐름 노드, 별점, 체크리스트 행, 로드맵, 막대 차트, 신뢰 링, 히어로 로고 공개, 브랜드 아웃트로. finish(<초>) = 음성 끝 + 약 1.7초 아웃트로로 설정.
  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>을 전달하여 마지막 깨끗한 프레임을 고정하십시오.
  8. 전달: 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가 있는 카드는 비디오 프레임이 같은 페이지(#bg img)에 있을 때만 블러됨 - 이것이 프레임이 페이지 내에서 합성되는 이유.
  • 빈 블러 카드는 깨져 보임: 트리거 단어에서 카드를 시작하거나 말할 때 밝아지는 희미한 플레이스홀더 행/슬롯을 표시하십시오.
  • 아랍어는 실제 모양이 필요함: 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 + 클론(경로가 존재하면 새 디렉토리로 클론).

관련 스킬