본문 바로가기
개발이력/2026

AI YouTube Shorts 자동화 파이프라인 — Windows 스케줄러까지 연결한 무인 콘텐츠 생산 시스템

by 2589 2026. 8. 18.
728x90

 

앞선 글들에서는 Electron 기반 POS와 VAN 연동처럼 업무에서 경험한 개발 이야기를 주로 작성했는데, 이번에는 개인적으로 진행하고 있는 프로젝트를 하나 소개해보려고 합니다.

바로 AI를 활용해 YouTube Shorts를 자동으로 생성하고 업로드하는 콘텐츠 파이프라인입니다.

처음 아이디어는 단순했습니다.

"AI에게 대본을 작성시키고, 음성을 만들고, 영상을 합성해서 YouTube에 자동으로 업로드하면 어떨까?"

처음에는 단순한 Python 스크립트 몇 개로 시작했습니다.

하지만 기능을 하나씩 붙이다 보니 어느 순간부터 단순한 스크립트라고 부르기 어려운 형태가 되었고, 현재는 주제 수집부터 AI 대본 생성, TTS, 영상 합성, 썸네일 생성, YouTube 업로드까지 자동으로 수행하는 Pipeline 형태로 구성되어 있습니다.

그리고 현재는 Windows 작업 스케줄러까지 연결하여 정해진 시간에 자동으로 실행되는 상태입니다.


전체 파이프라인

현재 하나의 콘텐츠가 만들어지는 과정은 다음과 같습니다.

[1] 주제 수집
      ↓
[2] Gemini 대본 생성
      ↓
[3] TTS 음성 생성
      ↓
[4] 배경 영상/이미지 수집
      ↓
[5] 영상 + 음성 + 자막 합성
      ↓
[5b] 썸네일 / 메타데이터 생성
      ↓
[6] YouTube 자동 업로드

그리고 이 전체 과정을 Windows 작업 스케줄러가 실행합니다.

Windows Task Scheduler
          │
          │ Scheduled Run
          ▼
    Pipeline Runner
          │
          ▼
   ┌──────┴──────┐
   │             │
 Topic        Config
 Source       / Preset
   │             │
   └──────┬──────┘
          ▼
      AI Pipeline
          │
          ▼
    YouTube Upload

즉, 정해진 시간에 컴퓨터가 켜져 있다면 사람이 직접 실행하지 않아도 콘텐츠 생성부터 업로드까지 진행됩니다.


프로젝트 구조

현재 프로젝트의 구조는 다음과 같습니다.

aiYoutubePipeline/
├─ .env
├─ .env.example
│
├─ core/
│  ├─ interfaces.py
│  ├─ registry.py
│  ├─ script_gen.py
│  ├─ tts.py
│  ├─ compose.py
│  ├─ thumbnail.py
│  ├─ upload.py
│  ├─ auth.py
│  ├─ config.py
│  └─ run.py
│
├─ plugins/
│  ├─ topic/
│  │  ├─ reddit.py
│  │  ├─ local_file.py
│  │  ├─ local_video.py
│  │  └─ stock_movers.py
│  │
│  └─ background/
│     ├─ pexels.py
│     ├─ pixabay.py
│     ├─ pollinations.py
│     ├─ local_media.py
│     ├─ local_video.py
│     └─ mixkit_local.py
│
├─ pipelines/
│  ├─ reddit/
│  ├─ story/
│  ├─ uploadVod/
│  └─ aistock/
│
├─ channels/
├─ assets/
├─ data/
└─ docs/

크게 보면 Core / Plugin / Pipeline 세 영역으로 나눌 수 있습니다.


Core — 공통 로직

core에는 특정 콘텐츠 종류와 상관없이 공통으로 사용할 수 있는 기능들을 모아두었습니다.

예를 들어

script_gen.py
tts.py
compose.py
thumbnail.py
upload.py
auth.py

등이 있습니다.

각각의 역할은 명확합니다.

모듈역할

script_gen.py Gemini 기반 대본 생성
tts.py TTS 음성 및 단어 타이밍 생성
compose.py 영상·음성·자막 합성
thumbnail.py 썸네일 및 메타데이터 생성
upload.py YouTube Data API 업로드
auth.py YouTube OAuth 인증 및 토큰 관리
config.py 환경 및 Pipeline 설정 관리
run.py 전체 Pipeline 오케스트레이션

특히 run.py는 실제 작업 순서를 관리하는 Orchestrator 역할을 합니다.

Topic
  ↓
Script
  ↓
TTS
  ↓
Background
  ↓
Compose
  ↓
Thumbnail
  ↓
Upload

Plugin — 교체 가능한 구현

이 프로젝트에서 가장 신경 쓴 부분 중 하나는 Plugin 구조입니다.

예를 들어 "주제"를 가져오는 방법은 하나가 아닙니다.

현재는

TopicSource
   │
   ├── Reddit
   ├── Local File
   ├── Local Video
   └── Stock Movers

와 같이 구성되어 있습니다.

배경도 마찬가지입니다.

BackgroundProvider
   │
   ├── Pexels
   ├── Pixabay
   ├── Pollinations
   ├── Local Media
   ├── Local Video
   └── Mixkit

이렇게 구성하면 새로운 데이터 소스나 배경 공급원을 추가할 때 기존 Core 로직을 수정할 필요가 없습니다.

예를 들어 새로운 뉴스 API를 붙이고 싶다면 TopicSource를 구현한 Plugin 하나를 추가하면 됩니다.


Pipeline Preset

Plugin을 만들었다고 끝나는 것은 아닙니다.

어떤 콘텐츠를 만들 것인지에 따라 서로 다른 Plugin 조합이 필요합니다.

그래서 pipelines 아래에 Pipeline별 설정을 두었습니다.

현재 대표적으로

reddit
story
uploadVod
aistock

등의 Pipeline이 존재합니다.

예를 들어 Reddit Shorts라면

Reddit
  ↓
Gemini
  ↓
TTS
  ↓
Pexels
  ↓
Compose
  ↓
Thumbnail
  ↓
YouTube

주식 Shorts라면

Stock Movers
  ↓
Gemini
  ↓
TTS
  ↓
Background
  ↓
Compose
  ↓
Thumbnail
  ↓
YouTube

처럼 구성할 수 있습니다.

Core는 그대로 사용하면서 어떤 Plugin을 사용할지만 Pipeline에서 결정하는 구조입니다.


주제 수집

자동 콘텐츠 생산의 첫 단계는 주제를 확보하는 것입니다.

현재는 여러 가지 방법을 지원합니다.

Reddit

Reddit의 인기 게시물을 가져와 콘텐츠의 소재로 사용합니다.

Stock Movers

Finnhub, CoinGecko, 네이버 등의 데이터를 활용해 급등락 종목 등을 수집합니다.

Local File

직접 작성한 텍스트 파일을 Pipeline의 입력으로 사용할 수도 있습니다.

Local Video

직접 업로드한 영상을 Gemini가 분석해서 콘텐츠의 소재로 사용할 수도 있습니다.

이렇게 만들어놓으니 단순히 Reddit Shorts를 만드는 프로그램이 아니라 여러 종류의 콘텐츠를 동일한 Pipeline 구조에서 처리할 수 있는 시스템이 되었습니다.


Gemini로 대본 생성

주제가 준비되면 Gemini를 이용해 Shorts용 대본을 생성합니다.

기본적인 흐름은 단순합니다.

Topic
 ↓
Gemini
 ↓
Script

하지만 실제로는 단순히 "이 내용을 대본으로 만들어줘"라고 요청하는 것보다 콘텐츠 종류에 따라 Prompt를 별도로 관리하는 것이 중요했습니다.

예를 들어 스토리 콘텐츠와 주식 콘텐츠는 원하는 대본의 구조가 완전히 다릅니다.

그래서 Pipeline에 따라 서로 다른 Prompt와 설정을 사용할 수 있도록 구성했습니다.


TTS와 자막

대본이 만들어지면 edge-tts를 이용해 음성을 생성합니다.

여기서 단순히 MP3 파일만 만드는 것이 아니라 Word Boundary를 이용해 단어별 타이밍 정보도 함께 확보합니다.

Script
  ↓
edge-tts
  ├── voice.mp3
  └── word timing

이 데이터는 이후 자막을 생성할 때 활용합니다.

결과적으로 음성의 실제 재생 타이밍에 맞춰 자막을 표시할 수 있습니다.


배경 영상

배경 영상 역시 자동으로 확보합니다.

현재는

  • Pexels
  • Pixabay
  • Pollinations
  • 로컬 미디어
  • 직접 업로드한 영상
  • 미리 다운로드해둔 Mixkit 영상

등을 사용할 수 있습니다.

특히 모든 콘텐츠가 같은 배경을 사용할 필요는 없기 때문에 배경 공급원을 Plugin으로 분리한 것이 꽤 유용했습니다.


영상 합성

이제 실제 Shorts 영상을 만듭니다.

FFmpeg와 MoviePy를 활용하여

Background
    +
Voice
    +
Subtitle
    ↓
Final MP4

형태로 합성합니다.

여기서는 영상 길이, 화면비, 자막 위치, 음성 길이 등을 처리합니다.

특히 Shorts는 세로 영상이 기본이기 때문에 원본 배경 영상의 화면비가 다른 경우를 고려해야 합니다.

일반적인 배경은 Crop 방식으로 처리할 수 있고, 직접 업로드한 영상처럼 원본 화면을 최대한 보존해야 하는 경우에는 Blur Pad 방식도 사용할 수 있도록 구성했습니다.


YouTube 자동 업로드

영상이 만들어졌으면 이제 YouTube에 업로드합니다.

YouTube Data API v3를 사용하고 있으며, 채널별 OAuth 인증 정보를 별도로 관리합니다.

Channel
  ↓
OAuth 인증
  ↓
Token
  ↓
YouTube Data API
  ↓
Video Upload

OAuth 인증은 최초 한 번만 사용자 동의 과정을 거치고 이후에는 저장된 Token을 이용해 자동으로 인증하도록 구성했습니다.

덕분에 Pipeline이 실행될 때 사람이 브라우저에서 매번 로그인할 필요가 없습니다.


그리고 Windows 작업 스케줄러

개인적으로 이 프로젝트에서 자동화의 완성도를 한 단계 높여준 부분입니다.

Pipeline을 아무리 잘 만들어도 매번 직접 실행해야 한다면 완전한 자동화라고 하기 어렵습니다.

그래서 Windows 작업 스케줄러에 Pipeline 실행 명령을 등록했습니다.

예를 들어 특정 시간에 Reddit Pipeline을 실행하도록 설정하면,

정해진 시간
    ↓
Windows Task Scheduler
    ↓
Python Pipeline 실행
    ↓
주제 수집
    ↓
Gemini 대본 생성
    ↓
TTS
    ↓
배경 수집
    ↓
영상 합성
    ↓
썸네일 생성
    ↓
YouTube Upload

전체 과정이 자동으로 진행됩니다.

즉, 사람이 직접

"오늘 영상 만들어야지."

라고 생각하고 프로그램을 실행할 필요가 없습니다.

스케줄러가 알아서 Pipeline을 실행합니다.


무인 실행에서 중요했던 것들

수동으로 실행할 때는 문제가 조금 있어도 바로 확인할 수 있습니다.

하지만 자동 실행에서는 이야기가 다릅니다.

새벽에 Pipeline이 실행됐는데 실패했다고 해서 컴퓨터 앞에 앉아 있을 수는 없기 때문입니다.

그래서 자동화하면서 특히 신경 쓴 부분이 실행 단위(Job)와 산출물 관리입니다.

각 실행마다 Job ID를 만들고 결과물을 별도 디렉터리에 저장합니다.

data/
└── reddit/
    └── <job_id>/
        ├── topic.json
        ├── script.json
        ├── voice.mp3
        ├── background.mp4
        ├── final.mp4
        ├── thumbnail.jpg
        └── upload.json

덕분에 나중에

"어제 자동으로 만들어진 영상은 어떤 과정으로 만들어졌지?"

라는 상황에서도 해당 Job의 산출물을 확인할 수 있습니다.


부분 실행도 가능하게 만들었다

자동화 시스템을 만들면서 중요하게 생각한 또 하나는 전체 Pipeline을 처음부터 다시 실행하지 않아도 되는 것입니다.

예를 들어 TTS는 정상적으로 생성됐는데 영상 합성 단계에서 문제가 발생했다고 해보겠습니다.

이때 처음부터

Reddit
→ Gemini
→ TTS
→ ...

를 다시 실행하는 것은 비효율적입니다.

그래서 Pipeline을 단계별로 실행할 수 있도록 구성했습니다.

[1] Topic
[2] Script
[3] TTS
[4] Background
[5] Compose
[6] Upload

필요하다면 특정 단계부터 다시 실행할 수 있습니다.

이런 구조 덕분에 개발 과정에서도 상당히 편했습니다.


현재 만들어진 Pipeline

현재는 하나의 콘텐츠 형태에만 집중하지 않고 여러 Pipeline을 만들어두었습니다.

┌───────────────────────────────────────┐
│              Pipelines                │
├───────────────────────────────────────┤
│ reddit                                │
│ story                                 │
│ uploadVod                             │
│ aistock                               │
└───────────────────────────────────────┘

각 Pipeline은 서로 다른 목적을 가지고 있지만 내부적으로는 동일한 Core를 공유합니다.

이게 Plugin + Pipeline 구조의 가장 큰 장점입니다.

새로운 콘텐츠를 추가하더라도 기존 영상 생성 로직을 다시 만들 필요가 없습니다.


재미있었던 확장 — 내 영상을 AI가 이해하게 만들기

최근에는 여기서 한 단계 더 확장했습니다.

단순히 인터넷에서 주제를 가져오는 것뿐만 아니라 내가 가지고 있는 영상 자체를 AI에게 이해시키는 기능을 추가했습니다.

예를 들어 내가 게임 영상 하나를 넣으면

Local Video
    ↓
ffprobe
    ↓
Gemini Video Understanding
    ↓
영상 내용 분석
    ↓
AI Narration
    ↓
TTS
    ↓
영상 합성
    ↓
YouTube Upload

과정을 거치게 됩니다.

즉,

"영상을 넣으면 그 영상에 맞는 AI 내레이션 Shorts를 만들어주는 Pipeline"

입니다.

이 기능을 구현하면서 AI 영상 이해와 기존의 TTS/영상 합성 Pipeline을 결합할 수 있었습니다.


영상 길이는 오디오를 기준으로

이 과정에서 재미있는 설계 결정도 있었습니다.

영상과 AI 내레이션의 길이가 항상 일치하지 않습니다.

예를 들어

원본 영상 : 15초
AI 음성   : 22초

일 수도 있습니다.

이번 구현에서는 오디오를 Master Clock으로 사용하기로 했습니다.

즉,

영상에 음성을 맞추는 것이 아니라 음성에 영상을 맞춘다.

는 방식입니다.

Voice
  │
  │ Master Clock
  ▼
Video
  ├── 부족하면 Loop
  └── 길면 Trim

그리고 원본 영상의 화면비를 유지하기 위해 Blur Pad 방식도 적용했습니다.

덕분에 가로 영상이나 정사각형 영상을 Shorts 배경으로 사용할 때 중요한 부분을 강제로 잘라내지 않아도 됩니다.


현재 상태

현재 프로젝트는 이미 실제로 자동 실행되는 상태입니다.

정리하면 다음과 같습니다.

┌─────────────────────────────────────┐
│       Windows Task Scheduler        │
└─────────────────┬───────────────────┘
                  │
                  ▼
          Pipeline Runner
                  │
        ┌─────────┴─────────┐
        ▼                   ▼
   Topic Plugin         Pipeline Config
        │                   │
        └─────────┬─────────┘
                  ▼
            Gemini / TTS
                  │
                  ▼
          Background Provider
                  │
                  ▼
             FFmpeg
                  │
                  ▼
           Thumbnail
                  │
                  ▼
        YouTube Data API
                  │
                  ▼
            🎬 Upload

즉 현재는 사람이 직접 실행하지 않아도 정해진 시간에 콘텐츠를 생성하고 YouTube에 업로드하는 수준까지 자동화되어 있습니다.


앞으로는 "자동화"보다 "관리"를 개선하려고 한다

자동 실행 자체는 이미 Windows 작업 스케줄러를 통해 해결되어 있습니다.

그래서 다음 단계에서 고민하고 있는 것은 자동 실행 기능 자체가 아니라 관리 편의성입니다.

현재는 여러 Pipeline과 채널을 CLI와 설정 파일 중심으로 관리하고 있기 때문에, 이를 하나의 로컬 프로그램에서 관리할 수 있도록 확장할 계획입니다.

예를 들면

[프로젝트]

📈 주식 Shorts
   ├─ Pipeline : aistock
   ├─ Schedule : 매일 10:00
   └─ Channel : Stock Channel

🔥 Reddit Shorts
   ├─ Pipeline : reddit
   ├─ Schedule : 매일 14:00
   └─ Channel : Reddit Channel

🎮 Game Shorts
   ├─ Pipeline : uploadVod
   ├─ Schedule : 매일 18:00
   └─ Channel : Game Channel

처럼 여러 프로젝트를 한 화면에서 관리할 수 있도록 만드는 것이 다음 목표입니다.

스케줄러 자체를 새로 만드는 것이 아니라, 기존 Pipeline과 실행 상태를 편하게 관리할 수 있는 GUI를 얹는 것에 가깝습니다.


마무리

처음에는 단순히

Gemini → TTS → FFmpeg → YouTube

정도의 작은 자동화 프로젝트였습니다.

그런데 하나씩 기능을 추가하다 보니

주제 수집
   ↓
AI 대본
   ↓
TTS
   ↓
배경 검색/생성
   ↓
영상 합성
   ↓
자막
   ↓
썸네일
   ↓
YouTube OAuth
   ↓
YouTube 업로드
   ↓
Windows Task Scheduler

까지 연결되었습니다.

그리고 콘텐츠 종류가 늘어나면서 단순히 기능을 계속 붙이는 방식보다는 Core / Plugin / Pipeline으로 구조를 나누게 되었습니다.

현재는 여러 주제 소스와 배경 소스를 교체해서 사용할 수 있고, Pipeline별 설정을 통해 서로 다른 형태의 Shorts를 생성할 수 있습니다.

무엇보다 현재는 Windows 작업 스케줄러까지 연결되어 있어서,

"사람이 영상을 만들고 업로드하는 것"을 자동화하는 것이 아니라, "콘텐츠 생산 과정 자체"를 자동화한 상태

라고 볼 수 있을 것 같습니다.

물론 아직 AI가 만든 콘텐츠의 품질을 사람이 만든 수준까지 끌어올리는 것은 별개의 문제입니다.

하지만 개발 관점에서는 꽤 재미있는 프로젝트였습니다.

AI API를 몇 개 연결하는 것에서 시작해서, 실제로 스케줄러를 통해 무인으로 돌아가는 콘텐츠 생산 Pipeline으로 발전시켜보는 경험을 할 수 있었기 때문입니다.

앞으로는 이 Pipeline을 GUI 기반의 로컬 프로그램으로 만들어 여러 채널과 콘텐츠 프로젝트를 등록하고, 실행 이력과 업로드 결과까지 한눈에 관리할 수 있는 형태로 발전시켜볼 예정입니다.

728x90
반응형

최근댓글

최근글

skin by © 2024 ttuttak