디지털 가든
MoneyPrinterTurbo 스캔기: 십삼만 별의 등대와 제로 Key의 출판 흐름
십삼만 별의 등대가 비추는 것은 「한 개의 주제를 입력해 한 편의 숏비디오를 낸다」는 주맥이다. 이날, harry0703/MoneyPrinterTurbo가 완전히 스캔됐다——MIT 프로토콜, 약 십삼점일 만 Star / 이점영칠만(二点零七万) 포크, 마지막 커밋이 바로 그날, 현재 버전 v1.3.8, 매우 활발한 중문 스타 프로젝트.
1. 네 개의 입구, 한 개의 흐름
WebUI(Streamlit, Main.py 약 팔천사백 행), REST API(FastAPI), CLI(단일 파일 육십구 KB), AI Agent(자체 Skill)——네 입구가 같은 한 개의 임무 흐름을 공유하고, 로직은 app/services/task.py:1510의 _run_pipeline에 수렴하며 단계별로 추진하고 브레이크포인트 속행을 갖는다(stop_at은 audio / subtitle / materials 등의 중간 산물에 정지 가능). 칠단계 과정: LLM이 스크립트 생성 → LLM이 소재 검색어를 정제 → TTS가 내레이터 생성 → faster-whisper가 로컬에서 전사해 자막 → 다중 소스에서 비디오 클립 가져오기 → moviepy 2.x + ffmpeg가 이어붙이고 자르고 BGM 추가 → 독립 스레드 풀로 TikTok / Instagram / YouTube Shorts에 자동 업로드(생성의 병행을 점유하지 않음).
2. 통합면: 이 프로젝트 가장 두드러진 특징
LLM 측(app/models/llm_provider.py 레지스트리 + litellm): Kimi, OpenAI, Claude, Gemini, DeepSeek, 통의, Azure, 방주, Grok, MiniMax, MiMo, 그리고 OpenRouter / OneAPI / Ollama 등의 게이트웨이. 소재원: Pexels / Pixabay / Coverr / 로컬 업로드, 외가 문생 비디오(화산 Seedance, WaveSpeed, OFox, 비탑 MiniMax, MuAPI, OpenAI 호환 문생도)와 LoomLoom SkillBot 스크립트 후보. TTS(voice.py 삼천팔백 행, 가장 무거운 모듈): Edge TTS(무료 기본), Azure, SiliconFlow, Gemini, MiMo, MiniMax, ElevenLabs, Chatterbox, Kokoro, Fish Audio, VoxCPM. 반주: 로컬 무작위 / Sonilo / ElevenLabs Music. 공정 품질 하이라이트도 희귀하게 착실——약 백칠십 개의 테스트 파일 사만육천 행, CI가 분기 커버리지 70퍼센트 이상을 강제(pyproject.toml); 핵심 설계 결정에는 중영 이중 언어 주석이 있고 「왜」를 설명한다(연결 테스트의 짧은 타임아웃, 불변 검증, Windows 프로세스 생존 판정 등); ffmpeg 인코더 탐지와 폴백, 원자 파일 낙판(mkstemp + os.replace), 로그의 탈민(API key 정규식 마스킹), TLS 검증 스위치, API 감증(x-api-key), Redis 임의의 다중 프로세스 상태 동기, CPU/GPU 두 벌의 Dockerfile. 주목할 점도 기록——두 개의 거대 단일 파일: webui/Main.py(팔천사백 행)과 cli.py(육십구 KB)는 명백한 유지보수 부담, 새 기능은 모두 거기로 쌓인다; 상업 색이 진하다——README에 대량의 스폰서 홍보 링크(Kimi, 화산, APIMart 등)가 있고 프로젝트의 본질은 「AI 숏비디오 돈벌이 도구」이며, 통합된 새 모델의 많이는 스폰서 채널 유래; 비디오 이해——TwelveLabs는 임의의 extra로, uv로 필요할 때 설치.
3. 그 핵심적인 물음: API 필수인가
사용자의 의심은 코드에서 단계마다 검증됐고, 답은——아니다. 이 소프트웨어 자체는 제로 API Key로 전체 과정을 돌릴 수 있다. 스크립트 단계에서는 커스텀 스크립트를 직접 붙여넣을 수 있다(코드 내 video_script가 비공백이면 LLM을 스킵); 더빙에는 무더빙 모드, 자신이 업로드한 오디오, 그리고 Edge TTS(마이크로소프트의 무료 서비스, 인터넷만 있으면 되고 Key 불필요); 소재는 로컬 이미지/비디오 업로드; 자막은 faster-whisper의 로컬 전사로, 첫 모델 다운로드 후 완전 오프라인; 반주는 로컬 무작위 음악 파일; 합성은 moviepy + ffmpeg의 전체 로컬. 그래서 핵심 포인트는 두 개——그것은 로컬 우선 구조이다——비디오 편집, 합성, 전사는 모두 당신의 기기 안에서 완료되고, 소재를 클라우드에 올려 처리하는 것이 아니다. API는 두 종류의 일에만 쓰인다: 내용 생성(스크립트, AI 비디오, 일부 음색)과 소재 가져오기(도서관 검색). 최소 가용 구성=제로 비용: 커스텀 스크립트 + 로컬 소재 + Edge TTS 더빙 + 로컬 자막 + 로컬 BGM, 한 개의 Key도 채우지 않고 출판할 수 있다. 「주제를 입력하고 완전 자동」을 체험하고 싶을 때만 LLM API가 필요하고, 이 한 걸음도 Ollama로 로컬 모델을 돌려 완전 오프라인으로 할 수 있다. 바꿔 말하면, API가 결정하는 것은 자동화와 소재 품질의 상한이지, 쓸 수 있는지가 아니다. 진정으로 피할 수 없는 외부 의존은 두 개뿐——Edge TTS는 인터넷 연결이 필요(하지만 무료에 Key 불필요), 그리고 whisper는 첫 실행 때 모델 파일을 다운로드해야 한다.
4. 비디오는 어떻게 생성되나: 네 걸음의 진짜 몸
합성 코드를 다 읽은 뒤, 먼저 두 개념을 구분해야 한다——이 소프트웨어에서 「비디오 생성」에는 두 층의 의미가 있다. 제일 층: 소재 비디오가 어디서 오나——즉 전 조항에서 말한, 로컬/도서관/AI 문생 비디오, 이것은 임의. 둘째 층: 완성편이 어떻게 합성되나——이것이 소프트웨어의 본체로, 전부 로컬에서 moviepy + ffmpeg로 완성되며, 어떠한 API도 불필요. 과정은 combine_videos(video.py:965)와 generate_video(video.py:1558) 두 함수 안에 있으며 네 단계로 나뉜다——
첫 번째 단계: 내레이터 길이에 따라 절편——먼저 더빙 오디오의 총 길이를 읽고, 목표 완성편 길이=오디오 길이 + 0.5초의 안전 여유. 그리고 각 소재 비디오를 max_clip_duration(기본 오 초) × 재생 속도에서 원 길이를 역산해 작은 단락으로 자른다. 절편 전략은 두 종류——sequential 모드는 각 비디오의 머리 한 단락만 취하고, random 모드는 순서를 섞으며, 그리고 _prioritize_unique_source_clips 로직이 다른 출처의 클립을 우선 사용해 연속 몇 초가 같은 비디오가 되는 것을 피한다. 클립이 길이 부족이면 순환 재사용해 총 길이가 달성할 때까지.
두 번째 단계: 단일 클립 처리(스레드 풀 병행)——각 클립을 개별 처리: 절취, clip_speed로 속도 변경, 전환 추가(페이드 인아웃/슬라이드), 잘라 화면비에 적응(cover 모드는 흑여백을 잘라내고, 흐림 배경 충전 모드도 있다). 이미지 소재는 여기서 Ken Burns 줌 애니메이션 비디오로 렌더링된다(render_image_zoom_video, video.py:1883), 그래서 정지 이미지를 업로드해도 동적 효과가 나온다. 처리 완료된 클립은 각각 임시 mp4 파일에 쓰인다.
세 번째 단계: ffmpeg로 한 번에 이어붙이기——ffmpeg의 concat demuxer로 모든 클립을 연결 인코딩한다(video.py:625). 여기에는 명확한 공학적 타산이 있다: 주석에 「MoviePy가 단락별로 합병할 때의 반복 재인코딩을 피해 화질 열화를 줄인다」고 쓰여 있다. 또한 하드웨어 인코더를 탐지하고, 실패 시 자동으로 libx264로 폴백하며, 마지막에 -t로 목표 길이에 정밀 절단한다. 출력은 임시 파일 + os.replace의 원자 공개를 통해, 도중 실패해도 반쪽 파일은 남지 않는다.
네 번째 단계: 오디오 트랙 걸기, 자막 굽기, BGM 믹스——내레이터 오디오는 먼저 음량 파라미터로 조정; 자막은 로컬 whisper가 생성한 SRT에 구동되고, MoviePy의 SubtitlesClip이 각 자막마다 TextClip을 생성한다——PIL이 폰트 렌더링, 자동 줄바꿈, 획과 배경 상자(둥근 모서리 배경 포함)를 담당하고, 위치 파라미터(하단/상단/삼분이/커스텀 백분비)에 따라 CompositeVideoClip으로 화면에 겹친다, 임의로 「스프링 통통」 입장 애니메이션. BGM은 무작위/로컬/AI 생성 세 소스를 지원하고, 로드 후 음량 스케일링, 전장 채우는 순환, 끝 삼 초의 페이드아웃을 하며 내레이터와 믹스한다. 마지막에 write_videofile로 최종 mp4를 출력. 화면비는 9:16(1080×1920), 16:9(1920×1080), 1:1(1080×1080) 세 종류를 지원한다.
그래서 전체 사슬은——AI/도서관은 「원자재」를 제공할 뿐, 진짜 편집 합성은 로컬 전통적 비디오 처리. 이것이 왜 그것이 제로 API로도 출판할 수 있는가——합성 이 고리는 본래 클라우드에 의존하지 않는다.
실제 좌표
- 프로젝트: harry0703/MoneyPrinterTurbo, 약 십삼점일 만 스타/이점영칠만 포크, v1.3.8, MIT, 당일에도 커밋 있는 매우 활발한 중문 스타 프로젝트
- 네 입구: WebUI(Streamlit Main.py 8400 행) / REST API(FastAPI) / CLI(69KB 단일 파일) / AI Agent(docs/skill/); 흐름의 오케스트레이션 핵심은 task.py:1510 _run_pipeline, stop_at으로 audio/subtitle/materials에 정지 가능한 브레이크포인트 속행
- 통합면: LLM은 Kimi/OpenAI/Claude/Gemini/DeepSeek/통의/Azure/방주/Grok/MiniMax/MiMo + OpenRouter/OneAPI/Ollama; 소재는 Pexels/Pixabay/Coverr/로컬 + 문생 비디오(화산 Seedance, WaveSpeed, OFox, 비탑 MiniMax, MuAPI) + LoomLoom SkillBot; TTS는 Edge TTS(무료 기본)/Azure/SiliconFlow/Gemini/ElevenLabs/Chatterbox/Kokoro/Fish Audio/VoxCPM; 반주는 로컬/Sonilo/ElevenLabs Music
- 공정 품질: 약 백칠십 개 테스트 파일 사만육천 행, CI가 분기 커버리지 70퍼센트 이상 강제; 중영 이중 언어 주석이 「왜」를 설명; ffmpeg 인코더 탐지와 폴백, mkstemp+os.replace 원자 낙판, 로그 탈민, x-api-key 감증, Redis 임의 다중 프로세스 동기, CPU/GPU 두 벌 Dockerfile
- 합성 네 단계: 내레이터 길이로 절편(max_clip_duration 5초×속도, sequential/random, _prioritize_unique_source_clips) → 스레드 풀 단일 클립 처리(이미지는 Ken Burns 줌 애니메이션으로, render_image_zoom_video video.py:1883) → ffmpeg concat demuxer로 한 번에 이어붙이기(재인코딩 열화를 피하고, HW 인코더 탐지, libx264 폴백, -t 정밀 절단, 원자 공개) → 오디오 트랙 걸기 + 자막 굽기(SRT 구동의 TextClip, PIL이 폰트/줄바꿈/획/둥근 상자 담당, 스프링 통통 애니메이션) + BGM(세 소재, 음량 스케일링, 순환, 삼 초 페이드아웃)
- 화면비: 9:16 / 16:9 / 1:1 세 종류; 최소 가용 구성=커스텀 스크립트+로컬 소재+Edge TTS+로컬 자막+로컬 BGM, 제로 Key로 출판
댓글