블로그에 정리해 둔 글을 그냥 두기 아까워서, 글 하나를 60초짜리 세로형 교육용 숏폼 영상으로 만들고 유튜브에 자동으로 올리는 파이프라인을 만들었다. 목표는 세 가지였다. (1) 글을 어떻게 영상 구성으로 바꿀 것인가, (2) 그걸 자동으로 할 수 있는가, (3) 실제 영상 파일로 인코딩해 저장·업로드까지 되는가. 결론부터 말하면 셋 다 된다. 비전공자도 따라올 수 있게, 개념과 내가 헤맨 지점 위주로 정리한다.
전체 그림 먼저
파이프라인은 이렇게 흐른다. 각 단계는 뒤에서 하나씩 풀어 쓴다.
| |
이 전체를 매일 일정 시간에 자동으로 도는 스케줄로 걸어두는 게 마지막 단계다.
준비물: 무료 도구 네 가지
돈 드는 건 없다. 전부 무료다.
- Python — 파이프라인을 묶는 접착제 역할.
- ffmpeg — 이미지와 음성을 합쳐 mp4로 인코딩(영상 파일로 만드는 것)하는 도구. 영상 자동화의 핵심.
- edge-tts — 글자를 사람 목소리로 읽어주는 TTS(Text To Speech). Microsoft의 무료 한국어 음성을 API 키 없이 쓸 수 있다.
ko-KR-SunHiNeural(여성) 같은 목소리가 꽤 자연스럽다. - 화면 만드는 도구 — 두 가지를 다 만들어 비교했다. 뒤에서 설명한다.
Windows라면 ffmpeg는 winget install Gyan.FFmpeg, 나머지는 pip install로 끝난다.
① 글을 “장면 대본"으로 쪼개기
블로그 글은 길다. 60초 숏폼에는 한국어로 대략 320~380자밖에 못 담는다. 그래서 글을 통째로 넣을 수 없고 핵심만 압축해야 하는데, 이 요약·재구성이야말로 AI(LLM)가 제일 잘하는 일이다.
글을 다음처럼 5개 장면으로 나눈 대본(JSON 형식)으로 바꾼다.
- 후킹 (0
3초): 강한 한 줄로 시선 잡기 (“최신 AI 모델, 외우지 마세요”) 24. 핵심 카드: 한 장에 한 개념. 짧은 문장 3개 + 나레이션 - 마무리: 결론 한 줄 + “전체 글은 블로그에서”
각 장면에는 화면에 띄울 글자와, 성우가 읽을 나레이션이 따로 들어간다. 블로그 글의 제목·소제목·표가 자연스럽게 후킹·핵심 카드·계보 도표로 대응된다는 점이 좋았다.
한 가지 팁: 나레이션에서 영어 약어는 한글 발음으로 적어야 TTS가 제대로 읽는다. VLA는 “브이엘에이”, AI는 “에이아이"처럼. 숫자도 “96%“보다 “구십육 퍼센트"로 적으면 자연스럽다.
② 나레이션 음성 만들기
장면별 나레이션 문장을 edge-tts에 넣으면 mp3가 나온다. 명령 한 줄이면 된다. 이 음성의 길이를 재서, 나중에 그 장면 화면을 그 시간만큼 보여주면 화면과 목소리가 자동으로 맞는다.
③ 화면 만들기: 두 가지 방법
세로형(9:16, 유튜브 Shorts 규격)의 카드 이미지를 장면마다 만든다. 두 방식을 다 만들어 비교했다.
- A안 — HTML/CSS로 만들고 캡처: 웹페이지처럼 예쁘게 꾸민 뒤 브라우저로 스크린샷을 찍는다. 한글 타이포와 표·도표가 훨씬 깔끔하다. 교육용에 유리해서 이걸 채택했다.
- B안 — Pillow(파이썬 그림 라이브러리)로 직접 그리기: 브라우저가 필요 없고 가볍다. 담백한 스타일.
여기서 초보가 꼭 만나는 문제 하나. 자막이 화면 폭을 넘어 줄이 깨진다. 글자 길이가 글마다 다르니 고정 폰트 크기로는 안 된다. 그래서 “한 줄에 들어갈 때까지 폰트 크기를 자동으로 줄이는” 로직을 넣었다. 이러면 어떤 글이 와도 자막이 깔끔하게 한 줄로 맞는다.
④ 영상으로 합치기 (ffmpeg)
장면마다 이미지 + 그 장면 음성을 붙여 짧은 클립을 만들고, 클립들을 순서대로 이어 붙이면 하나의 mp4가 된다. 페이드 인 같은 효과도 ffmpeg 옵션으로 넣을 수 있다. 60초 영상이 1~2MB로 가볍게 나온다.
⑤ 유튜브 자동 업로드: 여기가 진짜 삽질 구간
영상 만드는 것보다 유튜브에 자동으로 올리는 인증 과정이 훨씬 까다로웠다. 공식 방법은 YouTube Data API + OAuth 인증이다. 초보가 순서대로 만나는 함정을 그대로 적어둔다.
- Google Cloud에서 API 사용 설정 + OAuth 클라이언트(데스크톱 앱) 만들기. 다운로드한 인증 파일(
client_secret.json)이"installed"로 시작하면 데스크톱 앱(정상),"web"이면 잘못 만든 것. - 앱 이름에 “Google”·“YouTube” 같은 상표명을 넣으면 안 된다. 정책상 거부된다.
- “프로덕션"으로 올리면 오히려 막힌다. 유튜브 업로드는 민감한 권한이라 프로덕션 상태에선 구글 정식 심사를 통과해야 한다. 개인용이면 “테스트” 상태로 두고 내 계정을 테스트 사용자로 추가하는 게 답이다.
- “확인하지 않은 앱” 경고는 차단이 아니다. 테스트 모드에선 이 경고가 정상이다.
고급 → (앱이름)(으)로 이동을 눌러 통과하면 된다. youtubeSignupRequired오류 = 유튜브 채널이 없다는 뜻. 인증은 됐는데 그 구글 계정에 채널이 없으면 올릴 곳이 없다. youtube.com에서 채널을 먼저 만들면 해결된다.- 테스트 모드는 토큰이 약 7일마다 만료된다. 자동화가 일주일에 한 번쯤 끊기므로, 주 1회 인증 명령을 한 번 다시 실행해 토큰을 갱신해 줘야 한다.
참고로 무료 사용량은 하루 10,000 유닛이고 업로드 1건이 1,600 유닛이라, 하루 약 6개까지 올릴 수 있다. 매일 몇 개면 충분하다.
매일 자동 실행: 규칙을 정하다
마지막으로 위 전체를 Windows 작업 스케줄러에 매일 오후 3시로 걸었다. 규칙은 이렇게 정했다.
- 게시된 글만 대상 (초안 제외).
- “블로그 메이킹” 카테고리는 제외 (지금 이 글처럼 블로그 만들기 자체를 다룬 글은 영상으로 안 만든다).
- 오래된 글부터 순서대로 하루 2개씩 처리. 이미 처리한 글은 기록해 두고 다시 만들지 않는다.
- 밀린 글이 다 소진되면, 그다음부터는 새로 올라온 글을 자동으로 집어 처리한다.
한 줄 정리
블로그 글을 숏폼으로 바꾸는 핵심은 “긴 글을 5개 장면으로 압축하는 AI 단계” 와 “이미지+음성을 ffmpeg로 합치는 인코딩” 이고, 진짜 난관은 영상 제작이 아니라 유튜브 OAuth 인증(테스트 모드·채널 생성·토큰 만료) 이다. 이 셋만 넘으면 매일 자동으로 도는 숏폼 공장이 완성된다.
실제 결과물 — 이 글이 이렇게 숏폼이 됐다
아래 원본 글 하나가, 위에서 설명한 파이프라인을 거쳐 60초짜리 세로 영상으로 자동 변환됐다. 긴 글이 어떻게 5개 장면으로 압축됐는지 원본과 나란히 보면 감이 온다.
- 원본 글: 피지컬 AI, 최신 모델을 외우지 말고 ‘흐름’을 읽어라
- 결과 숏폼: 이 파이프라인으로 처음 업로드한 영상 (아래)