이 파이프라인을 소개하는 영상은, 바로 이 파이프라인이 만들었습니다. 사람이 타임라인을 만진 적이 없습니다.
작은 웹앱을 여러 개 운영하는데, 각 앱마다 SaaS 툴을 잔뜩 결제하거나 클립 하나에 저녁 한 번씩 편집기를 붙잡지 않고도 짧은 홍보·콘텐츠 영상을 뽑고 싶었습니다. 그래서 파이프라인을 짰습니다. 텍스트를 넣으면, 업로드 가능한 세로 영상이 나옵니다. 정확히 어떻게 도는지, 그리고 대부분의 "자동화" 글이 빼먹는 부분 — 이게 실제로 무엇을 해결했고 무엇을 못 했는지까지 적습니다.
스택 (외부 계정 0개)
전부 무료, API 키 없음, 외부로 신호 보내는 것 없음:
- edge-tts — TTS. 무료, 키 불필요, 목소리 수십 종.
- cairosvg — SVG 아이콘/마크를 투명 PNG로 래스터화(ffmpeg는 SVG 직접 입력 불가).
- ffmpeg — 전부를 1080×1920 H.264로 합성. 시스템 ffmpeg와 씨름하지 않으려고
imageio-ffmpeg파이썬 패키지로 검증된 static 바이너리를 씁니다.
마지막 선택이 보기보다 중요합니다 — 뒤에서 다시.
명령어 하나로 4단계 렌더 — 약 40초에 1080×1920 숏츠 하나.
네 단계
1. 스크립트 → 평문 텍스트
모든 영상은 작은 스크립트 파일에서 시작합니다: 훅 한 줄, 베네핏 한 줄, CTA 한 줄. 평문으로 두면 이후 파이프라인이 결정론적이고 diff도 됩니다.
2. 텍스트 → 음성 (edge-tts)
edge-tts \
--voice ko-KR-SunHiNeural \
--text "$(cat script.txt)" \
--write-media voice.mp3 \
--write-subtitles voice.srt좋은 점: edge-tts가 SRT까지 써줘서 자막 타이밍이 공짜로 나옵니다. 한국어는 word-break: keep-all 규칙으로 줄바꿈해 자막이 어절 중간을 자르지 않게 합니다.
3. 음성에 맞춘 자막
SRT가 같은 합성 패스에서 생성되므로 자막 세그먼트가 이미 음성과 정렬돼 있습니다. 수동 타이밍도, whisper 단계도 없습니다. 합성 시점에 세그먼트를 재스타일(라인별·크게·고대비)만 합니다.
4. ffmpeg로 합성
레이아웃은 훅 카드 → 앱 스크린샷 컷 → CTA를 크로스페이드로 잇고, 폰 목업 프레임, 컷마다 미세 줌(zoompan), 온스크린 자막, 그리고 음성 아래로 사이드체인 더킹되는 음악 베드를 얹습니다.
ffmpeg -i bg.mp4 -i voice.mp3 \
-filter_complex "[0:v]scale=1080:1920,zoompan=z='min(zoom+0.0005,1.1)':d=125[v]" \
-map "[v]" -map 1:a -c:v libx264 -preset veryfast -crf 22 -t 9 out.mp4결과: 1080×1920, H.264, 약 9초, 렌더는 대략 실시간의 1.5배. 수십 개 배치가 제 머신에서 약 10분 컴퓨트입니다.
시간을 실제로 잡아먹은 함정 두 개
overlay에는alpha=옵션이 없다. 레이어를 페이드인하려면 오버레이가 아니라 소스를fade=alpha=1로 페이드해야 합니다. 있을 거라 넘겨짚고 한 시간 날렸습니다.- 시스템 ffmpeg가 조용히 깨져 있었다(공유 라이브러리 soname 드리프트). 게다가 흔한 다운로드 미러가 제 네트워크에서 DNS 차단.
imageio-ffmpeg로 static 바이너리를 당겨 둘 다 우회했습니다. 최신 파이썬에서는 영상 관련 wheel 컴파일에 거는 것보다 static ffmpeg에 거는 게 낫습니다.
거의 공짜로 다국어
같은 스크립트를 다시 보이스로 뽑으면 언어 변형이 나옵니다. 함정은 폰트: CJK 시스템 폰트는 경로에 공백·비ASCII 문자가 있어 ffmpeg drawtext가 깨집니다. 해결: 폰트를 ASCII 이름 파일로 복사하고 drawtext가 그걸 가리키게 합니다. 그러면 일본어도 깔끔하게 렌더됩니다 — 두부박스 없음.
솔직한 부분: 병목은 애초에 제작이 아니었다
"돈 찍는 기계" 장르 전체에 반론을 걸고 싶은 지점이 여기입니다. 맞습니다, 이제 저녁 한 번이 아니라 몇 초 만에 완성 숏츠를 뽑습니다. 하지만 영상을 만드는 일이 결과와 저 사이를 막고 있던 게 아니었습니다. 도달이었습니다. 50개를 뽑는 파이프라인이 50개 분량의 조회수를 주지 않습니다 — 알고리즘·니치·플랫폼 진정성 정책이 그걸 정하고, 그것들은 제가 얼마나 빨리 렌더했는지 신경 쓰지 않습니다.
이건 실제로 게시하고 숫자를 읽고 나서야 알았고, 그건 별도의 글입니다. 하나만 가져가신다면: 자동화가 돈을 벌어주는 게 아니라, 시도의 비용을 낮추려고 제작을 자동화하는 겁니다.