음성 해설 + 자막 포함 쇼트 비디오
파이프라인: 스크립트 .txt → make_video.py (edge-tts가 각 문장 읽기 → 오디오 병합 → 실제 지속 시간에 맞춘 ASS 자막 → 배경 + ffmpeg로 자막 합성) → MP4 1080x1920.
확정 모드: 기존 음성 → 비디오 (사용자가 mp3를 보내면 기본값)
사용자가 EverAI(웹, 속도 0.85)에서 음성을 생성하고, mp3 + 대사를 보냅니다. API 호출, 음성 복제, 로컬 음성 모델(VieNeu) 실행하지 않습니다.
- 대사를 쉼표/마침표/"..."로 구분된 짧은 구문으로 나누어
.txt파일로 저장합니다.#행,[icon]태그는 없어야 합니다. python3 make_video.py kichban.txt ~/Downloads/<name>.mp4 --audio voice.mp3 --style night --no-wave --bg assets/pho-dem.mp4 --target <length±5>- 각 행의 타임스탬프를 출력합니다(렌더링하지 않음): 위 명령에
--print-timing을 추가합니다. 확인: 글자 수에 비해 비정상적으로 길거나 짧은 행이 있으면 병합/분할 후 다시 렌더링합니다. - 자막을 확인하기 위해 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-fulledge-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.