首页
/ MoneyPrinterTurbo 功能特性与实现解析:从参数模型到流水线源码的一键 AI 视频生成全解

MoneyPrinterTurbo 功能特性与实现解析:从参数模型到流水线源码的一键 AI 视频生成全解

2026-09-04 15:09:28作者:蔡丛锟

本文围绕 MoneyPrinterTurbo 的功能特性文档展开,逐项讲解文案生成、多模型接入、视频尺寸与批量生成、语音合成、字幕渲染、背景音乐与素材来源等核心功能在仓库中的真实实现位置与参数默认值,帮助读者既掌握完整的功能清单,又能从源码级理解每个参数如何影响最终的成片效果。

MoneyPrinterTurbo Web 界面 MoneyPrinterTurbo API 调试界面

一、功能特性总览

功能特性文档(features.md)以清单形式列出了项目的全部已实现特性。结合仓库源码,每一项特性都可以对应到具体的实现模块:

特性 文档描述 主要实现位置
MVC 架构 代码结构清晰,同时支持 APIWeb界面 app/router.pymain.pywebui/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.pydocs/voice-list.txt
字幕生成 可调整字体、位置、颜色、大小与描边 app/services/video.py#L243-L360
背景音乐 随机或指定音乐文件,可设置音量 app/services/video.py#L33-L46
高清无版权素材 Pexels / Pixabay 双素材源 config.example.tomlapp/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 版本的 videollm 两个控制器路由挂载到根路由上:

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,再通过查询接口获取 stateprogressvideoscombined_videos 等结果字段(见 app/models/schema.py#L196-L249TaskResponseTaskQueryResponse 的示例结构)。
  • Web 界面:执行 webui.sh / webui.bat 启动 Streamlit 界面(默认 8501 端口),界面功能见文首两张截图。

两种入口共用同一套 VideoParams 参数模型与任务流水线,配置行为完全一致。

三、视频文案:AI 自动生成与自定义

文案是整个流水线的起点,实现在 app/services/task.pystart() 主流程(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_providerconfig.example.toml 中最关键的配置项。文档列出的接入能力,在 app/services/llm.py#L21-L88 中以分支方式逐一实现,各提供商对应的配置文件项如下:

llm_provider 需要配置的配置项(config.toml 的 [app] 段) 默认 base_url / 模型
openai openai_api_keyopenai_model_name、可选 openai_base_url(代理) https://api.openai.com/v1gpt-4-turbo
moonshot(月之暗面) moonshot_api_key https://api.moonshot.cn/v1moonshot-v1-8k
azure azure_api_keyazure_base_urlazure_model_name(部署名)、azure_api_version 版本默认 2024-02-15-preview
oneapi oneapi_api_keyoneapi_base_urloneapi_model_name 无默认,必须显式配置
g4f(gpt4free) g4f_model_name 默认 gpt-3.5-turbo-16k-0613,无需 API Key
qwen(通义千问) qwen_api_keyqwen_model_name qwen-max,走 DashScope SDK
gemini gemini_api_keygemini_model_name gemini-1.0-pro,走 REST 传输
ollama ollama_model_name、可选 ollama_base_url http://localhost:11434/v1,本地部署

除文档列出的提供商外,从源码分支看,当前版本还支持 deepseekernie(文心一言,需 ernie_api_key + ernie_secret_key 换取 access_token)与 cloudflare 等接入方式。所有走 OpenAI 兼容协议的提供商(openai / moonshot / oneapi / azure / deepseek / ollama 等)最终都收敛到同一个 chat.completions.create 调用;缺少 api_keymodel_namebase_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:11080x1080)方形尺寸,video_aspect 参数默认值为竖屏 9:16。所有后续步骤(素材缩放、字幕定位)都以这个分辨率为准,例如 app/services/video.py#L106-L134 中会按目标宽高比对每个片段做等比缩放,比例不一致时用黑色背景填充居中(letterbox),保证任意比例的素材都能适配目标画幅。

六、批量生成与片段时长

批量生成video_count(默认 1)驱动。generate_final_videosapp/services/task.py#L159-L207)对每个序号执行“素材拼接 + 成片渲染”两轮,产出 combined-N.mp4(无字幕无配音的拼接版)与 final-N.mp4(最终成片),进度按 50 / video_count / 2 增量上报,方便前端展示。一个细节值得注意:当 video_count > 1 时,拼接模式会被强制切换为 random,保证每条批量视频采用不同的素材顺序,提高“抽卡”命中率。

片段时长video_clip_duration(默认 5 秒)控制。在 combine_videosapp/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-XiaoxiaoNeuralzh-CN-YunxiNeuralen-US-JennyNeural 等),README 说明 v1.1.2 起新增的 Azure 声音需要配置 azure 段的 speech_keyspeech_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 决定,取值 edgewhisper,留空则不生成字幕。在 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_videoapp/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_textapp/services/video.py#L185-L240)会把超出画面 90% 宽度的字幕按词(失败则按字符)自动换行,避免长句出屏;bottom 位置固定在画面高度 95% 处,top 在 5% 处。

九、背景音乐:随机或指定文件

背景音乐选择逻辑在 get_bgm_fileapp/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 秒淡出)效果后与配音合成 CompositeAudioClipVideoParams 中定义了 bgm_volume(默认 0.2)字段用于表达背景音量;从当前源码结构看,generate_video 中实际作用于 BGM 音轨的倍率取的是 params.voice_volume,调整音量时建议以该实现为准并实测效果。API 侧还提供了 BGM 文件列表检索与上传接口,响应结构见 app/models/schema.py#L276-L302

十、视频素材来源:网络素材与本地素材

素材下载源由 video_source 字段控制,config.example.toml 支持 pexelspixabay 两种:

  • 分别配置 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_videoapp/services/video.py#L363-L408),对 video_materialsMaterialInfo 列表,含 provider/url/duration)逐条处理:视频低于 480px 会被警告并跳过;图片素材会被渲染为带缓慢放大动效(Ken Burns)的 30 fps 视频片段,时长取 video_clip_duration

API 对外暴露的下载地址由 endpoint 配置控制(默认使用服务自身地址与端口,可设为反向代理域名),素材 API 访问还可在 proxy 段配置 http/https 代理。

十一、VideoParams 参数速查表

VideoParamsapp/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_pathimagemagick_path 若指向有效文件会分别写入 IMAGEIO_FFMPEG_EXEIMAGEMAGICK_BINARY 环境变量供 moviepy 自动检测。任务并发上限由 max_concurrent_tasks(默认 5)控制,多实例部署时可开启 enable_redis 使用 Redis 做任务状态共享。

十二、后期计划与当前实现对照

文档末尾的“后期计划”清单中,部分条目在仓库当前版本已有对应实现,阅读时需结合源码状态:

计划项 当前仓库状态
增加视频转场效果 已有雏形:VideoTransitionMode 枚举定义了 Shuffle/FadeIn/FadeOut/SlideIn/SlideOutapp/models/schema.py#L21-L27),combine_videos 对每个片段随机或指定应用 1 秒转场
可以使用自己的素材 已实现 video_source = "local" + video_materials,图片支持放大动效
朗读声音和背景音乐实时试听 README 已将“可实时试听效果”列入功能特性(Web 界面能力)
GPT-SoVITS 配音支持 源码未见相关实现,仍为计划
更多素材来源 config.example.toml 目前仅 pexelspixabay 两档
视频长度选项(短/中/长) 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 两种界面下复现同一套行为,这也是理解该项目“配置驱动 + 参数驱动”设计的最快路径。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
987
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384