긴 영상에서 쇼츠를, URL 하나로 광고 영상을 — 쇼츠 자동 제작 두 가지를 만들고 알게 된 것
쇼츠를 자동으로 만드는 도구를 두 종류 만들었다. 하나는 긴 유튜브 영상을 넣으면 볼 만한 구간만 잘라 세로 영상으로 바꿔 주는 YT Shorts Factory, 다른 하나는 웹사이트 주소 하나를 넣으면 그 사이트의 광고 쇼츠를 만들어 주는 Promo Shorts다. 둘 다 지금 데모로 돌아가고 있다. 이 글은 두 개를 만들면서 실제로 겪은 것과, 끝내 자동화가 안 되더라는 것을 정리한 기록이다.

첫 번째 — 긴 영상을 자르는 쪽
구조는 단순하다. 유튜브 URL을 넣으면 yt-dlp로 영상을 받고, faster-whisper로 말소리를 자막으로 받아쓰고, 그 자막을 LLM이 읽어 “쇼츠로 만들기 좋은 구간"을 고른다. 고른 구간을 잘라 세로로 맞추고 자막을 입혀 FFmpeg로 조립한다. 다운로드부터 조립까지 일곱 단계가 한 번에 돈다.
만들면서 제일 먼저 부딪힌 건 “세로로 맞춘다"는 말이 콘텐츠마다 다르다는 점이었다. 말이 많은 영상은 얼굴을 따라 크롭하고 큰 자막을 붙이면 된다. 그런데 내 여행 영상은 34분 동안 말한 단어가 225개였다. 이런 영상을 억지로 세로로 크롭하면 풍경이 잘려 나간다. 그래서 말 밀도를 재서 형식을 자동으로 고르게 했다. 말이 적으면 가로 영상을 확대하지 않고 가운데에 그대로 두고, 위아래 띠에 제목과 장소를 넣는 레터박스형. 말이 많으면 얼굴 크롭과 키네틱 자막. 내 경우 “16:9를 9:16으로 크롭·확대하지 않는다"가 가장 양보 못 하는 규칙이 됐다.
LLM은 처음에 로컬 Ollama로 돌리려 했다. 무료라서다. 그런데 로컬 모델이 하이라이트 분석에서 5분 타임아웃을 내서 결국 OpenRouter로 돌렸고, 영상 한 편 분석에 1.4원 정도가 들었다. 비용은 문제가 아니었다. 문제는 품질이었다. 로컬 모델은 풍경 영상 제목에 “빌런” 같은 엉뚱한 단어를 넣기도 했다. 원본 영상에 박힌 워터마크는 어떻게 해도 지울 수 없었고, 한계로 받아들였다.
두 번째 — URL 하나로 광고를 만드는 쪽
이쪽은 기존 영상을 자르는 게 아니라 영상을 새로 만든다. 사이트 주소를 넣으면 크롤러가 페이지를 읽어 “이 사이트는 이런 걸 한다"는 요약 카드를 내놓고, LLM이 첫 3초가 서로 다른 훅 3안과 장면별 나레이션을 쓴다. 그다음 Playwright가 실제 화면을 녹화하면서 나레이션이 말하는 섹션으로 스크롤해 금색 테두리로 강조하고, TTS 나레이션과 단어별로 튀어나오는 자막, 나레이션이 나올 때 알아서 작아지는 BGM을 ffmpeg로 합친다. 마지막에 해상도·길이·광고 표현 리스크를 검사한 리포트를 보고 사람이 승인해야 업로드 패키지가 나온다.
첫 파일럿은 내 경매 분석 서비스로 돌렸다. 훅 3변형이 한 번에 렌더됐고 LLM 비용은 편당 84원 정도였다. 다만 첫 결과물은 38초로 목표(20~25초)를 한참 넘겨 장면 수를 줄여야 했고, 그렇게 다듬은 두 번째 버전이 28초대로 나왔다.
광고에서 지키기로 한 세 가지
광고 영상은 일반 쇼츠와 달리 “말을 지어내면 안 된다"는 제약이 핵심이다. 그래서 세 가지를 도구 안에 박았다.
- 과장 금지 — “최저가 보장”, “100% 효과” 같은 표시광고법 위험 표현은 자동으로 걸린다.
- 실존 문구 원칙 — 대본의 모든 주장은 크롤한 페이지에 실제로 있는 문장만 허용한다. 나레이션이 가리키는 화면도 입력한 사이트와 데모 페이지로만 제한했다. 한번은 사이트 공용 메뉴 페이지가 광고에 섞여 들어와서, 크롤 단계·콘티 프롬프트·렌더 직전 기계 검증 세 겹으로 막았다.
- AI 제작 고지 — 모든 영상의 마지막 CTA 카드 하단과 유튜브 설명란에 “AI가 자동 제작했습니다"를 넣는다. 이건 한 번도 빠뜨리지 않게 코드가 강제로 삽입한다.
처음엔 고지를 넣었다고 생각했는데 실제 영상에서 확인이 안 된 상태가 한동안 있었다. 점검 목록을 만들 때 이게 상용화를 막는 구멍 1순위로 올라왔고, 그 뒤로는 승인 화면에서 눈으로 확인한다.
자동화가 안 되더라는 것들
영상이 자동으로 나오는 것과 “쓸 만한 영상"이 나오는 것은 달랐다. 렌더 과정에서 잡은 사고가 꽤 된다. 녹화 장면에 줌 효과를 넣었더니 글자가 미세하게 떨려 어지러웠고, 결국 녹화 장면엔 줌을 금지했다. 같은 파일 이름에 영상을 다섯 번 덮어썼더니 크롬이 옛 조각과 새 파일을 섞어 재생해 “두 영상이 겹친” 것처럼 깨졌다. 파일 자체는 멀쩡했는데 브라우저 캐시가 범인이었다. 에러 페이지를 감지해 홈으로 이동하는 방어를 넣었는데도 에러 화면이 영상 앞부분 1~2초에 남았다. 녹화가 브라우저 컨텍스트를 만드는 순간부터 시작되기 때문이었다. 이 뒤로 장면당 한 프레임만 보는 검사는 버리고, 1초 간격 콘택트 시트로 전 프레임을 훑는 걸 표준으로 삼았다.
더 근본적인 건 “사람의 피드백이 규칙을 못 이기는” 문제였다. 콘티를 반려하면서 “이 페이지를 보여 달라"고 적어도 LLM이 기본 규칙(소개 페이지는 보조로만)을 우선해 같은 콘티를 내놓았다. 프롬프트에 “감독 피드백은 모든 기본 규칙보다 우선한다"를 명시하고 나서야 고쳐졌다. 자동화 파이프라인에서 시스템 규칙과 사람 지시의 우선순위를 써 두지 않으면 규칙이 이긴다는 걸 여기서 배웠다.
목소리도 한계가 있었다. 무료 TTS는 금방 천장이 보였다. 최근 내 목소리를 녹음해 클론 나레이션을 붙이는 어댑터까지 만들었지만, 클로닝은 GPU가 있는 집 PC에서만 돌아 운영 기본값은 아직 일반 TTS다.
쇼츠 형식 자체도 따로 배웠다
쇼츠를 만들다 보니 “잘 되는 쇼츠의 모양"도 따로 정리하게 됐다. 영화 명장면 채널 세 곳을 픽셀 단위로 실측했더니 공통 구조가 있었다. 1080×1920에 상단 띠 제목 두 줄, 자막은 한 줄 14자 이내로 12초마다 교체, 길이는 49129초. 해설형은 내레이션 사이가 무음이 되면 이탈하니 BGM을 반드시 깔고, 자막 타이밍은 음성을 먼저 만든 뒤 그 길이에서 뽑는다. 이 규격은 공용 도구로 굳혀 두었다. 단, 가져온 건 화면 구성과 제목 문법뿐이다. 소재는 저작권이 만료됐거나 권리가 확인된 영상만 쓴다.
세 번째는 접었다
주제부터 대본까지 새로 만들어 내는 “호기심 쇼츠” 파이프라인도 있었다. 한글 폰트 미지정과 자동 줄바꿈 부재라는 버그 두 개만 고치면 살릴 수는 있었다. 그런데 사업성을 따져 보니 “AI가 양산한 쇼츠 채널로 수익"이라는 그림이 약했다. 시장은 포화였고 유튜브는 AI 양산 콘텐츠 수익화를 조이고 있었다. 코드는 보존하고 접었다.
지금 남은 것
두 도구 모두 실험실에서 데모를 볼 수 있다. 쇼츠 팩토리는 1차 체크포인트 이후 큰 변경 없이 봉인 상태고, Promo Shorts는 파일럿 최종 승인과 채널 업로드가 내 손에 남아 있다. 만들고 나서 분명해진 건 하나다. 편당 백 원 미만으로 영상이 나오는 시대지만, 무엇을 보여 줄지 고르고 마지막에 승인하는 자리는 여전히 사람 몫이라는 것.
이 글은 제 여행 기록과 작업 로그를 바탕으로 초안을 AI와 함께 정리하고, 직접 편집했습니다.