










仓库地址:https://github.com/harry0703/MoneyPrinterTurbo
当前版本:v1.3.3(2026-07-24) | 许可证:见 LICENSE(仓库未明确标注类型,早期为宽松开源协议) | 主要语言:Python 3.11+
文档生成时间:2026-07-29
MoneyPrinterTurbo 💸 —— 一站式 AI 短视频生成工具(名字戏谑自 "Money Printer Go Brrr",意指「输入主题就能印出(视频)内容」)。
一句话:只需提供视频「主题」或「关键词」,自动完成「脚本撰写 → 素材匹配 → 配音(TTS)→ 字幕 → 背景音乐 → 视频合成 → (可选)跨平台发布」全流程,输出高清短视频。
能力要点:
edge(TTS 时间戳,默认)与 whisper(本地 faster-whisper 转写)两路。MoneyPrinterTurbo 提供四种部署/运行路径,按用户画像推荐:
| 方式 | 适用人群 | 做法 |
|---|---|---|
| AI Agent | 不想手动安装 | 让支持 Skill 的 Agent 读取 docs/skill/SKILL.md 并自动安装、配置、生成 |
| Windows 一键包 | Win 用户快速体验 | Releases 下载解压(路径勿含中文/空格),先 update.bat 再 start.bat |
| Docker(推荐隔离) | 想要干净环境 | docker compose -f docker-compose.release.yml up 拉取 ghcr.io/harry0703/moneyprinterturbo:latest |
| 手动(uv / venv) | macOS/Linux 开发者 | 见下 |
手动部署(macOS/Linux 推荐 uv):
git clone https://github.com/harry0703/MoneyPrinterTurbo.git
cd MoneyPrinterTurbo
uv python install 3.11
uv sync --frozen # 基于 uv.lock 锁定依赖
# 启动 WebUI
sh webui.sh # Windows: .\webui.bat
# 启动 API
uv run python main.py
# 纯 CLI 生成
uv run python cli.py --video-subject "人工智能如何改变日常生活"
config.example.toml 自动生成 config.toml;LLM Provider、素材源、API Key 既可在 WebUI 基础设置里填,也可写进 config.toml。http://127.0.0.1:8501,API 文档 http://127.0.0.1:8080/docs(FastAPI 自带 Swagger)。| 项目 | 要求 |
|---|---|
| 系统 | Windows 10 / macOS 11+ / 主流 Linux |
| Python | 3.11+(推荐 3.11,uv 管理;也兼容 venv + pip) |
| 依赖管理 | uv(主推,uv.lock 锁定)+ pyproject.toml;requirements.txt 仅兼容旧 pip |
| 外部服务 | ffmpeg(通常自动下载,亦可手动配置 ffmpeg_path);LLM API Key;素材源 API Key(Pexels/Pixabay/Coverr,可选);TTS 凭据(Edge 免 Key) |
| GPU | 非必需;启用本地 faster-whisper 字幕或批量生成时建议 4–8GB 显存 |
| 最低/推荐/理想配置 | CPU 4核/6–8核/8核+;内存 4GB/8GB/16GB+;GPU 非必须/4GB/8GB |
/docs 查看接口,程序化调用(建议生产用)。cli.py --help 看参数,无浏览器环境也能跑。config.toml 中 subtitle_provider = "edge"(默认,快、无需 GPU)或 "whisper"(需首次下载 ~3GB large-v3 模型)。[app] 下写 upload_post_* 项并开启 upload_post_auto_upload 即可生成后自动上传。| 维度 | 选型 |
|---|---|
| 语言 | Python 3.11+ |
| Web 框架 | FastAPI(ASGI,API 文档 /docs、/redoc)+ uvicorn 启动(main.py) |
| WebUI | Streamlit(通过 webui.sh / webui.bat) |
| 视频处理 | MoviePy(剪辑/合成/字幕)、ffmpeg(concat demuxer 拼接、硬件编码回退);faster-whisper 本地转写 |
| LLM | 适配 OpenAI Chat Completions 协议的多家厂商,统一经 app/models/llm_provider.py 注册表抽象 |
| TTS | Edge TTS / Azure / SiliconFlow / Gemini / MiMo / ElevenLabs / Chatterbox |
| 素材 | Pexels / Pixabay / Coverr REST API;可选 TwelveLabs(语义排序/QA)、Sonilo(视频匹配配乐) |
| 发布 | Upload-Post API(TikTok / Instagram / YouTube Shorts) |
| 依赖/部署 | uv + uv.lock;Docker / Docker Compose(Dockerfile、Dockerfile.gpu、docker-compose*.yml);GitHub Container Registry 预构建镜像 |
| 日志/可观测 | loguru |
| 测试/CI | pytest + 分支覆盖率门槛;Linux/Windows CI |
MoneyPrinterTurbo/
├── main.py # API 入口:uvicorn 启动 app.asgi:app
├── cli.py # 纯命令行生成入口
├── app/
│ ├── asgi.py # ASGI 应用装配(含路由/中间件)
│ ├── router.py # 顶层路由
│ ├── config.py # 配置加载(读 config.toml,合并 config.example.toml 默认值)
│ ├── controllers/ # 控制器层(职责分层)
│ │ ├── v1/ # REST API(base.py 等,版本化)
│ │ ├── manager/ # 任务生命周期管理(持久化阶段/错误、恢复中断任务、发布与生成解耦)
│ │ ├── base.py, ping.py
│ ├── services/ # 服务层(核心业务逻辑)
│ │ ├── video.py # ★ 视频合成核心:combine_videos / generate_video / preprocess_video
│ │ ├── bgm.py # 背景音乐(随机/指定/ElevenLabs/Sonilo)
│ │ ├── utils/ # 视频特效(fade/slide/zoom 转场)、辅助
│ │ ├── data/ # 静态数据(如 Azure 语音列表 JSON)
│ │ └── (推断)llm / tts / subtitle / material / publish 等子服务
│ ├── models/ # 模型/数据定义
│ │ ├── schema.py # VideoParams / MaterialInfo / VideoAspect / VideoConcatMode 等
│ │ ├── const.py # 常量(文件类型、支持编码器等)
│ │ └── llm_provider.py # ★ LLM Provider 注册表与解析(20+ 厂商)
│ └── utils/ # 通用工具(ffmpeg 解析、文件安全、路径、字体等)
├── webui/ # Streamlit WebUI 代码
├── docs/ # 文档、SKILL.md(AI Agent 技能)、语音列表、资源
├── resource/ # 默认字体(songs/fonts)、示例音乐
├── config.example.toml # 配置样例(首次运行复制为 config.toml)
├── Dockerfile / Dockerfile.gpu / docker-compose*.yml
├── pyproject.toml / uv.lock / requirements.txt
└── webui.bat / webui.sh
说明:
services/下还有按职责拆分的 llm / tts / subtitle / material / publish 等子服务(由 README「控制器、服务和模型分层」与提交历史feat(bgm)/feat(material)/feat(video)/refactor(voice)可印证),但本次逐字核对直接读取到的是video.py、bgm.py及其utils/data子目录。
端到端流程(由 WebUI/API/CLI 触发的统一任务编排,由 controllers/manager 管理生命周期):
flowchart TD A[主题/关键词] --> B[LLM 生成脚本 + 搜索词] B --> C[素材搜索 Pexels/Pixabay/Coverr/本地] C --> D[preprocess_video 校验/转码素材] B --> E[TTS 配音 → 旁白音频] E --> F[字幕: edge时间戳 或 whisper转写] D --> G[combine_videos 按音频长度拼接片段] F --> H[generate_video 合成画面+字幕+配音+BGM] H --> I[输出 MP4] I --> J{自动发布?} J -- 是 --> K[Upload-Post → TikTok/IG/YT] J -- 否 --> L[完成]
下面给出最具代表性的片段(已逐字核对 main.py、app/models/llm_provider.py、app/services/video.py)。
main.py(极简 uvicorn 启动)import uvicorn
from loguru import logger
from app.config import config
if __name__ == "__main__":
logger.info("start server, docs: http://127.0.0.1:" + str(config.listen_port) + "/docs")
uvicorn.run(
app="app.asgi:app",
host=config.listen_host,
port=config.listen_port,
reload=config.reload_debug,
log_level="warning",
)
app/models/llm_provider.py(扩展性设计核心)所有厂商以「声明式数据结构」集中注册,新增一个 OpenAI 兼容提供商往往只需加一项,调用协议由 app/services/llm.py 的 adapter 实现:
@dataclass(frozen=True, slots=True)
class LLMProviderSpec:
provider_id: str
default_label: str
adapter: str = "openai_compatible" # 调用协议适配器
api_key_url: str = ""
default_model: str = ""
default_base_url: str = ""
requires_api_key: bool = True
requires_model_name: bool = True
requires_base_url: bool = True
deprecated_models: tuple[str, ...] = ()
deprecated_base_urls: tuple[str, ...] = ()
extra_fields: tuple[LLMProviderField, ...] = ()
def resolve_model_name(self, configured_model):
model = (configured_model or "").strip()
if not model or model in self.deprecated_models:
return self.default_model # 废弃/缺省 → 当前默认模型
return model
def resolve_base_url(self, configured_base_url):
base = (configured_base_url or "").strip()
deprecated = {u.rstrip("/") for u in self.deprecated_base_urls}
if not base or base.rstrip("/") in deprecated:
return self.default_base_url
return base
# 元组顺序 = WebUI 下拉顺序
LLM_PROVIDER_REGISTRY = (
LLMProviderSpec("moonshot", "Kimi / Moonshot AI",
default_model="kimi-k3", default_base_url="https://api.moonshot.cn/v1"),
LLMProviderSpec("openai", "OpenAI", default_model="gpt-5.5",
default_base_url="https://api.openai.com/v1"),
LLMProviderSpec("gemini", "Google Gemini", adapter="gemini",
default_model="gemini-3.1-pro-preview", requires_base_url=False, show_base_url=False),
# ... deepseek / qwen / azure / volcengine / grok / minimax / mimo /
# cloudflare / modelscope / aihubmix / aimlapi / evolink /
# ollama / oneapi / litellm / groq / pollinations ...
)
LLM_PROVIDERS = {p.provider_id: p for p in LLM_PROVIDER_REGISTRY}
if len(LLM_PROVIDERS) != len(LLM_PROVIDER_REGISTRY):
raise RuntimeError("duplicate LLM provider id in registry")
app/services/video.py(节选)combine_videos 的关键逻辑——按旁白音频时长反推所需素材总时长,切片、缩放、转场、循环补齐,最后用 ffmpeg concat demuxer 一次性拼接(避免 MoviePy 逐段重编码导致画质劣化):
def combine_videos(combined_video_path, video_paths, audio_file,
video_aspect=VideoAspect.portrait,
video_concat_mode=VideoConcatMode.random,
video_transition_mode=None, max_clip_duration=5,
threads=2, clip_speed=1.0) -> str:
audio_clip = AudioFileClip(audio_file)
try:
audio_duration = audio_clip.duration
finally:
close_clip(audio_clip)
required_video_duration = _get_required_video_duration(audio_duration) # audio + 0.1s 余量
# 反推「源片段时长」= max_clip_duration * clip_speed,保证不同速度下时间线连续无重叠
source_clip_duration = max_clip_duration * utils.normalize_clip_speed(clip_speed)
aspect = VideoAspect(video_aspect)
video_width, video_height = aspect.to_resolution()
subclipped_items = [] # 把每个素材切成 ≤ source_clip_duration 的小段
# ... 切片、_prioritize_unique_source_clips 去重优先、缩放/转场 ...
# 时长不够则循环补齐;时长够了就停止
# 最后用 ffmpeg concat 一次性串联:
concat_video_clips_with_ffmpeg(
clip_files=[c.file_path for c in processed_clips],
output_file=combined_video_path, threads=threads,
output_dir=output_dir, max_duration=audio_duration,
)
return combined_video_path
generate_video 则负责最终合成:把拼接好的视频、旁白音频、字幕(SubtitlesClip + 自绘 TextClip,支持圆角背景/可见像素居中)、可选 BGM(CompositeAudioClip,失败也不阻断成片)用 MoviePy 渲染并写出,_write_videofile_with_codec_fallback 在硬件编码器(NVENC/AMF/QSV/VideoToolbox)失败时自动回退 libx264。
代码中大量「工程化注释」体现成熟度,例如:
config.toml 含大量 API Key,需用户自行保管;赞助商耦合较多(README 含大量推广链接)。@dataclass(frozen=True) 的 LLMProviderSpec 把「是什么」(默认模型/BaseURL/是否需 Key)与「怎么调」(adapter)分离,新增厂商几乎零侵入;并内置废弃模型/地址自动迁移逻辑,升级不破坏旧配置。_get_effective_video_codec + _write_videofile_with_codec_fallback 在 NVENC/AMF/QSV/VideoToolbox 不可用时自动降回 libx264,并对「运行时已失败编码器」做进程内禁用,避免每个片段重复失败——把易错的底层环境差异封装成对用户透明的机制。controllers/manager 把 API/CLI/WebUI 三端任务统一抽象,持久化阶段与错误、可恢复中断任务、发布与生成解耦——这是从「脚本玩具」走向「可用服务」的关键架构决策。MoneyPrinterTurbo 是一个工程完成度很高、以「易用性 + 兼容性 + 健壮性」为核心卖点的中文开源 AI 短视频生成工具。它不发明新的生成模型,而是把成熟组件(LLM 写文案、TTS 配音、MoviePy/ffmpeg 合成、第三方素材/发布 API)缝合成一条稳定可一键触发、且能在 Docker/Win/Mac/Colab/Agent 各环境跑起来的流水线。其最大价值在于:
局限同样现实:成片质量上限受外部 LLM/素材约束,素材版权与合规需用户自负,且它做的是「检索+拼接」式短视频而非语义级文生视频。理解这些边界,是评估是否采用该项目的前提。
main.py、config.example.toml、app/models/llm_provider.py、app/services/video.pyDockerfile / docker-compose.release.yml、webui.sh / webui.bat、cli.py注:本文档基于对该仓库 README、config.example.toml、main.py、app/models/llm_provider.py、app/services/video.py 及目录结构的逐字核对整理(核对时间 2026-07-29,仓库版本 v1.3.3)。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。