MoneyPrinterTurbo 功能特性与实现解析:从参数模型到流水线源码的一键 AI 视频生成全解
本文围绕 MoneyPrinterTurbo 的功能特性文档展开,逐项讲解文案生成、多模型接入、视频尺寸与批量生成、语音合成、字幕渲染、背景音乐与素材来源等核心功能在仓库中的真实实现位置与参数默认值,帮助读者既掌握完整的功能清单,又能从源码级理解每个参数如何影响最终的成片效果。
一、功能特性总览
功能特性文档(features.md)以清单形式列出了项目的全部已实现特性。结合仓库源码,每一项特性都可以对应到具体的实现模块:
| 特性 | 文档描述 | 主要实现位置 |
|---|---|---|
| MVC 架构 | 代码结构清晰,同时支持 API 和 Web界面 |
app/router.py、main.py、webui/Main.py |
| 文案 AI 自动生成 / 自定义 | video_script 留空则走 LLM 生成,否则直接使用 |
app/services/task.py#L16-L33 |
| 多种高清视频尺寸 | 竖屏 9:16 1080x1920、横屏 16:9 1920x1080 |
app/models/schema.py#L30-L42 |
| 批量视频生成 | video_count > 1 时一次产出多个成片供挑选 |
app/services/task.py#L159-L207 |
| 视频片段时长设置 | video_clip_duration 控制素材切换频率 |
app/services/video.py#L49-L182 |
| 中文和英文文案 | video_language 参数,留空自动识别 |
app/services/llm.py#L262-L333 |
| 多种语音合成 | Edge-TTS + 内置 Azure 神经声音列表 | app/services/voice.py、docs/voice-list.txt |
| 字幕生成 | 可调整字体、位置、颜色、大小与描边 | app/services/video.py#L243-L360 |
| 背景音乐 | 随机或指定音乐文件,可设置音量 | app/services/video.py#L33-L46 |
| 高清无版权素材 | Pexels / Pixabay 双素材源 | config.example.toml、app/services/material.py |
| 多 LLM 模型接入 | OpenAI、moonshot、Azure、gpt4free、one-api、通义千问、Gemini、Ollama 等 | app/services/llm.py#L16-L101 |
二、MVC 架构:API 与 Web 界面双入口
从源码结构看,项目按标准 MVC 分层组织:app/controllers 负责请求入口,app/services 封装业务逻辑(llm、material、subtitle、task、video、voice),app/models 定义数据模型与参数 schema,app/config 负责配置加载。
API 入口集中在 app/router.py 中,它将 v1 版本的 video 与 llm 两个控制器路由挂载到根路由上:
root_api_router = APIRouter()
# v1
root_api_router.include_router(video.router)
root_api_router.include_router(llm.router)
- API 服务:执行
python main.py后监听 8080 端口,可通过/docs或/redoc在线调试接口;任务类接口返回task_id,再通过查询接口获取state、progress、videos、combined_videos等结果字段(见 app/models/schema.py#L196-L249 中TaskResponse与TaskQueryResponse的示例结构)。 - Web 界面:执行 webui.sh / webui.bat 启动 Streamlit 界面(默认 8501 端口),界面功能见文首两张截图。
两种入口共用同一套 VideoParams 参数模型与任务流水线,配置行为完全一致。
三、视频文案:AI 自动生成与自定义
文案是整个流水线的起点,实现在 app/services/task.py 的 start() 主流程(L210-L329)中:
video_script = params.video_script.strip()
if not video_script:
video_script = llm.generate_script(
video_subject=params.video_subject,
language=params.video_language,
paragraph_number=params.paragraph_number,
)
即 video_script 留空时由 LLM 基于 video_subject(主题)自动生成;显式传入则跳过生成直接采用自定义文案。生成文案的 prompt 在 app/services/llm.py#L262-L284 中定义,约束模型按指定段数输出纯文本、不加 Markdown 格式、不用“旁白”“欢迎观看”等前缀,并可用 language 字段指定文案语言(留空时要求模型跟随主题语言自动响应,从而支持中文与英文文案)。
源码中还有一套健壮性设计:generate_script 内部最多重试 5 次(_max_retries = 5),并对返回结果做清洗(去除 *、#、Markdown 链接残留);start() 中若脚本内容为空或包含 "Error: " 前缀,任务会被标记为失败状态。此外,用于素材搜索的关键词 video_terms 同样支持自定义(字符串按中英文逗号拆分,或列表形式传入),留空时由 LLM 生成 5 个英文搜索词(app/services/llm.py#L336-L397),因为素材站检索必须使用英文关键词。
四、多 LLM 模型接入
llm_provider 是 config.example.toml 中最关键的配置项。文档列出的接入能力,在 app/services/llm.py#L21-L88 中以分支方式逐一实现,各提供商对应的配置文件项如下:
| llm_provider | 需要配置的配置项(config.toml 的 [app] 段) | 默认 base_url / 模型 |
|---|---|---|
openai |
openai_api_key、openai_model_name、可选 openai_base_url(代理) |
https://api.openai.com/v1、gpt-4-turbo |
moonshot(月之暗面) |
moonshot_api_key |
https://api.moonshot.cn/v1、moonshot-v1-8k |
azure |
azure_api_key、azure_base_url、azure_model_name(部署名)、azure_api_version |
版本默认 2024-02-15-preview |
oneapi |
oneapi_api_key、oneapi_base_url、oneapi_model_name |
无默认,必须显式配置 |
g4f(gpt4free) |
g4f_model_name |
默认 gpt-3.5-turbo-16k-0613,无需 API Key |
qwen(通义千问) |
qwen_api_key、qwen_model_name |
qwen-max,走 DashScope SDK |
gemini |
gemini_api_key、gemini_model_name |
gemini-1.0-pro,走 REST 传输 |
ollama |
ollama_model_name、可选 ollama_base_url |
http://localhost:11434/v1,本地部署 |
除文档列出的提供商外,从源码分支看,当前版本还支持 deepseek、ernie(文心一言,需 ernie_api_key + ernie_secret_key 换取 access_token)与 cloudflare 等接入方式。所有走 OpenAI 兼容协议的提供商(openai / moonshot / oneapi / azure / deepseek / ollama 等)最终都收敛到同一个 chat.completions.create 调用;缺少 api_key、model_name 或 base_url 任意一项时,代码会抛出带提供商名称的 ValueError,便于定位配置缺失。
国内网络环境下 README 建议使用 DeepSeek 或 Moonshot 作为提供商(国内可直接访问);无 API Key 时可用 g4f 或本地 Ollama 替代。
五、视频尺寸:16:9、9:16 与 1:1
文档提到竖屏 9:16(1080x1920)与横屏 16:9(1920x1080)两种高清尺寸,源码中由 VideoAspect 枚举统一映射分辨率(app/models/schema.py#L30-L42):
class VideoAspect(str, Enum):
landscape = "16:9"
portrait = "9:16"
square = "1:1"
def to_resolution(self):
if self == VideoAspect.landscape.value:
return 1920, 1080
elif self == VideoAspect.portrait.value:
return 1080, 1920
elif self == VideoAspect.square.value:
return 1080, 1080
return 1080, 1920
可以看到当前源码实际上比文档清单多支持一个 1:1(1080x1080)方形尺寸,video_aspect 参数默认值为竖屏 9:16。所有后续步骤(素材缩放、字幕定位)都以这个分辨率为准,例如 app/services/video.py#L106-L134 中会按目标宽高比对每个片段做等比缩放,比例不一致时用黑色背景填充居中(letterbox),保证任意比例的素材都能适配目标画幅。
六、批量生成与片段时长
批量生成由 video_count(默认 1)驱动。generate_final_videos(app/services/task.py#L159-L207)对每个序号执行“素材拼接 + 成片渲染”两轮,产出 combined-N.mp4(无字幕无配音的拼接版)与 final-N.mp4(最终成片),进度按 50 / video_count / 2 增量上报,方便前端展示。一个细节值得注意:当 video_count > 1 时,拼接模式会被强制切换为 random,保证每条批量视频采用不同的素材顺序,提高“抽卡”命中率。
片段时长由 video_clip_duration(默认 5 秒)控制。在 combine_videos(app/services/video.py#L49-L182)中,每段下载素材会被按该值切分成多个短片段,然后按 video_concat_mode 处理:
random(默认):所有短片段全局洗牌,循环取用直到总时长覆盖配音时长;sequential:每段素材只取第一个切出的片段,按原始顺序拼接。
最终视频帧率固定为 30 fps,多片段通过 concatenate_videoclips 顺序连接;配音不足时长时最后一个片段会被精确裁剪到剩余时长,保证音画严格对齐。调节 video_clip_duration 即等于调节“画面切换频率”:数值越小切换越快,适合快节奏内容。
七、语音合成与中英文支持
语音模块位于 app/services/voice.py,基于 Edge-TTS 的 SubMaker 完成文案朗读,同时把逐词时间戳落盘为字幕所需的中间数据。完整的声音清单见 docs/voice-list.txt,其中内置了一份覆盖数十种语言的 Azure 神经声音列表(如 zh-CN-XiaoxiaoNeural、zh-CN-YunxiNeural、en-US-JennyNeural 等),README 说明 v1.1.2 起新增的 Azure 声音需要配置 azure 段的 speech_key 与 speech_region,音质更真实。
与语音相关的可配置参数(均为 VideoParams 字段,默认值来自 app/models/schema.py#L87-L92):
| 参数 | 默认值 | 作用 |
|---|---|---|
voice_name |
"" |
声音名,留空使用默认声音;需与文案语种匹配 |
voice_volume |
1.0 |
配音音量倍率,在渲染阶段以 MultiplyVolume 生效 |
voice_rate |
1.0 |
语速倍率 |
video_language(默认空字符串)用于声明文案语种,留空时按“自动识别”处理;任务主流程中配音失败时,日志会提示检查“声音语言与文案语言是否匹配”以及网络(app/services/task.py#L83-L90)。
八、字幕生成:识别与渲染两个阶段
字幕分为“识别”与“渲染”两步。
识别:由 config.example.toml 中的 subtitle_provider 决定,取值 edge 或 whisper,留空则不生成字幕。在 app/services/task.py#L96-L123 中:
edge模式速度快、无硬件要求,直接利用 TTS 阶段产出的时间戳生成 SRT;若生成后文件缺失会自动降级(fallback)到 whisper;whisper模式基于faster-whisper,模型大小由 whisper 段的model_size(默认large-v3)、device(默认 CPU)、compute_type(默认 int8)控制,识别后还会调用subtitle.correct用原文案校正错字;subtitle_enabled(默认True)为false时直接跳过整个识别环节。
渲染:在 generate_video(app/services/video.py#L243-L360)中逐条 SRT 生成 TextClip,文档提到的字体、位置、颜色、大小、描边均对应 VideoParams 字段:
| 参数 | 默认值 | 说明 |
|---|---|---|
font_name |
STHeitiMedium.ttc |
字体文件名,从 resource/fonts 目录加载,可自行放置字体 |
font_size |
60 |
字号 |
text_fore_color |
#FFFFFF |
前景色 |
text_background_color |
True |
背景色,可设为 "transparent" |
stroke_color / stroke_width |
#000000 / 1.5 |
字幕描边颜色与宽度 |
subtitle_position |
bottom |
top / bottom / center / custom |
custom_position |
70.0 |
custom 模式下的垂直位置百分比,代码会将其约束在安全边距内 |
另外,wrap_text(app/services/video.py#L185-L240)会把超出画面 90% 宽度的字幕按词(失败则按字符)自动换行,避免长句出屏;bottom 位置固定在画面高度 95% 处,top 在 5% 处。
九、背景音乐:随机或指定文件
背景音乐选择逻辑在 get_bgm_file(app/services/video.py#L33-L46):
if bgm_file and os.path.exists(bgm_file):
return bgm_file
if bgm_type == "random":
files = glob.glob(os.path.join(song_dir, "*.mp3"))
return random.choice(files)
即 bgm_file 指向存在的文件时优先使用指定音乐,否则在 bgm_type == "random" 时从 resource/songs 目录随机挑选一首 mp3。音乐库默认曲目见 README 说明(位于 resource/songs,可自行增删)。
在渲染阶段,BGM 会套用 AudioLoop(循环铺满全片)、AudioFadeOut(3)(结尾 3 秒淡出)效果后与配音合成 CompositeAudioClip。VideoParams 中定义了 bgm_volume(默认 0.2)字段用于表达背景音量;从当前源码结构看,generate_video 中实际作用于 BGM 音轨的倍率取的是 params.voice_volume,调整音量时建议以该实现为准并实测效果。API 侧还提供了 BGM 文件列表检索与上传接口,响应结构见 app/models/schema.py#L276-L302。
十、视频素材来源:网络素材与本地素材
素材下载源由 video_source 字段控制,config.example.toml 支持 pexels 与 pixabay 两种:
- 分别配置
pexels_api_keys/pixabay_api_keys(支持多个 Key 用英文逗号分隔、双引号包裹,以规避限流); - app/services/task.py#L126-L156 中按搜索词、画幅、总时长(配音时长 ×
video_count)与单片上限(video_clip_duration)下载素材; material_directory配置素材缓存目录:留空写入默认./storage/cache_videos(跨任务复用),设为task则每个任务独立存放、不复用缓存。
本地素材能力在文档“后期计划”中列出,而当前源码已实现:video_source = "local" 时走 preprocess_video(app/services/video.py#L363-L408),对 video_materials(MaterialInfo 列表,含 provider/url/duration)逐条处理:视频低于 480px 会被警告并跳过;图片素材会被渲染为带缓慢放大动效(Ken Burns)的 30 fps 视频片段,时长取 video_clip_duration。
API 对外暴露的下载地址由 endpoint 配置控制(默认使用服务自身地址与端口,可设为反向代理域名),素材 API 访问还可在 proxy 段配置 http/https 代理。
十一、VideoParams 参数速查表
VideoParams(app/models/schema.py#L56-L105)是 API 与 Web 界面共用的完整参数模型,汇总默认值如下:
| 分组 | 参数 | 默认值 |
|---|---|---|
| 内容 | video_subject / video_script / video_terms / paragraph_number |
必填 / "" / 自动生成 / 1 |
| 画面 | video_aspect |
9:16 |
| 画面 | video_concat_mode |
random |
| 画面 | video_transition_mode |
无(另见下文转场枚举) |
| 画面 | video_clip_duration / video_count |
5 秒 / 1 个 |
| 素材 | video_source / video_materials |
pexels / 本地素材列表 |
| 语音 | voice_name / voice_volume / voice_rate |
"" / 1.0 / 1.0 |
| 音乐 | bgm_type / bgm_file / bgm_volume |
random / "" / 0.2 |
| 字幕 | subtitle_enabled / subtitle_position / custom_position |
True / bottom / 70.0 |
| 字幕 | font_name / font_size |
STHeitiMedium.ttc / 60 |
| 字幕 | text_fore_color / text_background_color |
#FFFFFF / True |
| 字幕 | stroke_color / stroke_width |
#000000 / 1.5 |
| 性能 | n_threads |
2 |
配置加载入口在 app/config/config.py:首次启动若不存在 config.toml 会自动从 config.example.toml 复制;ffmpeg_path、imagemagick_path 若指向有效文件会分别写入 IMAGEIO_FFMPEG_EXE、IMAGEMAGICK_BINARY 环境变量供 moviepy 自动检测。任务并发上限由 max_concurrent_tasks(默认 5)控制,多实例部署时可开启 enable_redis 使用 Redis 做任务状态共享。
十二、后期计划与当前实现对照
文档末尾的“后期计划”清单中,部分条目在仓库当前版本已有对应实现,阅读时需结合源码状态:
| 计划项 | 当前仓库状态 |
|---|---|
| 增加视频转场效果 | 已有雏形:VideoTransitionMode 枚举定义了 Shuffle/FadeIn/FadeOut/SlideIn/SlideOut(app/models/schema.py#L21-L27),combine_videos 对每个片段随机或指定应用 1 秒转场 |
| 可以使用自己的素材 | 已实现 video_source = "local" + video_materials,图片支持放大动效 |
| 朗读声音和背景音乐实时试听 | README 已将“可实时试听效果”列入功能特性(Web 界面能力) |
| GPT-SoVITS 配音支持 | 源码未见相关实现,仍为计划 |
| 更多素材来源 | config.example.toml 目前仅 pexels 与 pixabay 两档 |
| 视频长度选项(短/中/长) | VideoParams 尚无对应字段,时长由 paragraph_number、文案长度间接决定 |
| 免费网络代理 | proxy 段仅提供素材 API 的代理配置,无内置免费代理 |
| 更多语音服务商(如 OpenAI TTS) | 当前为 Edge-TTS + Azure 两套,README 亦将其列为计划 |
| 自动上传 YouTube | 源码未见上传逻辑,仍为计划 |
小结
MoneyPrinterTurbo 的功能特性可以用一条数据流概括:主题/关键词 → LLM 生成文案与搜索词 → 素材下载(Pexels/Pixabay 或本地)→ Edge-TTS/Azure 配音 → 字幕识别与渲染 → 片段切分拼接 + 转场 → 配音、BGM、字幕合成出片。文档中的每一项特性都能在 app/models/schema.py 的参数模型与 app/services/task.py 的主流程中找到对应实现;以 VideoParams 为入口调整参数、以 config.example.toml 配置模型与素材源,即可在 API 与 Web 两种界面下复现同一套行为,这也是理解该项目“配置驱动 + 参数驱动”设计的最快路径。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00

