Communitygithub.com

huzaifa-hb/video-edit

대화형으로 실제 영상을 편집하는 완전 로컬 환경 도구입니다. whisper.cpp로 텍스트 추출, 대본에서 테이크 선택, JSON 편집 목록 작성 및 검증, ffmpeg 렌더링, 애니메이션 자막 및 오버레이 추가, 9:16/1:1/16:9 재구성을 수행한 후 결과물을 자체 점검합니다.

video-edit란 무엇인가요?

이 스킬은 AI 에이전트가 실제 영상 푸티지를 자연어 대화만으로 편집할 수 있도록 지원하는 완전 로컬 도구입니다. 브라우저 기반 인터페이스가 아닌 로컬 환경에서 whisper.cpp를 사용해 음성을 전사하고, 사용자와의 대화를 통해 편집 전략을 수립한 후 JSON 편집 결정 목록(EDL)을 생성 및 검증하며, ffmpeg를 통해 최종 렌더링을 수행합니다. 이 과정에서 Hyperframes 기반의 애니메이션 자막과 오버레이를 추가하고, 소셜 미디어 광고 변형(variant)을 위해 9:16, 1:1, 16:9 비율로 캔버스를 재구성하는 기능을 제공합니다. 특히 강조되는 점은 모든 편집 결정이 사용자 확인을 거친 후 실행되며, 렌더링 전 자체 검증(validate_edl.py)을 거쳐 오류를 최소화하고, 최종 출력물도 자체 평가(self-eval)하여 품질을 보장합니다. 따라서 토크쇼, 사용자 제작 콘텐츠(UGC), 추천 광고, 창업자 영상, 통화 녹음, 인터뷰, 튜토리얼 등에서 영상 클립을 자르고, 다듬고, 자막을 입히고, 비율을 변경하거나 광고 변형을 제작할 때 유용합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add huzaifa-hb/video-edit

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

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

문서

Video Edit

browser-use/video-use (MIT)의 포크: ElevenLabs 대신 로컬 whisper.cpp, 모든 렌더링 전 검증 게이트, libass 자막 대신 Hyperframes 자막, 소셜 광고 변형을 위한 캔버스 재구성.

원칙

  1. LLM은 원시 전사본 + 요청 시 시각 자료로 추론합니다. 유지할 가치가 있는 유일한 파생 결과물은 구문 수준 전사본(takes_packed.md)입니다. 그 외의 모든 것(필러 태깅, 재촬영 감지, 샷 분류, 강조 점수)은 결정 시점에 도출합니다.
  2. 오디오가 우선이고, 시각 자료는 그에 따릅니다. 컷 후보는 음성 경계와 침묵 간격에서 나옵니다. 결정 지점에서만 시각 자료를 자세히 살펴봅니다.
  3. 질문 → 확인 → 실행 → 반복 → 유지. 사용자가 평문으로 전략을 확인하기 전에는 절대로 컷을 실행하지 마십시오.
  4. 일반화하십시오. 이것이 어떤 종류의 영상인지 가정하지 마십시오. 자료를 보고, 사용자에게 물어본 후 편집하십시오.
  5. 예술적 자유가 기본값입니다. 이 문서의 모든 특정 값, 프리셋, 글꼴, 색상, 지속 시간, 피치 구조, 기법은 하나의 검증된 영상에서 가져온 작업 예제일 뿐이며 명령이 아닙니다. 그것들을 읽어 무엇이 가능하고 각각이 왜 효과가 있었는지 이해하십시오. 그런 다음 자료가 실제로 무엇이고 사용자가 실제로 원하는 것이 무엇인지에 따라 자신의 취향에 맞게 결정하십시오. 아래 하드 규칙 섹션에 있는 것만 반드시 수행해야 합니다. 그 외의 모든 것은 여러분의 자유입니다.
  6. 자유롭게 창안하십시오. 자료가 여기에 설명되지 않은 기법(분할 화면, PIP(Picture-in-Picture), 하단 서드 아이덴티티 카드, 반응 컷, 속도 램프, 프리즈 프레임, 크로스페이드, 매치 컷, L-컷, J-컷, 호흡에 맞춘 속도 램프 등)을 요구한다면, 그것을 만드십시오. 도우미는 ffmpeg와 PIL입니다. 형식이 지원하는 모든 것을 할 수 있습니다. 허락을 기다리지 마십시오.
  7. 사용자에게 보여주기 전에 자신의 출력물을 검증하십시오. 출시할 수 없는 결과물이라면 제시하지 마십시오.

하드 규칙 (프로덕션 정확성 — 협상 불가)

이것들은 위반 시 무음 오류 또는 깨진 출력물을 생성합니다. 취향이 아니라 정확성입니다. 암기하십시오.

  1. 자막은 모든 오버레이 후, 필터 체인에서 마지막에 적용됩니다. 그렇지 않으면 오버레이가 자막을 가립니다. 무음 오류.
  2. 세그먼트별 추출 → 무손실 -c copy 연결(concat), 단일 패스 필터그래프 사용 금지. 그렇지 않으면 오버레이 추가 시 모든 세그먼트가 두 번 인코딩됩니다.
  3. 모든 세그먼트 경계에 30ms 오디오 페이드(afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). 그렇지 않으면 모든 컷 부분에서 가청성 팝 노이즈가 발생합니다.
  4. 오버레이는 setpts=PTS-STARTPTS+T/TB를 사용하여 오버레이의 프레임 0을 해당 윈도우 시작점으로 이동시킵니다. 그렇지 않으면 오버레이 윈도우 동안 애니메이션 중간 부분이 표시됩니다.
  5. 자막은 출력 타임라인 오프셋을 사용합니다: output_time = word.start - segment_start + segment_offset, 각 세그먼트는 전체 프레임 길이만큼 지속됩니다(captions.py가 이 작업을 수행). 그렇지 않으면 세그먼트 연결 후 자막이 정렬되지 않습니다.
  6. 절대 단어 중간에 컷하지 마십시오. 모든 컷 가장자리를 전사본의 단어 경계에 맞추십시오. validate_edl.py --fix가 이 작업을 자동으로 수행합니다.
  7. 모든 컷 가장자리에 패딩을 추가하십시오. 작업 윈도우: 30–200ms. 단어 가장자리는 이미 오디오 엔벨로프에 맞춰져 있지만, 패딩이 남은 부분을 흡수합니다. 빠른 진행 영상에는 더 타이트하게, 시네마틱 영상에는 더 느슨하게 적용하십시오.
  8. 단어 수준의 그대로의 ASR(자동 음성 인식)만 사용하십시오. SRT/구문 모드(서브초 간격 데이터 손실)나 정규화된 필러(편집 신호 손실)는 절대 사용하지 마십시오. transcribe.py는 whisper가 "음"/"어"를 유지하도록 프롬프트합니다 — 프롬프트를 제거하지 마십시오.
  9. 소스별로 전사본을 캐시하십시오. 소스 파일 자체가 변경되지 않는 한 절대 재전사하지 마십시오.
  10. 다중 애니메이션은 병렬 서브 에이전트로 처리하십시오. 절대 순차적으로 처리하지 마십시오. Agent 도구를 통해 N개를 동시에 생성하십시오. 총 소요 시간 ≈ 가장 느린 것의 시간.
  11. 실행 전 전략 확인. 사용자가 평문 계획을 승인하기 전에는 절대로 컷을 실행하지 마십시오.
  12. 모든 세션 출력은 <videos_dir>/edit/에 저장하십시오. 절대 스킬 디렉토리 내부에 쓰지 마십시오.
  13. 모든 렌더링 전에 검증하십시오. validate_edl.py <edl> --fix를 실행하고, 종료 코드 0인 경우에만 렌더링하십시오. 이는 잘못된 소스 ID, 파일 끝을 초과하는 시간, 단어 중간 컷, 누락된 오버레이 파일, 컷보다 긴 오버레이 등 LLM이 작성한 편집 목록에서 실제로 발생하는 실패 모드를 잡아냅니다.
  14. 자막은 Hyperframes 레이어이며, 하드코딩된 자막이 아닙니다. Homebrew의 ffmpeg에는 libass가 없으므로 EDL에서 subtitles를 사용하면 실패합니다. captions.py를 사용하십시오. render.py는 모든 오버레이 위에 자막 WebM을 합성합니다.
  15. 소스 ID는 파일 스템(stem)입니다. sources에서 키는 확장자를 제외한 비디오 파일 이름이어야 합니다(take_B.mp4의 경우 take_B), 또는 --audio-track N으로 전사한 경우 <stem>.track<N> — 이것이 전사본을 찾는 방식입니다. 자막이 켜져 있을 때 불일치가 있으면 검증기가 오류를 발생시킵니다.
  16. 렌더링당 하나의 프레임 속도. render.py에 --fps를 전달하는 경우, 동일한 --fps를 validate_edl.py와 captions.py에도 전달하십시오. 범위는 자막이 어긋나지 않도록 전체 프레임 단위로 반올림됩니다.

이 문서의 다른 모든 것은 작업 예제입니다. 자료가 요구할 때마다 변경하십시오.

디렉토리 구조

스킬은 자체 디렉토리에 있습니다(이 파일 옆의 도우미 + 템플릿). 사용자 영상은 사용자가 배치한 곳에 있습니다. 모든 세션 출력은 <videos_dir>/edit/로 이동합니다.

<videos_dir>/
├── <소스 파일, 수정되지 않음>
└── edit/
    ├── project.md                 ← 메모리; 모든 세션이 추가됨
    ├── takes_packed.md            ← 구문 수준 전사본, LLM의 기본 읽기 뷰
    ├── edl.json                   ← 컷 결정 (변형의 경우 edl_9x16.json, edl_1x1.json …)
    ├── transcripts/<name>.json    ← 캐시된 whisper.cpp 전사본 (단어 수준 + 침묵)
    ├── captions_<edl stem>/       ← Hyperframes 자막 합성 + captions.webm
    ├── animations/slot_<id>/      ← 애니메이션별 소스 + 렌더링 + 추론
    ├── clips_graded/              ← 그레이딩 및 페이드가 적용된 세그먼트별 추출물
    ├── downloads/                 ← yt-dlp 출력물
    ├── verify/                    ← 디버그 프레임 / 타임라인 PNG
    ├── preview.mp4
    └── final.mp4

설정

install.sh / setup.sh가 모든 것을 설치합니다(Homebrew 패키지, .venv, whisper 모델, Hyperframes + Chrome). 첫 시작 시 그냥 확인하십시오 — 그리고 .venv가 없거나 도우미가 import나 누락된 도구로 인해 실패하는 경우, 다른 작업보다 먼저 <this skill dir>/setup.sh(멱등적임)를 실행하십시오:

  • PY=<this skill dir>/.venv/bin/python이 존재합니다. 모든 도우미는 $PY로 실행하고, 시스템 파이썬을 절대 사용하지 마십시오(numpy/Pillow/OpenCV가 없음).
  • ffmpeg, ffprobe, whisper-cli가 PATH에 있고, ggml whisper 모델이 있어야 합니다. 기본값: ~/.claude-video-vision/models/ggml-large-v3-turbo.bin; VIDEO_EDIT_WHISPER_MODEL로 재정의할 수 있습니다.
  • Hyperframes용 Node.js 22+. 항상 고정된 버전을 호출하십시오: npx --yes [email protected] ….
  • yt-dlp와 Manim은 처음 사용할 때만 필요합니다. 이 스킬은 skills/manim-video/를 제공합니다. Manim 슬롯을 구축할 때 해당 SKILL.md를 읽으십시오.
  • API 키가 필요 없습니다. 일회성 npm 다운로드인 Hyperframes를 제외하고는 아무것도 머신을 떠나지 않습니다.

도우미는 이 SKILL.md 옆에 있는 helpers/에 있습니다. 이 파일이 포함된 디렉토리를 기준으로 경로를 확인하십시오.

도우미

모든 도우미는 $PY helpers/<name>.py … 형식으로 실행합니다.

  • transcribe.py <video> — 로컬 whisper.cpp, 단어 수준, 필러 유지, 단어 가장자리가 오디오 엔벨로프에 맞춰짐, 침묵 나열. 소스별로 캐시됨(파일이 변경된 경우에만 재실행). --language en은 감지를 건너뜁니다. --audio-track N은 다중 트랙 녹음용.
  • transcribe_batch.py <videos_dir> — 폴더의 모든 비디오를 한 번에 하나씩 처리(whisper는 이미 GPU를 포화시킴).
  • pack_transcripts.py --edit-dir <dir> — transcripts/*.json → takes_packed.md (구문 수준, 침묵 ≥ 0.5s에서 분할; 빠른 화자용으로 --silence-threshold를 0.3으로 낮춤).
  • timeline_view.py <video> <start> <end> — 필름스트립 + 파형 PNG. 요청 시 시각적 드릴다운. 스캔 도구가 아님 — 지속적으로 사용하지 말고 결정 지점에서 사용하십시오.
  • validate_edl.py <edl.json> [--fix] — 모든 렌더링 전 게이트(하드 규칙 13). --fix는 가장자리를 단어 간격에 맞추고 패딩(--pad-in, --pad-out)을 적용하며, 범위를 전체 프레임으로 반올림하고 total_duration_s를 재계산하며 edl.json.bak을 유지합니다. 30ms 미만의 침묵이 있는 가장자리에 대한 경고는 --fix 후에도 남습니다: 해당 컷은 단어가 만나는 위치에 있습니다 — 실제 멈춤 지점으로 이동하십시오.
  • captions.py <edl.json> — 출력 타임라인 단어 자막을 Hyperframes 합성 → 투명 captions.webm, EDL의 captions 키 설정. 스타일 플래그: --accent, --color, --top, --size, --font, --case, --words, --no-pop.
  • render.py <edl.json> -o <out> — 세그먼트별 추출(프레임 정확, HDR→SDR, 캔버스 재구성, 그레이딩, 페이드) → 무손실 연결 → 오버레이(PTS 이동) → 자막 → loudnorm. --preview는 QC용, --draft는 컷 확인 전용.
  • reframe.py <edl.json> [--apply] — 각 범위에 걸쳐 OpenCV 얼굴 감지(YuNet) → EDL canvas에서 화자를 중앙에 유지하고 상단 여백을 확보하는 crop_x/crop_y 생성. validate_edl.py --fix 후에 canvas가 종횡비를 변경할 때마다 실행하십시오. 얼굴이 MOVES하여 단일 정적 크롭으로 충분하지 않은 범위(분할 필요)와 no face 범위(직접 크롭 선택)를 플래그 지정합니다. 범위의 "crop_lock": true는 수동 크롭을 보호합니다.
  • scenes.py <video> — OpenCV 샷 변경 감지 + 샷당 DARK / BLURRY 플래그 → edit/shots/<stem>.json. 전사본이 구조화할 수 없는 푸티지(B-롤, 제품 샷, 몽타주, 멀티캠 내보내기, 무음 클립)에 사용하십시오. 샷 경계는 깔끔한 시각적 컷 포인트입니다. 플래그가 지정된 샷은 광고에 거의 사용할 수 없습니다.
  • grade.py <in> -o <out> — ffmpeg 필터 체인 그레이딩. 프리셋 + 사용자 정의용 --filter '<raw>'.

애니메이션의 경우, <edit>/animations/slot_<id>/를 Bash로 생성하고 Agent 도구를 통해 서브 에이전트를 생성하십시오.

프로세스

  1. 인벤토리. 모든 소스에 대해 ffprobe를 실행합니다. 디렉토리에 대해 transcribe_batch.py를 실행합니다. 말이 거의 없거나 전혀 없는 소스(B-롤, 제품 샷)의 경우 대신 scenes.py를 실행하여 해당 샷을 가져옵니다. 그것이 출력하는 QC: 줄(각 전사본의 qc 아래에도 있음)을 읽으십시오: ≤20ms로 압축되거나 침묵 내에서 시작하는 단어는 신뢰할 수 없는 시간을 가집니다. 사용하기 전에 timeline_view를 사용하여 해당 단어 근처의 모든 컷을 확인하십시오.

    • 다중 화자(통화, 인터뷰): 화자 레이블이 없습니다. 내용(질문 대 답변)에서 발언 차례를 추론한 다음, 보관할 각 구문을 timeline_view로 확인하십시오(화상 통화의 경우 활성 화자 타일이 누가 말하는지 보여줍니다). 통화가 각 오디오 트랙에 한 사람씩 녹음된 경우, 대신 --audio-track N을 사용하여 각 트랙을 전사하십시오. pack_transcripts.py로 takes_packed.md를 생성합니다. 시각적 첫인상을 위해 하나 또는 두 개의 timeline_view를 샘플링하십시오.
  2. 문제 사전 스캔. takes_packed.md를 한 번 훑어보며 언어적 실수, 명백한 잘못된 표현, 피해야 할 문구를 기록합니다. 일반 목록으로, 편집자 브리핑에 제공합니다.

  3. 대화. 평문으로 보이는 것을 설명합니다. 자료에 의해 형성된 질문을 합니다. 수집할 항목: 콘텐츠 유형, 대상 길이/종횡비, 미적/브랜드 방향, 페이스 느낌, 반드시 유지해야 할 순간, 반드시 잘라야 할 순간, 애니메이션 및 그레이딩 선호도, 자막 필요 여부. 고정된 체크리스트를 사용하지 마십시오 — 적절한 질문은 매번 다릅니다.

  4. 전략 제안. 4–8문장: 형태, 테이크 선택, 컷 방향, 애니메이션 계획, 그레이딩 방향, 자막 스타일, 길이 예상. 확인을 기다리십시오.

  5. 실행. 편집기 서브 에이전트 브리핑을 통해 edl.json을 생성합니다. 모호한 순간에는 timeline_view로 드릴다운합니다. 병렬 서브 에이전트에서 애니메이션을 구축합니다. validate_edl.py --fix가 종료 코드 0으로 끝날 때까지 실행합니다. 그런 다음 자막이 요청된 경우 captions.py를 실행합니다(자막은 최종 범위에서 구축되므로 범위 변경 후 다시 실행하십시오).

  6. 미리 보기. validate_edl.py(--fix 없음) → render.py --preview.

  7. 자체 평가(사용자에게 보여주기 전). 렌더링된 출력(소스 아님)에서 모든 컷 경계(±1.5s 윈도우)에 대해 timeline_view를 실행합니다. 각 이미지에서 다음을 확인합니다:

    • 컷에서 시각적 불연속성 / 플래시 / 점프
    • 경계에서의 파형 스파이크(30ms 페이드를 통과한 오디오 팝)
    • 오버레이 뒤에 숨겨진 자막(규칙 1 위반)
    • 오버레이 정렬 불량 또는 잘못된 프레임 표시(규칙 4 위반)

    또한 샘플링: 처음 2초, 마지막 2초, 중간 지점 2–3개 — 그레이딩 일관성, 자막 가독성, 전반적인 일관성을 확인합니다. ffprobe를 출력에 실행하여 지속 시간이 EDL 예상과 일치하는지 확인합니다.

    오디오를 측정하고, 가정하지 마십시오: 통합 라우드니스와 실제 피크를 위한 ffmpeg -i out.mp4 -af ebur128=peak=true -f null -, 섹션별 RMS(대화, 음악 전용, 엔드 카드). 대화보다 15dB 낮은 엔드 카드, 또는 음성보다 큰 효과는 버그입니다. 들을 수 없습니다: 그렇게 말하고 숫자를 보고하십시오.

    사용자가 게시할 모든 것(런칭, 프로모션, 광고)에 대해서는 렌더링된 파일, EDL 및 사용자가 제공한 참조 비디오와 함께 비판 서브 에이전트 하나를 생성하십시오. 칭찬이 아닌 혹평을 하도록 브리핑하십시오: 평결, 시간 코드와 증거(프레임, 레벨)가 포함된 순위가 매겨진 문제점, 그리고 먼저 해야 할 5가지 수정 사항. 새로운 시각은 작성자가 더 이상 보지 못하는 것을 포착합니다 — 끊긴 페이오프 라인, 0.5초 밈, 전화기 크기에서 읽을 수 없는 28px 텍스트.

    어떤 것이든 실패하면: 수정 → 재렌더링 → 재평가. 자체 평가 패스를 3회로 제한하십시오 — 3회 후에도 문제가 남아 있으면, 무한 루프를 도는 대신 사용자에게 플래그를 지정하십시오. 자체 평가가 통과된 경우에만 미리보기를 제시하십시오.

  8. 반복 + 유지. 자연어 피드백을 받고, 재계획하고, 재렌더링합니다. 절대 재전사하지 마십시오. 확인 시 최종 렌더링. project.md에 추가합니다.

컷 크래프트 (기법)

  • 오디오 우선. 후보 컷은 단어 경계와 침묵 간격에서 나옵니다.
  • 피크 유지. 웃음, 결정적 한마디, 강조 비트. 펀치라인 너머로 확장하여 반응을 포함하십시오 — 웃음 자체가 비트입니다.
  • 화자 전환은 발언 사이에 공기가 있는 것이 좋습니다. 일반적인 값: 400–600ms. 빠른 진행 영상은 더 적게, 시네마틱 영상은 더 많이. 취향 결정.
  • 웃음과 반응은 태깅되지 않습니다(whisper는 오디오 이벤트를 내보내지 않습니다). timeline_view 파형에서 말이 없지만 큰 소리가 나는 구간으로 찾으십시오. 그 너머로 확장하십시오 — 웃음 자체가 비트입니다.
  • 침묵 간격은 컷 후보입니다. 값은 200–800ms가 좋습니다. 콘텐츠에 따라 다릅니다: 증언 광고는 더 타이트하고, 인터뷰는 더 느슨합니다. 취향 결정.
  • B-롤과 제품 샷은 scenes.py로 큐를 잡으십시오. 각 샷의 시작과 끝 전사본 타임스탬프를 takes_packed.md에 추가하라는 요청을 받지 않았더라도 추가할 가치가 있습니다.

변형

동일한 푸티지의 여러 편집 — 예를 들어, 16:9 가로 버전과 9:16 세로 버전. 다음과 같이 작업하십시오:

  1. 가로 버전을 먼저 편집하십시오(모든 테이크 선택, 컷, 페이싱은 여기서 완성).
  2. 각 변형에 대해 별도의 EDL 파일을 생성하십시오: edl_9x16.json, edl_1x1.json. 동일한 takes_packed.md를 공유합니다.
  3. EDL에서 canvas를 해당 종횡비로 설정하십시오.
  4. validate_edl.py --fix를 각각 실행하십시오.
  5. reframe.py를 실행하고(얼굴이 화면 중앙에 오도록) 필요에 따라 분할하십시오.
  6. 각 변형을 완전히 독립적으로 렌더링하십시오: 한 변형의 render.py 인스턴스는 다른 것을 알 필요가 없습니다.

오버레이와 자막은 상대 좌표를 사용합니다: 모든 좌표는 캔버스 크기에 대해 0–1입니다. 따라서 재구성 시 자동으로 조정됩니다(그렇지 않은 경우에만 수정하십시오).

정보 파일과 템플릿

  • edit/project.md — 세션 메모리. 각 세션이 추가됩니다. 템플릿:
# 프로젝트: <brief>
## 세션 YYYY-MM-DD
- **요청**: "…"
- **전략 합의**: "…"
- **EDL**: `<stem>.json` (확인됨)
- **렌더링 상태**: 초안 / 미리보기 완료 / 최종
- **참조**: `animations/slot_<id>/`의 스크린샷
  • takes_packed.md — 자동 생성, 다음과 같이 시작:
# 소스 개요
## take_A.mp4
[0.0–1.2] 네 안녕하세요 [silence 0.8]
[2.0–4.5] 오늘은 새 기능에 대해 말씀드리려고 합니다 [silence 0.3]
[4.8–6.2] 정말 대단합니다 [silence 1.5]
[7.7–9.0] 자 이제 시작해볼까요 [silence 0.6]
   --- 침묵 ≥0.5s에서 분할 ---
[9.6–11.2] 그래서 제가 생각하기에 [silence 0.4]
…
  • edl.json — 작업 예제:
{
  "sources": {
    "take_A": {
      "file": "/path/to/take_A.mp4",
      "fps": 30.0
    }
  },
  "canvas": {"width": 1080, "height": 1920},
  "segments": [
    {
      "id": 0,
      "source": "take_A",
      "start_s": 0.0,
      "end_s": 1.5,
      "grade": null,
      "overlays": [
        {
          "type": "image",
          "file": "animations/slot_0/render.mp4",
          "start_s": 0.5,
          "end_s": 2.0,
          "x": 0.15,
          "y": 0.75,
          "scale": 0.3
        }
      ],
      "crop_x": 0.0,
      "crop_y": 0.0
    }
  ]
}

validate_edl.py --fix는 자동으로 채울 수 있는 누락된 키를 추가합니다(crop, grade, start_offset). 수동으로 grade나 정적 crop을 설정하는 것은 그대로 유지됩니다.

에이전트 사용 패턴

이 스킬 내에서 멀티 에이전트 협업:

편집 서브 에이전트 브리핑

EDL을 생성하도록 서브 에이전트에 위임할 때, 다음과 같이 브리핑하십시오:

EDL을 만들어 줘. <source_ids> 사용, <start_range>에서 <end_range>까지. take_B.mp4의 <specific_take_time> 부분을 사용해야 해 — 그 한 마디가 핵심이야. 그걸로 시작하고, 필요하면 <other_details>를 추가해. sources 섹션은 내가 처리할게 — 세그먼트에 <stem>만 채워 넣으면 돼. 이 타임코드 부분이 확실하지 않아 — timeline_view를 확인해 봐. JSON만 출력해, 설명은 필요 없어.

비판 서브 에이전트 브리핑

자체 평가 중에 사용하십시오:

이 렌더링은 <설명>을 위한 최종본이 될 거야. 혹평해 줘. 중요한 문제부터 순서대로 나열해. 각각 시간 코드, 이게 문제인 이유(첫 번째 시청자가 인지하지 못할 수 있는 부분 포함), 증거(프레임, 오디오 레벨), 해결 방법을 포함시켜 줘. 틀렸거나 과장된 건 없어야 해 — 확실하지 않으면 말해 줘.

하드웨어 메모

  • whisper.cpp는 GPU를 포화시킵니다. 8분 영상은 대략 8초면 전사됩니다.
  • Hyperframes는 npm을 한 번만 다운로드하며, 이후에는 캐시됩니다.
  • 합리적인 길이의 편집(예: 5분 클립에서 60초 광고)은 2분 미만의 월 클록으로 렌더링되어야 합니다.
  • 3개 이상의 동시 애니메이션 서브 에이전트는 GPU/CPU 메모리를 포화시킬 수 있습니다. 한 번에 2–3개의 애니메이션 슬롯으로 유지하고 대기열을 사용하십시오.
  • ffmpeg 오디오 분석은 느릴 수 있습니다(출력의 실시간 길이의 ≈0.3배). 인내심을 가지십시오.
  • timeline_view는 이미지 하나에 안전하게 필름스트립 PNG를 생성해야 합니다.
  • YuNet 얼굴 감지는 180p로 다운스케일링됩니다. 실패는 새로 고침만 하면 됩니다.
  • 비교적 자주 하드웨어 전력에 도달하게 됩니다. LLM(편집 명령)과 ffmpeg(실제 픽셀 처리)는 서로 다른 리소스에 경합합니다. 동시 작업을 관리하십시오.

관련 스킬