Communitygithub.com

LeAnhTuanIT/short-video

9:16 세로 쇼트 비디오(TikTok/Reels/Shorts)를 모든 주제에 대해 생성하며, 베트남어(또는 다른 언어) 음성 해설과 하드 자막을 지원합니다. Claude가 자체 작성하거나 사용자가 제공한 스크립트를 기반으로 합니다.

short-video란 무엇인가요?

이 스킬은 Claude Code에서 실행되는 쇼트 비디오 생성 파이프라인입니다. 사용자가 스크립트(.txt)를 제공하거나, Claude가 주제 브리핑을 받아 자동으로 스크립트를 작성하면, `make_video.py` 스크립트가 edge-tts(또는 FPT.AI, 로컬 voice.mp3)를 사용해 각 문장을 읽고, 실제 지속 시간에 맞춰 ASS 자막을 생성하며, 배경 비디오/이미지와 오디오를 FFmpeg로 합성해 1080x1920 MP4 파일을 만듭니다. macOS와 Ubuntu/Debian(Windows는 WSL 사용)에서 작동하며, 미리 설치된 ffmpeg-full, edge-tts, pipx가 필요합니다. 사용자는 간단한 명령어나 `/short-video` 명령으로 비디오를 생성할 수 있으며, 음성 파일(예: EverAI 생성)을 업로드해 자막을 입힐 수도 있습니다. 스크립트 지속 시간, 스타일(야간/UI), 배경, 음악 등 다양한 옵션을 지원합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/LeAnhTuanIT/short-video-skill/tree/HEAD

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

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

문서

음성 해설 + 자막 포함 쇼트 비디오

파이프라인: 스크립트 .txt → make_video.py (edge-tts가 각 문장 읽기 → 오디오 병합 → 실제 지속 시간에 맞춘 ASS 자막 → 배경 + ffmpeg로 자막 합성) → MP4 1080x1920.

확정 모드: 기존 음성 → 비디오 (사용자가 mp3를 보내면 기본값)

사용자가 EverAI(웹, 속도 0.85)에서 음성을 생성하고, mp3 + 대사를 보냅니다. API 호출, 음성 복제, 로컬 음성 모델(VieNeu) 실행하지 않습니다.

  1. 대사를 쉼표/마침표/"..."로 구분된 짧은 구문으로 나누어 .txt 파일로 저장합니다. # 행, [icon] 태그는 없어야 합니다.
  2. python3 make_video.py kichban.txt ~/Downloads/<name>.mp4 --audio voice.mp3 --style night --no-wave --bg assets/pho-dem.mp4 --target <length±5>
  3. 각 행의 타임스탬프를 출력합니다(렌더링하지 않음): 위 명령에 --print-timing을 추가합니다. 확인: 글자 수에 비해 비정상적으로 길거나 짧은 행이 있으면 병합/분할 후 다시 렌더링합니다.
  4. 자막을 확인하기 위해 1~2개의 프레임을 추출하고, 경로와 지속 시간을 보고합니다. 소리가 들리지 않으면 일반적으로 Mac이 AirPods으로 출력하기 때문입니다. 사용자 안내: HUONG-DAN.md.

다른 기기에 설치

~/.claude/skills/short-video/ 폴더 전체를 새 기기(동일한 경로)에 복사한 후, bash ~/.claude/skills/short-video/setup.sh를 실행합니다. macOS 및 Ubuntu/Debian을 지원하며, Windows는 WSL을 통해 사용합니다. 기본 야간 배경: assets/pho-dem.mp4 (Mixkit 스톡, 상업적 사용 가능).

요구 사항 (이 기기에 설치됨)

  • ffmpeg-full (subtitles/libass 필터 필요): brew install ffmpeg-full
  • edge-tts: pipx install edge-tts (네트워크 오류 시 자동으로 say -v Linh 음성으로 대체)

1단계 — 브리핑 확정

요청에서 가져옵니다. 부족하면 기본값 사용, 주제가 완전히 불명확할 때만 질문:

  • 주제/관점 — 구체적인 관점이 없으면 자동으로 흥미롭고 구체적인 관점 선택.
  • 지속 시간 — 기본값 45–60초.
  • 음성 — 기본값 여성 vi-VN-HoaiMyNeural; 남성 vi-VN-NamMinhNeural. 다른 언어: edge-tts --list-voices | grep <code> (예: en-US-AriaNeural).
  • 배경/음악 — 사용자가 제공한 이미지/비디오, 없으면 기본 그라데이션 배경.

2단계 — 스크립트 작성

.txt 파일로 저장, 첫 행은 제목, 이후 각 행은 1문장:

# 화면 상단에 표시될 짧은 제목 (≤ 6단어)
호기심을 유발하는 훅 문장, ≤ 12단어.
내용 문장...
결말 + 행동 유도.

규칙:

  • 베트남어 길이: ~2.3단어/초 (실측: 155단어 ≈ 65초). 45–60초 → 110–140단어; 30초 → ~65단어; 15초 → ~30단어.
  • 각 행 1문장, 8–20단어. 처음 3초는 훅(질문/놀라운 사실). 중간: 3–5개의 구체적이고 기억하기 쉬운 포인트. 끝: CTA(저장, 팔로우, 댓글).
  • 사실은 정확해야 함. 건강/재정/법률 주제: 진단 금지, 전문가처럼 구체적 조언 금지, 필요 시 전문가에게 문의 제안.
  • 읽기 어려운 숫자/기호는 문자로 표기 ("4-7-8" 대신 "사-칠-팔", "%" 대신 "퍼센트"). 이모지, {} \ 문자는 피합니다.

사용자가 미리 내용을 제공하거나 바로 진행하라고 하지 않는 한, 렌더링 전에 사용자가 스크립트를 검토하도록 합니다.

3단계 — 렌더링

python3 ~/.claude/skills/short-video/make_video.py kichban.txt out.mp4 \
  [--voice vi-VN-HoaiMyNeural] [--rate -5%] [--target 45-60] \
  [--bg background_image_or_video] [--music background_music.mp3] [--gap 0.35] \
  [--pitch -8Hz] [--style default|night]
  • 기존 음성: --audio voice.mp3는 TTS를 건너뜁니다. 스크립트는 읽는 대사와 일치해야 하며, 각 행은 짧은 구문(쉼표/마침표로 구분); 문장 타임스탬프는 호흡 정지 지점에 맞춥니다. --print-timing으로 타임스탬프 출력 (일반적으로 ~12–16자/초), 비정상적으로 길거나 짧은 행은 병합/분할 후 다시 렌더링.
  • FPT.AI: --engine fpt --voice leminh (북부 남성; banmai, thuminh 북부 여성, lannhi, linhsan 남부 여성, myan 중부 여성, giahuy 중부 남성). export FPT_API_KEY=... 필요 (키는 console.fpt.ai, Free Tier 월 100,000자). 각 글자의 타임스탬프가 없으므로 카라오케는 글자 길이에 따라 분할; --rate는 atempo로 적용. 절대 키를 스킬 파일에 기록하지 마십시오.
  • 모든 엔진은 사람과 같은 운율을 가짐 (각 문장의 속도/피치가 약간씩 다름, 질문 후 긴 멈춤) + 따뜻한 음성 처리, 압축, 약간의 리버브. 스크립트는 구어체로 작성하고, "..."와 중간 마침표를 사용하여 호흡 정지를 만듭니다.
  • 북부 남성의 낮고 성숙한 음성 (edge): --voice vi-VN-NamMinhNeural --pitch=-8Hz --rate=-10% (NamMinh는 유일한 남성 edge 베트남어 음성).
  • --style night --no-wave + # 행이나 [icon] 태그가 없는 스크립트 → 배경 + 자막만.
  • --style night ("야간 거리" 릴 스타일): 제목은 대문자, 간격 넓게, 청록색 + 밑줄; 얇은 네온 아이콘; 각 글자별 대문자 카라오케 자막 (edge-tts의 실제 타임스탬프 사용); 막대형 오디오 웨이브. 문장 앞에 [icon]을 두어 해당 문장부터 아이콘 변경: sun hourglass gift heart leaf book star eye. 배경은 실제 야간 거리 비디오 권장: Mixkit 무료 스톡 (https://mixkit.co/free-stock-video/night-city-street/, 링크 assets.mixkit.co/videos/<id>/<id>-1080.mp4), 여러 클립을 연결, 세로로 자르기, setpts=1.4*PTS로 느리게 재생.
  • --style ui (기술 튜토리얼 비디오): 어두운 그리드 배경, 시리즈 바 (제목 #) + 단계 1..n 상자, 앱 창 시뮬레이션, 키보드 타자기 터미널, *키워드*를 주황색으로 강조한 자막 상자. 문장 시작 태그: [step:단계 이름] (새 단계로 전환), [card:제목|항목1|항목2] (창, 다음 장면까지 유지), [term:명령어]. 단축키는 문자로 작성 ("커맨드, 시프트, 쓰리"), 카드에는 "Command + Shift + 3"으로 표시. 예시: 음성 vi-VN-NamMinhNeural --pitch=-4Hz --rate=+15% --gap 0.25.
  • --bg가 없으면 → 천천히 움직이는 어두운 청자색 그라데이션 배경 (가벼운 주제에 적합; 활기찬 주제는 배경 이미지/비디오 요청). 이미지 → 느린 줌 효과. 비디오 → 자동 반복.
  • --music은 볼륨 12%로 낮춰지고, 끝에서 페이드아웃.
  • 스크립트가 지속 시간을 출력하고 --target 범위를 벗어나면 경고 → 문장을 추가/제거하거나 --rate를 조정한 후 다시 렌더링.

4단계 — 확인

1프레임을 추출하여 자막이 깨지거나 여백을 넘는지 확인: ffmpeg -v error -y -ss 5 -i out.mp4 -frames:v 1 frame.jpg 실행 후 frame.jpg 읽기. 사용자에게 비디오의 절대 경로와 지속 시간을 알립니다.

스크립트 샘플: 스킬 디렉토리의 example-sleep.txt.

관련 스킬