day26-视频创作项目02
自动生成短视频
项目前置
工作流完整流程

MoneyPrinterTurbo开源地址:https://github.com/harry0703/MoneyPrinterTurbo
通过FileZilla连接centos:https://blog.csdn.net/2302_79975502/article/details/153774552
下面操作可以在windows中操作文件,然后通过FileZilla将操作后的文件同步到centos即可:
-
将MoneyPrinterTurbo解压缩后文件夹中的config.example.toml复制一份,粘贴成config.toml即可
-
然后编辑MoneyPrinterTurbo解压缩后文件夹中的docker-compose.yml文件:

- 添加一行配置:
/n8n_sys/n8ndata:/MoneyPrinterTurbo/storage/local_videos- MoneyPrinterTurbo项目的该配置表示将
MoneyPrinterTurbo/storage/local_videos地址映射到/n8n_sys/n8ndata中,目的是为了可以让n8n访问local_videos资源文件夹。
- MoneyPrinterTurbo项目的该配置表示将
- 添加一行配置:
基于docker安装启动MoneyPrinterTurbo项目:
-
首先需要安装docker compose
- 下载 Docker Compose 二进制文件:
- sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-\((uname -s)-\)(uname -m)" -o /usr/local/bin/docker-compose
- 赋予执行权限:
- sudo chmod +x /usr/local/bin/docker-compose
- 下载 Docker Compose 二进制文件:
-
启动docker服务:
systemctl restart docker -
在centos中cd进入MoneyPrinterTurbo文件夹,执行
docker compose up -d -
项目启动后,会启动两个服务:
- 注意有时候谷歌浏览器无法访问页面,更换其他浏览器尝试。
- 端口为8501的webui页面服务:ip:8501
- 端口为8080的api调用服务:ip:8080/docs
-
端口为8501的webui页面服务的首次使用
-
右上角切换语言为中文
-
进行基础设置(左上角)
-
大模型设置:
-
比如deepseek。该模型是用来进行创作文案生成的。
-
-
视频源设置:(免费素材网站的API KEY设置)
-
需要进行素材网站的注册(需谷歌账号)
-
-
音频设置:
-
视频设置:
-
-
测试效果:

-
-
设置好页面的相关参数后,需要将参数同步到docker的配置文件中,执行如下指令接口
docker-compose up -d
-
重启项目:
docker compose restart
-
注意:但凡是在web页面中对项目配置参数进行了修改一定要重新执行上述两条指令在docker中生效!
n8n工作流流程
免费素材生视频
添加表单触发节点
设置表单节点
添加表单字段(视频主题、素材来源、AI生成素材类型和视频时长)
执行节点:
浏览器访问节点:
添加文案生成节点
接受用户在form表单中录入的视频主题内容,使用大模型生成对应主题的具体文案内容和文案核心关键词。
Basic LLM Chain(基础 LLM 链)节点是 n8n 中用于与大语言模型(LLM)进行单次、直接交互的核心节点。
你可以把它理解成一个“智能查询工具”:你给它一个指令或问题,它就去问连接的AI模型,然后把答案返回给你。它最大的特点是“专注”——专注于执行单一的、定义好的任务,比如内容总结、翻译或文本生成,而不具备多轮对话的记忆能力或调用外部工具的功能。
设置节点:
系统提示词内容:(定义模型的职责,根据系统提示词表示的主题创作对应的文案)
## Role:
你是一名专业的爆款短视频创作者,专注于掌握和运用短视频文案创作技巧,帮助用户生成吸引眼球的短视频脚本。
## Skills:
- 熟悉抖音短视频平台的脚本爆款逻辑,了解哪种类型的脚本可能成为爆款
- 擅长用幽默风趣,通俗易懂的语言风格
- 擅长在前3句脚本,就能抓住目标群体的眼球
- 根据文案内容生成一组和主题密切相关的英文关键词,用英文逗号分隔,以便我搜索素材
## Constrains:
- 脚本时长{{ $('On form submission').item.json['视频时长']}}左右
- 直接输出脚本段落,不得包含任何类型的标记或格式,永远不要使用标题
- 使用逗号和句号进行正常的语句分隔
- 脚本长度不得低于60个汉字
添加模型和模型的输出格式控制
模型的输出格式控制的设置(提取视频文案内容和文案关键词):
添加条件判断节点
判断form表单中用户录入的【素材来源】是“免费素材”还是“AI生成”的。

添加HTTP Request节点
如果条件判断节点为Ture则后续添加http请求节点,去MoneyPrinterTurbo项目中基于前面生成的内容创作视频。
现在,我们来到MoneyPrinterTurbo项目的api接口页面http://ip:8080/docs#/查看相关api:
查看生成视频API接口详情:
上面的请求参数我们无需手动填写,可以在MoneyPrinterTurbo项目的web页面,录入n8n中form表单预设的主题和自动填充的文案后,进行视频生成:
复制请求体内容:
http requests节点配置:
注意 ---> 因为http发生在docker中,因此在window环境下请求地址务必是 http://host.docker.internal:8080/具体接口。
而在centos中请求地址可以为:http://主机ip:8080/具体接口

添加等待节点
配置等待节点:
添加HTTP Request节点
通过http请求查询视频生成的状态信息。基于MoneyPrinterTurbo项目的api接口查询。

http节点配置:

添加判断节点
判断上一个http节点视频生成状态返回的进度条是否为100,为100则表示视频创作完成仅继续执行下一步下载视频,否则返回到等待节点继续等待视频生成。

添加HTTP Request节点
将上一个if判断节点返回结果中视频生成后的链接进行http请求进行视频数据获取。

执行该节点查看视频。
添加ssh节点
将上一步请求到的视频二进制数据通过ssh节点的upload a file子节点将视频数据上传到centos系统磁盘中存储。
节点配置1-设置ssh的证书:
其他配置:
- 存储路径:
/n8n_sys/n8ndata/media-mp4/{{ $('On form submission').item.json['视频主题'] }}- 视频主题作为存储视频文件夹的名称,视频名字没法修改默认叫做final.mp4
至此,通过免费素材的方式进行视频生成的分支就结束了。下面是通过“AI生成”的方式进行视频创作。
AI生视频
添加cmd节点
在工作流第三个节点if的另一个分支后面添加cmd节点,执行一个cmd指令创建一个和视频主题一致的文件夹,用于存储后续每个镜头对应的子视频。
mkdir -p /n8n_sys/media-mp4/{{ $('On form submission').item.json['视频主题'] }}
添加AI Agent节点
在工作流cmd节点后面添加AI Agent节点,该节点的作用是将上一步节点生成的文案内容进行拆分设计,设计成视频的镜头脚本和镜头的画面描述。
节点设置:
# Role
你是一个专业的爆款短视频创作者,擅长分析用户提供的文案内容并将其拆分成短视频脚本。你的任务是根据用户给的文案生成一份详细的短视频脚本,包括旁白和画面描述。
## Skills
### Skill 1: 分析与拆分内容
- 当用户提供文案内容时,首先分析其主题和核心信息。
- 将内容拆分为几个关键点,以便更好地组织视频脚本。
### Skill 2: 生成短视频脚本
- 根据拆分后的内容,编写旁白部分,确保语言流畅且吸引观众。
- 为每个旁白段落生成画面描述,提供详细的视觉提示词,以指导图片或视频的制作。
- 画面描述应与旁白内容紧密结合,增强观众的理解和体验。
添加模型和格式输出控制:
{
"video_script": [
{
"voiceover": "文案/旁白",
"visual_description": "生成图片/视频的提示词"
},
{
"voiceover": "文案/旁白",
"visual_description": "生成图片/视频的提示词"
}
]
}
添加拆分节点
将上一个AI Agent节点生成的所有分镜旁白和画面描述进行拆分,然后一个镜头一个镜头进行生成。

如图所示,将一个items拆分成了3个items。
添加limit节点
此处可以添加一个limit节点限制生成镜头的数量,例如limit 1,可用于测试环节。
添加IF节点
判断用户是想要生成图片还是想要生成视频。
节点配置:
添加循环节点
在if为false分支后面,添加一个loop循环节点,让循环可以将拆分节点拆分出来的一个又一个的镜头一次进行视频生成。
添加http节点
添加一个请求节点,调用外部大模型进行每次循环对应一个镜头的视频生成。此处使用外部平台对应的视频创作模型。
可以基于github或者google账号直接注册。根据默认提示直接进行每一步注册操作即可。
例如视频生成选择keling模型,费用大概是20s的视频1美元:

平台费用充值:https://replicate.com/account/billing
模型API接口查看:

关于详细的请求体可查看:
上一步配置好之后,可以在此处复制现成的请求体内容:
http节点配置:
请求体内容:
{
"input": {
"prompt": "{{ $json.visual_description }}",
"duration": 5,
"cfg_scale": 0.5,
"aspect_ratio": "9:16",
"negative_prompt": ""
}
}
添加wait等待节点
等待视频生成然后等待中查看视频生成状态
添加视频生成状态节点
视频生成状态接口介绍:https://replicate.com/kwaivgi/kling-v1.6-standard/api/learn-more#prediction-lifecycle

When you run a model on Replicate, the prediction is created with a “starting” state, then instantly returned. This will then move to "processing" and eventual one of “successful”, "failed" or "canceled".
当你在Replicate上运行模型时,预测会从“开始starting”状态创建,然后立即返回。之后,它将进入“处理processing”状态,并最终变为“成功Succeeded”、“失败failed”或“已取消canceled”状态之一。
视频生成状态接口信息:https://replicate.com/kwaivgi/kling-v1.6-standard/api/api-reference
然后下拉页面找到:

添加http节点以及节点配置:
添加IF节点
判断上一步视频生成状态显示视频是否已经创建成功,因为视频状态可以是:“处理processing”状态,“成功succeeded”、“失败failed”或“已取消canceled”状态之一。
当判断成功后进行视频下载,判断失败则返回等待节点继续等待:
Pin视频生成节点
在测试环节使用,防止后续节点运行重复下载视频,消耗token。
添加下载视频节点
当上一步if判断成功,则进行视频下载
节点配置:
保存视频
节点配置:
视频存储路径:
文件夹路径:/n8n_sys/n8ndata/media-mp4/{{ $('On form submission').item.json['视频主题'] }}
视频名称:{{$node["Loop Over Items"].context["currentRunIndex"] + 1}}.mp4
。
注意:{{$node["Loop Over Items"].context["currentRunIndex"] + 1}}这个是Loop Over Items循环节点循环次数表达式。$node["Loop Over Items"]中的Loop Over Items是循环节点名称。
该分支结束
图片生视频
添加循环节点
在判断素材类型的if节点后面添加loop循环节点
添加http节点
用于进行图片生成。此处使用seedream-4模型,模型文档地址:https://replicate.com/bytedance/seedream-4/api
节点配置:
添加http节点
进行图片下载
保存图片
添加ssh的load a file节点:
文件夹路径:/n8n_sys/n8ndata/media-mp4/{{ $('On form submission').item.json["视频主题"] }}
文件名:{{$node["Loop Over Items1"].context["currentRunIndex"] + 1}}.jpg
添加code节点
保存图片后,需要添加一个code节点,将图片的完整路径进行返回,返回给该分支前面的loop节点。
合成素材
至此,我们已经可以获取【AI生成素材类型】中选项为图片或者视频对应的素材内容。接下来需要将这些素材通过MoneyPrinterTurbo项目进行素材的合成最终生成完整的视频作品。
浏览器打开http://192.168.227.128:8501/创作页,在视频设置环节将视频来源修改为本地文件:
点击【生成视频】查看请求参数:
-
设置好页面的相关参数后,需要将参数同步到docker的配置文件中,执行如下指令接口
- cd MoneyPrinterTurbo
docker-compose up -d
-
重启项目:
docker compose restart
-
注意:但凡是在web页面中对项目配置参数进行了修改一定要重新执行上述两条指令在docker中生效!
因此,现在如果想要使用MoneyPrinterTurbo项目来进行【素材来源】的更换,需要获取之前图片或者视频片段的完整路径才可以。
code节点
因此,需要在保存图片和之前AI生成视频的保存视频节点后添加一个code节点,让其给loop循环节点返回创作好素材的完整路径。
比如目前在【AI生成素材类型】为图片的分支中,在保存图片节点后添加code节点,使其可以给该分支前面的loop节点返回图片素材路径,code节点内容如下:
注意代码中对应loop节点的名称
//存储图片文件夹路径
const folderName = $('On form submission').first().json['视频主题'];
//获取循环下标
const loopIndex = $('Loop Over Items1').context.currentRunIndex + 1;
//获取图片文件名
const fileName = loopIndex.toString() + '.jpg';
//拼接成完整图片路径
const fullPath = `/MoneyPrinterTurbo/storage/local_videos/${folderName}/${fileName}`;
return {
provider: "local",
url: fullPath,
duration: 0
};
同理,给保存AI视频节点后也添加code节点,给其分支的loop节点返回视频完整路径:
注意代码中对应loop节点的名称
//存储图片文件夹路径
const folderName = $('On form submission').first().json['视频主题'];
//获取循环下标
const loopIndex = $('Loop Over Items').context.currentRunIndex + 1;
//获取图片文件名
const fileName = loopIndex.toString() + '.mp4';
//拼接成完整图片路径
const fullPath = `/MoneyPrinterTurbo/storage/local_videos/${folderName}/${fileName}`;
return {
provider: "local",
url: fullPath,
duration: 0
};
添加code节点
接受两个loop循环返回的结果,将结果处理成上面【合成素材】章节中点击【生成视频】对应请求参数的格式。
例如,素材类型为图片的时候,该分支的Loop循环返回内容为:
[
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/1.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/2.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/3.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/4.jpg",
"duration": 0
}
]
添加该code节点:
// 获取所有输入项
const allItems = $input.all();
// 提取每个 item 中的 json 数据
const inputItems = allItems.map(item => {
return item.json;
});
// 返回新的格式
return [{
images: inputItems
}];
该code节点可以将上面Loop循环返回内容格式转换为:
[
{
"images": [
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/1.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/2.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/3.jpg",
"duration": 0
},
{
"provider": "local",
"url": "/MoneyPrinterTurbo/storage/local_videos/人生不易/4.jpg",
"duration": 0
}
]
}
]
这样在后面就可以直接通过提取上面json结构中的images返回的value值就可以作为生成视频请求体中的video_materials参数的值了。
添加http节点
接下来进行视频生成请求发送。还是查看http://192.168.227.128:8080/docs中的生成视频的api进行http请求
添加wait节点
添加http节点
查看视频生成状态
添加if节点
如果视频没有生成完成则继续返回wait节点
如果if返回false则连线到wait节点,继续等待:

添加http节点
在if节点后面添加http节点下载视频
保存视频
添加ssh节点保存视频
n8n父子工作流
需求描述
实现在一个工作流中调用另一个工作流。
具体需求:父工作流读取飞书excel表格中的多行,然后在本地依次生成每一个视频主题对应的文件夹。飞书表格地址:https://co3nhi5ooh.feishu.cn/drive/folder/OETXfYE6vlyx6LdMD2ac87RmnMv
表格内容:

父工作流设计
添加【获取工作表】飞书节点
添加【查询工作表】飞书节点
添加【读取单个范围】飞书节点
添加code节点:将读取到的数据进行适当格式转换
// 提取values数组(跳过第1行标题)
const rows = items[0].json.data.valueRange.values.slice(1);
// 转换为n8n的items格式
return rows.map(row => ({
json: {
视频主题: row[0],
素材来源: row[1],
AI生成素材类型: row[2],
视频时长: row[3]
}
}));
添加循环节点:循环调用子工作流
子工作流负责创建视频主题对应的文件夹
-
在该节点中添加【调用子工作流】节点:
-
【调用子工作流】节点配置说明
注意:只有某个工作流中存在【When Executed by Another Workflow】节点,才可以被视为【子工作流】,才可以在下图的workflow下拉列表中找到子工作流。
子工作流设计
添加子工作流核心触发节点
配置节点:
点击`+ Add field`,依次添加字段名和类型(和父工作流要传的字段对应)。
添加cmd节点创建文件夹

最后运行父工作流节点,查看文件夹是否以此创建成功!

浙公网安备 33010602011771号