TRENDSHIFT #3 · 2026.05.28 · HARRY0703

MoneyPrinterTurbo — "주제 한 단어"로
1080p 숏폼을 뽑아주는 AI 비디오 공장

50k 스타 · 7.1k 포크 · MIT · Python 97.8%. 영어 원조 MoneyPrinter(소규모 스크립트)를 중국 개발자 harry0703이 MVC 아키텍처 풀스택 앱으로 재설계한 프로젝트. 한 줄 주제만 던지면 LLM이 대본을 쓰고 → TTS가 더빙하고 → Pexels/Pixabay에서 무료 영상을 다운받고 → Whisper가 자막을 박고 → BGM을 깔아 → 9:16 또는 16:9 mp4로 합성해주는 7단계 파이프라인이 통째로 들어있다. Streamlit Web UI + FastAPI REST API + Docker Compose 모두 기본 제공.

1프로젝트 한줄 요약

"이 레포가 정확히 뭘 하는가"부터 한 문장으로
ONE-LINER

"주제 한 단어 + 클릭 한 번"이면 끝나는 풀 자동 숏폼 비디오 생성 파이프라인 — 대본·더빙·영상 소싱·자막·BGM·합성까지 7단계를 LLM과 오픈소스 라이브러리만으로 끝낸다.

입력은 video_subject = "금전의 가치" 한 줄. 출력은 final-1.mp4 같은 1080×1920(세로 9:16) 또는 1920×1080(가로 16:9) 고화질 mp4. 중간 결과물(스크립트 텍스트, 음성 mp3, srt 자막, 다운로드된 소스 클립들)도 작업 폴더에 모두 저장된다.

"숏폼을 양산해서 TikTok·YouTube Shorts·중국 더우인(抖音)에 뿌리고 광고 수익을 노린다" — 이름의 Money Printer(돈 찍어내는 기계)가 이 워크플로우를 그대로 가리킨다. 다만 실제 수익화 여부와 무관하게, "긴 미디어 파이프라인을 코드로 어떻게 조립하는가"에 대한 매우 깔끔한 학습 자료다.

핵심 용어
숏폼 (Short-form Video)
대략 15초 ~ 1분 분량의 세로(9:16) 또는 가로(16:9) 짧은 영상. TikTok / YouTube Shorts / Instagram Reels / 더우인 같은 플랫폼이 주력으로 다루는 포맷이다. 한 클립을 5초 단위로 빠르게 전환해 시청 유지율을 높이는 패턴이 일반적이며, MoneyPrinterTurbo의 기본 video_clip_duration도 정확히 5초로 잡혀 있다.

2왜 주목받는가

트렌딩 이유 · 원조 MoneyPrinter와 무엇이 다른가
50k
GitHub Stars
7.1k
Forks
20종+
지원 LLM Provider
2개
인터페이스 (Web UI + REST API)

1) 영어권 MoneyPrinter의 "재설계 후 추월"

원조 FujiwaraChoki/MoneyPrinter는 Selenium으로 브라우저를 띄워 더빙 사이트를 자동 조작하는 등 "붙여서 만든 PoC"에 가까웠다. MoneyPrinterTurbo는 이 아이디어를 가져와 완전히 새로 짠 풀스택 앱으로 만든 케이스다 — FastAPI 백엔드 + Streamlit 프론트 + Docker Compose + 모듈화된 서비스 계층까지.

2) "다 잘되는" LLM 어댑터 백엔드

OpenAI 한 종류만 쓰는 게 아니라 20개 이상 프로바이더를 어댑터 패턴으로 묶어놨다 — OpenAI, Moonshot(月之暗面), Azure, One-API, 通義千問(Qwen), Gemini, Ollama, DeepSeek, 文心一言(ERNIE), Pollinations, ModelScope, AiHubMix, AIMLApi, Grok, Groq, MiniMax, MiMo, Cloudflare Workers AI 등. 중국 사용자는 moonshot/deepseek으로 VPN 없이 쓰고, 로컬 운용자는 ollama로 완전 오프라인 운용까지 가능하다. (gpt4free는 선택 설치: uv sync --extra g4f + enable_g4f=true 필요)

비유

"전압이 다른 나라들을 위해 110V·220V·240V 어댑터를 다 들고 다니는 멀티 충전기"와 같은 구조다. 어느 나라에 떨어져도(어떤 LLM API 환경이라도) 같은 본체(MoneyPrinterTurbo)가 동작한다.

3) Web UI와 REST API가 동시에 산다

같은 비즈니스 로직(app/services/task.py)을 Streamlit Web UI(webui/Main.py, 포트 8501)와 FastAPI REST(main.py, 포트 8080)가 동시에 호출한다. 사람이 클릭으로 쓸 수도 있고, 다른 시스템이 API로 호출해서 자동화할 수도 있다. docker-compose up 한 줄에 두 컨테이너가 동시에 뜬다.

4) 무료 소스만으로 끝나는 영상 파이프라인

저작권 문제를 피하려고 영상은 Pexels / Pixabay 공개 API에서 다운로드(둘 다 무료 + CC 라이선스), 음성은 edge-tts(Microsoft Edge 브라우저 내장 TTS, 완전 무료), 자막은 faster-whisper(로컬), BGM은 resource/songs/에 사전 적재된 음원. 결국 유료 API는 LLM 하나만(혹은 DeepSeek 무료 크레딧·g4f·Ollama로 완전 무료화 가능).

3기술 스택 전체 지도

requirements.txt · Dockerfile · docker-compose.yml 기반 정리

백엔드 (Python 3.11)

구분라이브러리역할
API 서버fastapi==0.136.3 + uvicorn==0.32.1REST 엔드포인트, ASGI 비동기 서버. 포트 8080.
Web UIstreamlit==1.58.0설정·결과 미리보기 화면. 포트 8501.
LLM 통합openai==2.24.0 ⚠️ 2.x 메이저업, litellm==1.86.2, google.generativeai==0.8.6, dashscope==1.20.14, g4f (선택 설치)OpenAI/Gemini/Qwen 각각 네이티브 SDK 사용. litellm이 그 위에서 통합 추상화. openai 2.x는 1.x 대비 API 일부 변경 — 예제 코드 복붙 시 주의.
TTS 음성edge_tts==7.2.7, azure-cognitiveservices-speech==1.41.1Edge TTS 무료 + Azure Speech 유료 옵션. 100+ 음색 지원.
자막 STTfaster-whisper==1.1.0음성 mp3 → srt 자막. CTranslate2 백엔드로 일반 whisper 대비 4배 빠름.
영상 편집moviepy==2.2.1클립 자르기·합치기·자막 오버레이·BGM 믹싱. 내부적으로 ffmpeg 호출.
오디오 처리pydub==0.25.1음성 길이 측정, 포맷 변환.
로깅loguru==0.7.3표준 logging 대체. 한 줄로 컬러·파일 회전 로깅.
상태 관리redis==5.2.0 (선택)여러 워커 간 작업 상태 공유. 단일 인스턴스라면 메모리 dict로 대체 가능(enable_redis=false).

프론트엔드 (Streamlit)

별도의 React/Vue 빌드 없이 Streamlit 단일 페이지로 끝낸다. webui/Main.py 안에 입력 폼·진행도 표시·결과 미리보기가 다 들어있다. 장점은 "파이썬만 알면 UI도 만든다"지만, 디자인 자유도는 낮다 — 이 프로젝트가 "데이터/AI 도구"임을 잘 보여주는 선택.

외부 시스템

외부 의존용도API 키 필요
Pexels고화질 영상 소스(주력)O — 무료 발급
Pixabay대체 영상 소스O — 무료 발급
HuggingFaceWhisper-large-v3 모델(~3GB) 다운로드X (중국에선 백업 네트 드라이브 링크 제공)
ImageMagickmoviepy의 자막 텍스트 렌더링 백엔드X — OS 설치
FFmpeg실제 영상 인코딩X — moviepy가 자동 다운로드 시도

인프라

Dockerfile은 python:3.11-slim-bullseye를 베이스로, 시스템 패키지(git, imagemagick, ffmpeg)와 pip 의존성을 설치한다. 특이점: aliyun → tsinghua → 기본 데비안 미러를 순서대로 시도하는 3단계 재시도 로직이 들어있다 — 중국발 프로젝트라 네트워크 불안정성을 그라운드부터 고려한 흔적. docker-compose.yml은 webui·api 두 컨테이너를 같은 코드베이스에서 다른 명령으로 띄운다.

핵심 용어
MVC 아키텍처
Model · View · Controller. 데이터 모델(app/models/), 화면(webui/), 요청 핸들러(app/controllers/)를 분리해서 짜는 전통적 웹 아키텍처. MoneyPrinterTurbo는 여기에 비즈니스 로직 전담 Service Layer(app/services/)를 추가한 4계층 구조로 갔다 — 컨트롤러는 얇게, 실제 일은 서비스에서. README가 "완전한 MVC 아키텍처"를 자랑하는 이유.

4아키텍처 심화 분석

7단계 파이프라인 · 듀얼 인터페이스 · 상태 전이

전체 시스템 구조도

┌──────────────────────────────────────────────────────────────────────────┐ │ USERS │ │ 브라우저(사람) 다른 시스템(스크립트) │ └────────────┬──────────────────────────────────────┬─────────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────────┐ │ Streamlit WebUI │ │ FastAPI REST API │ │ :8501 │ │ :8080 │ │ webui/Main.py │ │ app/controllers/v1/ │ └────────┬─────────┘ └──────────┬───────────┘ │ │ └────────────────┬───────────────────────┘ ▼ ┌─────────────────────────────────┐ │ app/services/task.py │ │ start(task_id, params) │ │ 진행도: 5 → 10 → 20 → 30 → 40 → 50 → 100 │ └────────────────┬────────────────┘ │ ┌──────────┬───────────┼──────────┬──────────┬──────────┐ ▼ ▼ ▼ ▼ ▼ ▼ ┌────────┐ ┌────────┐ ┌──────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐ │llm.py │ │voice.py│ │subtitle │ │material │ │ video.py │ │state.py │ │대본 생성│ │ TTS │ │ .py 자막 │ │ .py 영상 │ │ 합성/렌더 │ │ 진행도 │ │20종 LLM │ │edge/ │ │whisper │ │Pexels/ │ │ moviepy │ │ 추적 │ │어댑터 │ │azure │ │ │ │Pixabay │ │+ffmpeg │ │(opt Redis)│ └────┬───┘ └────┬───┘ └────┬─────┘ └────┬────┘ └────┬─────┘ └─────────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ 외부 LLM msTTS API HF 모델 Pexels API 로컬 ffmpeg API (network) (~3GB) (network) (CPU/GPU) │ ▼ ┌────────────────────────────┐ │ storage/tasks/{task_id}/ │ │ ├─ script.json │ │ ├─ audio.mp3 │ │ ├─ subtitle.srt │ │ ├─ cache_videos/*.mp4 │ │ ├─ combined-1.mp4 │ │ └─ final-1.mp4 ◀── 결과물 │ └────────────────────────────┘

핵심 설계 패턴 1 — 7단계 선형 파이프라인 + "stop_at" 단계 멈춤

task.pystart(task_id, params, stop_at="video") 함수가 전체 흐름의 심장이다. 단계별로 진행도를 갱신하면서 한 단계라도 실패하면 즉시 TASK_STATE_FAILED로 마킹하고 종료한다. 더 흥미로운 건 stop_at 인자 — "script"·"terms"·"audio"·"subtitle"·"materials" 중 하나를 넣으면 그 단계까지만 돌고 끝낸다. "대본만 뽑아줘"·"자막까지만" 같은 부분 호출이 그냥 된다.

[ 1 ] generate_script (LLM) progress 5 → 10 [ 2 ] generate_terms (LLM, 검색어 5개) progress 10 → 20 [ 3 ] generate_audio (TTS) progress 20 → 30 [ 4 ] generate_subtitle (edge/whisper) progress 30 → 40 [ 5 ] get_video_materials (Pexels/local) progress 40 → 50 [ 6 ] generate_final_videos (moviepy) progress 50 → 100 [ 7 ] cross_post_video (TikTok/IG, opt) (선택, upload_post.py)

핵심 설계 패턴 2 — LLM 어댑터 (Strategy Pattern)

app/services/llm.py(26KB)는 config.tomlllm_provider 값을 보고 20종 SDK 중 하나를 동적으로 선택한다. 호출하는 쪽(task.py)은 llm.generate_script(...)만 호출하면 끝 — 안에서 OpenAI인지 Gemini인지 Ollama인지는 신경 쓸 필요가 없다.

비유

리모컨 하나로 LG·삼성·소니 TV를 다 조작하는 통합 리모컨과 같다. 사용자(task.py)는 "전원 켜"만 누른다. 어댑터(llm.py 안의 분기)가 "지금 TV가 LG니까 LG 코드 전송" 같은 변환을 알아서 한다.

핵심 설계 패턴 3 — 상태(state) 분리

app/services/state.py"진행도와 결과"를 별도 객체로 관리한다. 기본은 메모리 dict, enable_redis=true로 켜면 Redis 백엔드로 자동 전환. WebUI는 이 state를 폴링하면서 진행 바를 그린다. 로직과 상태 저장소를 분리한 덕분에 단일 노드 / 멀티 노드 배포가 같은 코드로 가능.

핵심 설계 패턴 4 — 데이터 모델 = Pydantic 스키마

app/models/schema.py에 모든 요청·응답이 Pydantic BaseModel로 정의되어 있다. VideoParams 하나에 25개 가까운 필드(주제·음성·BGM·자막 색·폰트 크기·외곽선 두께…)가 모두 모여있고, 같은 모델이 WebUI 입력 폼 / REST 요청 바디 / 내부 함수 인자로 그대로 흘러간다. FastAPI가 자동 생성하는 /docs 스웨거가 그대로 사용자 매뉴얼이 되는 이유.

5디렉토리 구조 해부

루트 폴더 / app · webui · resource · docs · test
MoneyPrinterTurbo/ ├── main.py # FastAPI 진입점 (uvicorn 실행) ├── webui.bat / webui.sh # Streamlit WebUI 실행 스크립트 ├── webui/ │ └── Main.py # Streamlit 페이지 — 폼/미리보기 전부 ├── config.example.toml # 200줄짜리 설정 템플릿 (config.toml로 복사) ├── Dockerfile # python:3.11-slim + 미러 3중 재시도 ├── docker-compose.yml # webui + api 동시 기동 ├── requirements.txt # 의존성 (uv.lock도 별도 존재) │ ├── app/ # 코어 (FastAPI 백엔드) │ ├── asgi.py # FastAPI 앱 객체 생성 + 미들웨어 │ ├── router.py # /api/v1/* 라우팅 │ ├── config/ # config.toml 로더 │ ├── controllers/ # HTTP 핸들러 (얇게 유지) │ │ ├── base.py │ │ ├── ping.py │ │ ├── manager/ │ │ └── v1/ # /api/v1/{videos,llm,tasks,...} │ ├── services/ # 비즈니스 로직 (두꺼움) │ │ ├── task.py # 14.8KB — 7단계 오케스트레이션 │ │ ├── llm.py # 26.1KB — 12종 LLM 어댑터 │ │ ├── voice.py # 62.1KB — TTS / 음성 목록 │ │ ├── video.py # 29.7KB — moviepy 합성 │ │ ├── material.py # 10.4KB — Pexels/Pixabay 다운로드 │ │ ├── subtitle.py # 9.9KB — whisper STT + 보정 │ │ ├── state.py # 4.9KB — 진행도 추적 (메모리 or Redis) │ │ ├── upload_post.py # 4.8KB — TikTok/IG 크로스포스트 │ │ └── utils/ │ ├── models/ │ │ ├── schema.py # Pydantic VideoParams 등 │ │ ├── const.py # TASK_STATE_PROCESSING 등 상태 상수 │ │ └── exception.py │ └── utils/ # 잡다 유틸 (task_dir, to_json, ...) │ ├── resource/ # 정적 자원 │ ├── songs/ # BGM mp3 (기본 10여 곡) │ ├── fonts/ # 자막 폰트 (STHeitiMedium.ttc 등) │ ├── public/ # 데모 영상 │ └── videos/ # 사용자가 직접 넣을 로컬 영상 │ ├── docs/ # 스크린샷, 음성 리스트, 데모 ipynb │ ├── webui.jpg │ ├── api.jpg │ ├── voice-list.txt # 100+ TTS 음색 목록 │ └── MoneyPrinterTurbo.ipynb # Google Colab 노트북 │ └── storage/ # 런타임 생성 (gitignored) ├── cache_videos/ # 다운로드한 Pexels/Pixabay 클립 캐시 └── tasks/{uuid}/ # 작업별 결과물 ├── script.json ├── audio.mp3 ├── subtitle.srt ├── combined-1.mp4 └── final-1.mp4
읽는 순서 추천
코드 탐색 5단계

config.example.toml로 "무엇을 설정할 수 있나" 감 잡기 → ② app/models/schema.py로 데이터 형태 확인 → ③ app/services/task.pystart()로 전체 흐름 따라가기 → ④ 관심 가는 단계(예: TTS면 voice.py)만 깊게 → ⑤ webui/Main.py로 UI가 어떻게 같은 모델을 쓰는지 확인.

6학습 포인트 (기술별)

"이 레포에서 무엇을 배울 수 있나"

① FastAPI — 미디어 생성 API의 정석

긴 작업(영상 합성, 1~5분)을 동기 HTTP로 처리하면 클라이언트가 타임아웃된다. MoneyPrinterTurbo는 "즉시 task_id 반환 + 별도 폴링 엔드포인트" 패턴을 쓴다:

실습: main.pyapp/asgi.pyapp/router.pyapp/controllers/v1/ 순서로 한 번 추적해보면 FastAPI의 라우팅·의존성 주입·BackgroundTasks 패턴이 한 번에 보인다.

② Streamlit — 데이터/AI 도구의 빠른 UI

webui/Main.py를 보면 st.text_input · st.slider · st.video · st.progress만으로 완성된 도구가 나온다. "React 안 쓰고도 며칠이면 사내 도구가 만들어진다"는 Streamlit의 핵심을 그대로 보여주는 사례.

③ moviepy — 코드로 영상을 자른다

app/services/video.py의 30KB 코드 안에 "클립 가로세로 비율 변경·여러 클립 이어붙이기·자막 오버레이·BGM 페이드인/아웃"이 다 들어있다. 특히 VideoConcatMode(random / sequential)와 VideoTransitionMode(Shuffle / FadeIn / FadeOut / SlideIn / SlideOut) 구현은 영상 자동화 입문에 좋은 레시피.

④ TTS (edge-tts) — 무료 + 자연스러운 음성

Microsoft Edge 브라우저가 내부적으로 쓰는 신경망 TTS를 비공식 라이브러리로 뽑아 쓴다. 100개+ 음색·언어 무료. app/services/voice.py(62KB!)에 음색 목록과 SSML 처리 코드가 통째로 들어있다.

⑤ faster-whisper — 로컬 STT의 표준

OpenAI Whisper를 CTranslate2로 다시 컴파일한 버전. compute_type="int8"이면 CPU에서도 돈다. 음성 → 자막 타이밍 자동 정렬이 무료로 가능한 시대를 연 라이브러리.

⑥ Adapter Pattern — LLM 종속성 피하기

"어떤 LLM이든 붙일 수 있게 만든다"는 사례. llm.py 내부 분기 구조를 자기 프로젝트에 그대로 가져다 쓸 수 있다.

7하드웨어 / 시스템 요구사항

README 기준 + 실측 추정
구분최소권장비고
CPU4코어8코어+moviepy 인코딩이 CPU 바운드. n_threads 옵션으로 병렬 조정
RAM4GB8GB+Whisper-large-v3 사용 시 모델만으로 ~3GB
디스크10GB30GB+Whisper 모델 3GB + Pexels 캐시(영상당 수십 MB) + 결과물
GPU불필요NVIDIA + CUDAWhisper만 GPU 가속됨. moviepy는 CPU 전용. device="cuda", compute_type="float16"
OSWindows 10+ / macOS 11+ / Linux경로에 한글·공백·특수문자 금지 (README 명시)
네트워크안정 + (중국이면 VPN)Pexels·HuggingFace·OpenAI 모두 해외 트래픽
주의
"ImageMagick policy.xml" 함정

Linux에서 자막이 안 박힐 때 99%는 ImageMagick 보안 정책(/etc/ImageMagick-6/policy.xml)이 임시파일 접근을 막아서다. rights="none"rights="read|write"로 바꿔야 한다. Dockerfile은 이걸 빌드 시 자동으로 해주지만, 수동 설치 시엔 직접 수정 필요.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 본격 도전 전 워밍업
난이도 ★☆☆ — 30분

① "Hello World" 영상 한 편 뽑기

git clonepip install -r requirements.txtconfig.toml에서 llm_provider="deepseek" + DeepSeek API 키 + Pexels API 키 설정 → sh webui.sh → 브라우저 8501 접속 → 주제 "가을 단풍의 아름다움"으로 9:16 영상 1개 생성. 어디서 오래 걸리는지 로그로 측정해본다 (대본 / 영상 다운로드 / 합성 중 어디가 병목?).

난이도 ★★☆ — 2~3시간

② REST API만으로 영상 5개 배치 생성

python main.py로 API만 띄우고, Python requestsPOST /api/v1/videos를 5번 호출. 반환된 task_id를 폴링해 진행도 진행 바를 콘솔에 직접 그려본다. WebUI 없이 자동화하는 감을 잡는 게 목적.

힌트: max_concurrent_tasks=5 기본값이라 동시에 5개까지 돌아간다. config로 조절해 처리 시간 변화 측정.
난이도 ★★☆ — 반나절

③ 새로운 LLM 프로바이더 추가하기

app/services/llm.py에 자신이 좋아하는 LLM(예: Claude, Mistral, SiliconFlow)을 새 분기로 추가. config.toml에 키 섹션도 만든다. Anthropic Claude를 넣는 게 의외로 빠진 부분이라 PR감.

난이도 ★★★ — 1~2일

④ BGM "주제별 자동 매칭" 알고리즘

현재는 resource/songs/에서 랜덤 선택. 이걸 "주제가 '슬픔'이면 잔잔한 곡, '운동'이면 빠른 곡"으로 매칭하는 로직 추가. 곡 메타데이터 yaml을 따로 만들어두고 LLM에게 "이 주제에 어울리는 BGM 분위기 한 단어"를 물어보고 매칭하는 식.

난이도 ★★★★ — 1주일+

⑤ "Pexels 대신 AI 생성 영상(Sora/Runway/Pika)" 백엔드 추가

app/services/material.py를 어댑터 패턴으로 리팩토링 → video_source = "sora" 같은 옵션을 추가 → API 호출 → 결과 mp4 다운로드 → 기존 파이프라인에 끼우기. 완성하면 "전혀 새로운 영상을 처음부터 만드는 비디오 공장"이 된다.

9관련 기술 심화 학습 로드맵

주차별 학습 계획 — 4주 코스

1주차 — 환경 + 전체 흐름 이해

2주차 — FastAPI + Pydantic

3주차 — moviepy + ffmpeg

4주차 — LLM 어댑터 + 자기 프로젝트화

10핵심 키워드 사전

레포에 등장하는 주요 기술 용어 25개
ASGI (Asynchronous Server Gateway Interface)
WSGI의 비동기 후속 규격. FastAPI · Starlette · Django가 따른다. uvicorn이 대표적 ASGI 서버.
moviepy
Python에서 ffmpeg을 추상화해 클립 자르기·합치기·자막을 다루는 라이브러리. 내부적으로 모든 작업을 ffmpeg 명령으로 변환한다.
ImageMagick
"이미지의 ffmpeg" 격인 명령형 이미지 처리 도구. moviepy가 텍스트(자막)를 PNG로 렌더할 때 호출한다.
faster-whisper
OpenAI Whisper STT 모델을 CTranslate2로 다시 컴파일해 4배 빨라진 버전. CPU INT8도 실용적.
edge-tts
Microsoft Edge 브라우저가 내부적으로 쓰는 TTS API를 비공식 추출한 Python 라이브러리. 100+ 음색 완전 무료.
Pexels / Pixabay
CC0/CC 라이선스 영상·이미지를 무료 API로 제공하는 스톡 사이트. MoneyPrinterTurbo의 기본 영상 소스.
LiteLLM
100+ LLM 프로바이더를 OpenAI API 형식으로 통일해주는 어댑터 라이브러리. completion(model="claude-3-5-sonnet")만 바꾸면 다른 모델로 갈아끼울 수 있다.
g4f (gpt4free)
여러 공개 LLM 서비스의 무료 인터페이스를 묶은 라이브러리. 정식 API가 아니라 안정성·합법성 회색지대. MoneyPrinterTurbo에서는 기본 의존성에서 분리된 선택 설치 항목으로, uv sync --extra g4f로 별도 설치하고 config.toml에서 enable_g4f=true를 명시해야 사용 가능하다.
Streamlit
"파이썬만으로 데이터/AI 도구 UI를 만든다"는 콘셉트의 프레임워크. 상태 관리는 st.session_state로.
Pydantic
Python 타입 힌트 기반 데이터 검증 라이브러리. FastAPI가 요청·응답 스키마로 그대로 가져다 쓴다.
SRT 자막
SubRip Text. 가장 보편적인 자막 포맷. "타임코드 + 텍스트"의 단순 텍스트 파일.
SSML (Speech Synthesis Markup Language)
TTS에 "여기서 0.5초 쉬어"·"이 단어는 강조" 같은 지시를 XML로 주는 표준. edge-tts가 일부 지원.
9:16 / 16:9 / 1:1
영상 가로세로 비율. 9:16 = 세로(틱톡/쇼츠), 16:9 = 가로(유튜브/TV), 1:1 = 정사각형(인스타 피드).
crf (Constant Rate Factor)
ffmpeg/x264의 화질 조정 값. 0(무손실) ~ 51(최저). 보통 18~23이 시청에 적당한 균형.
Adapter Pattern
서로 다른 인터페이스를 같은 모양으로 감싸 호출 측을 단순화하는 디자인 패턴. llm.py가 대표 사례.
Service Layer
Controller(요청 받기)와 Model(데이터) 사이에서 비즈니스 로직을 담는 계층. 컨트롤러를 얇게 유지하는 핵심.
BackgroundTasks
FastAPI 기능으로, 응답을 보내고 나서 백그라운드에서 추가 작업을 돌리는 메커니즘. 영상 생성 같은 긴 작업에 필수.
Polling vs WebSocket
긴 작업 진행도를 알리는 두 방식. MoneyPrinterTurbo는 단순한 폴링(WebUI가 주기적으로 GET) 채택.
UUID
128비트 무작위 식별자. 각 영상 생성 작업의 task_id로 사용. 충돌 확률은 사실상 0.
CTranslate2
Transformer 모델 추론을 C++로 최적화한 엔진. faster-whisper의 백엔드.
Pexels API rate limit
기본 시간당 200건 / 일 20,000건. 여러 키를 배열로 넣어 라운드로빈하는 게 합법적 회피책.
Google Colab
브라우저에서 무료로 GPU 노트북을 돌리는 구글 서비스. MoneyPrinterTurbo는 공식 Colab 노트북 제공.
MIT License
"마음대로 써라, 책임은 안 진다"는 가장 관대한 OSS 라이선스. 상업적 이용·재배포·수정 모두 자유.
moviepy 1.x vs 2.x
2.x에서 API가 일부 바뀜(set_*with_*). 이 레포는 2.2.1을 쓴다 — 인터넷 예제 베끼다 깨질 수 있음.
aliyun 미러
중국 알리바바클라우드가 제공하는 데비안/PyPI 미러. 중국에서 외부 미러 접속 막힐 때 폴백으로 쓴다.

11참고 링크

공식 · 학습 자료 · 관련 프로젝트

공식

핵심 의존성 공식 문서

비교 / 관련 프로젝트

한국어 학습 자료

TRY IT YOURSELF

오늘 당장 1시간으로 끝낼 첫걸음

  1. Colab으로 코드 안 짜고 한 편 만들기 — 위 Colab 링크 → "런타임 → 모두 실행". 주제 입력 후 영상 1개 다운로드까지 가능.
  2. Docker로 로컬 띄우기git cloneconfig.toml 복사 + DeepSeek + Pexels 키만 채우기 → docker compose uplocalhost:8501
  3. REST API로 한 번 호출localhost:8080/docs에서 POST /api/v1/videos "Try it out" → "주제만 채워서" 실행 → task_id 받기 → GET /api/v1/tasks/{id}로 진행도 보기.
  4. 코드 한 군데만 고쳐보기app/services/task.pystart()print("[STEP X DONE]") 한 줄씩 끼워서 어디서 시간이 가장 걸리는지 직접 확인.
분석일자: 2026-05-28 · 대상 레포: harry0703/MoneyPrinterTurbo · TrendShift Daily #3 · 50,000 stars · MIT License
참조 파일: README.md · requirements.txt · Dockerfile · docker-compose.yml · config.example.toml · app/services/task.py · app/models/schema.py · main.py