day26-视频创作项目02

自动生成短视频

项目前置

工作流完整流程

image-20260317083529716

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文件:

    image-20260407192346077

    • 添加一行配置:/n8n_sys/n8ndata:/MoneyPrinterTurbo/storage/local_videos
      • MoneyPrinterTurbo项目的该配置表示将MoneyPrinterTurbo/storage/local_videos地址映射到 /n8n_sys/n8ndata中,目的是为了可以让n8n访问local_videos资源文件夹。

基于docker安装启动MoneyPrinterTurbo项目:

  • 首先需要安装docker compose

  • 启动docker服务:systemctl restart docker

  • 在centos中cd进入MoneyPrinterTurbo文件夹,执行docker compose up -d

  • 项目启动后,会启动两个服务:

    • 注意有时候谷歌浏览器无法访问页面,更换其他浏览器尝试。
    • 端口为8501的webui页面服务:ip:8501
    • 端口为8080的api调用服务:ip:8080/docs
  • 端口为8501的webui页面服务的首次使用

    • 右上角切换语言为中文

      image-20260317093821102
    • 进行基础设置(左上角)

      image-20260317093855314
      • 大模型设置:

        • 比如deepseek。该模型是用来进行创作文案生成的。

          image-20260317094029852
      • 视频源设置:(免费素材网站的API KEY设置)

        image-20260317094151705
        • 需要进行素材网站的注册(需谷歌账号)

          image-20260317094829122 image-20260317094844869 image-20260317094912880
      • 音频设置:

        image-20260317095240022
      • 视频设置:

        image-20260317095605775
    • 测试效果:

      image-20260317100222424

    image-20260317103123597

  • 设置好页面的相关参数后,需要将参数同步到docker的配置文件中,执行如下指令接口

    • docker-compose up -d
  • 重启项目:

    • docker compose restart
  • 注意:但凡是在web页面中对项目配置参数进行了修改一定要重新执行上述两条指令在docker中生效!

n8n工作流流程

免费素材生视频

添加表单触发节点

image-20260317142838084 image-20260317142905589

设置表单节点

image-20260317143155801

添加表单字段(视频主题、素材来源、AI生成素材类型和视频时长)

image-20260317143359829 image-20260317143436701

执行节点:

image-20260317143537669

浏览器访问节点:

image-20260317143718557

添加文案生成节点

接受用户在form表单中录入的视频主题内容,使用大模型生成对应主题的具体文案内容和文案核心关键词。

Basic LLM Chain(基础 LLM 链)节点是 n8n 中用于与大语言模型(LLM)进行单次、直接交互的核心节点

你可以把它理解成一个“智能查询工具”:你给它一个指令或问题,它就去问连接的AI模型,然后把答案返回给你。它最大的特点是“专注”——专注于执行单一的、定义好的任务,比如内容总结、翻译或文本生成,而不具备多轮对话的记忆能力或调用外部工具的功能。

image-20260317143854627

设置节点:

image-20260317144837406 image-20260317145603026

系统提示词内容:(定义模型的职责,根据系统提示词表示的主题创作对应的文案)

## Role:
你是一名专业的爆款短视频创作者,专注于掌握和运用短视频文案创作技巧,帮助用户生成吸引眼球的短视频脚本。

## Skills:
- 熟悉抖音短视频平台的脚本爆款逻辑,了解哪种类型的脚本可能成为爆款
- 擅长用幽默风趣,通俗易懂的语言风格
- 擅长在前3句脚本,就能抓住目标群体的眼球
- 根据文案内容生成一组和主题密切相关的英文关键词,用英文逗号分隔,以便我搜索素材

## Constrains:
- 脚本时长{{ $('On form submission').item.json['视频时长']}}左右
- 直接输出脚本段落,不得包含任何类型的标记或格式,永远不要使用标题
- 使用逗号和句号进行正常的语句分隔
- 脚本长度不得低于60个汉字

添加模型和模型的输出格式控制

image-20260317150015536

模型的输出格式控制的设置(提取视频文案内容和文案关键词):

image-20260317145903588

添加条件判断节点

判断form表单中用户录入的【素材来源】是“免费素材”还是“AI生成”的。

image-20260317150652670

添加HTTP Request节点

如果条件判断节点为Ture则后续添加http请求节点,去MoneyPrinterTurbo项目中基于前面生成的内容创作视频。

现在,我们来到MoneyPrinterTurbo项目的api接口页面http://ip:8080/docs#/查看相关api:

image-20260317151135661

查看生成视频API接口详情:

image-20260317151504230

上面的请求参数我们无需手动填写,可以在MoneyPrinterTurbo项目的web页面,录入n8n中form表单预设的主题和自动填充的文案后,进行视频生成:

image-20260317151935443

复制请求体内容:

image-20260317152151820

http requests节点配置:

注意 ---> 因为http发生在docker中,因此在window环境下请求地址务必是 http://host.docker.internal:8080/具体接口

而在centos中请求地址可以为:http://主机ip:8080/具体接口

image-20260317154004886

添加等待节点

image-20260317175337693

配置等待节点:

image-20260317175621955

添加HTTP Request节点

通过http请求查询视频生成的状态信息。基于MoneyPrinterTurbo项目的api接口查询。

image-20260317175948831

http节点配置:

image-20260317180747424

添加判断节点

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

image-20260317181222076

image-20260317181300543

添加HTTP Request节点

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

image-20260317181850237

执行该节点查看视频。

添加ssh节点

image-20260320110209911

将上一步请求到的视频二进制数据通过ssh节点的upload a file子节点将视频数据上传到centos系统磁盘中存储。

节点配置1-设置ssh的证书:

image-20260320110410830 image-20260320110457802

其他配置:

image-20260320110544874
  • 存储路径:
    • /n8n_sys/n8ndata/media-mp4/{{ $('On form submission').item.json['视频主题'] }}
    • 视频主题作为存储视频文件夹的名称,视频名字没法修改默认叫做final.mp4

至此,通过免费素材的方式进行视频生成的分支就结束了。下面是通过“AI生成”的方式进行视频创作。

image-20260318083020013

AI生视频

添加cmd节点

image-20260320162812411

在工作流第三个节点if的另一个分支后面添加cmd节点,执行一个cmd指令创建一个和视频主题一致的文件夹,用于存储后续每个镜头对应的子视频。

image-20260320163240496

mkdir -p /n8n_sys/media-mp4/{{ $('On form submission').item.json['视频主题'] }}

添加AI Agent节点

在工作流cmd节点后面添加AI Agent节点,该节点的作用是将上一步节点生成的文案内容进行拆分设计,设计成视频的镜头脚本和镜头的画面描述。

节点设置:

image-20260318083558139
# Role
你是一个专业的爆款短视频创作者,擅长分析用户提供的文案内容并将其拆分成短视频脚本。你的任务是根据用户给的文案生成一份详细的短视频脚本,包括旁白和画面描述。

## Skills
### Skill 1: 分析与拆分内容
- 当用户提供文案内容时,首先分析其主题和核心信息。
- 将内容拆分为几个关键点,以便更好地组织视频脚本。

### Skill 2: 生成短视频脚本
- 根据拆分后的内容,编写旁白部分,确保语言流畅且吸引观众。
- 为每个旁白段落生成画面描述,提供详细的视觉提示词,以指导图片或视频的制作。
- 画面描述应与旁白内容紧密结合,增强观众的理解和体验。

添加模型和格式输出控制:

image-20260318084833464
{
  "video_script": [
    {
    	"voiceover": "文案/旁白",
    	"visual_description": "生成图片/视频的提示词"
    },
    {
    	"voiceover": "文案/旁白",
    	"visual_description": "生成图片/视频的提示词"
    }
  ]
}

添加拆分节点

image-20260318084925045

将上一个AI Agent节点生成的所有分镜旁白和画面描述进行拆分,然后一个镜头一个镜头进行生成。

image-20260318085424886

如图所示,将一个items拆分成了3个items。

添加limit节点

此处可以添加一个limit节点限制生成镜头的数量,例如limit 1,可用于测试环节。

添加IF节点

判断用户是想要生成图片还是想要生成视频。

image-20260318085738852

节点配置:

image-20260318090049355

添加循环节点

在if为false分支后面,添加一个loop循环节点,让循环可以将拆分节点拆分出来的一个又一个的镜头一次进行视频生成。

image-20260318090347319

添加http节点

添加一个请求节点,调用外部大模型进行每次循环对应一个镜头的视频生成。此处使用外部平台对应的视频创作模型。

平台地址:https://replicate.com/。这是一个AI模型的聚合平台,里面包含了比较全面的视频/图片/文字生成模型。之所以选择AI模型的聚合平台是因为其中包含的模型种类比较丰富且模型AI接口调用方式比较简单,且费用和直接在模型官方进行调用的费用几乎没有差异,并且支持国内信用卡直接扣款。

可以基于github或者google账号直接注册。根据默认提示直接进行每一步注册操作即可。

image-20260318092106936

例如视频生成选择keling模型,费用大概是20s的视频1美元:

image-20260318092345018

平台费用充值:https://replicate.com/account/billing

模型API接口查看:

image-20260318095103212

关于详细的请求体可查看:

image-20260318095315356

上一步配置好之后,可以在此处复制现成的请求体内容:

image-20260318095515485

http节点配置:

image-20260318100022949 image-20260318100111520 image-20260318100201221

请求体内容:

{
    "input": {
      "prompt": "{{ $json.visual_description }}",
      "duration": 5,
      "cfg_scale": 0.5,
      "aspect_ratio": "9:16",
      "negative_prompt": ""
    }
  }

添加wait等待节点

等待视频生成然后等待中查看视频生成状态

image-20260318100549306

添加视频生成状态节点

视频生成状态接口介绍:https://replicate.com/kwaivgi/kling-v1.6-standard/api/learn-more#prediction-lifecycle

image-20260318101304495

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

image-20260407093036733

然后下拉页面找到:

image-20260318101158545

添加http节点以及节点配置:

image-20260318102059020

添加IF节点

判断上一步视频生成状态显示视频是否已经创建成功,因为视频状态可以是:“处理processing”状态,“成功succeeded”、“失败failed”或“已取消canceled”状态之一。

image-20260318102818757

当判断成功后进行视频下载,判断失败则返回等待节点继续等待:

image-20260318103033246

Pin视频生成节点

在测试环节使用,防止后续节点运行重复下载视频,消耗token。

添加下载视频节点

当上一步if判断成功,则进行视频下载

image-20260407095457361

节点配置:

image-20260318103639077

保存视频

image-20260407100353740

节点配置:

image-20260407103851980

视频存储路径:

文件夹路径:/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是循环节点名称。

该分支结束

image-20260407100756683

图片生视频

image-20260407140404603

添加循环节点

在判断素材类型的if节点后面添加loop循环节点

image-20260407140329411

添加http节点

用于进行图片生成。此处使用seedream-4模型,模型文档地址:https://replicate.com/bytedance/seedream-4/api

image-20260407140450087

节点配置:

image-20260407141500434

添加http节点

进行图片下载

image-20260407142134991

保存图片

添加ssh的load a file节点:

image-20260407143838808
文件夹路径:/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/创作页,在视频设置环节将视频来源修改为本地文件:

image-20260407152810910

点击【生成视频】查看请求参数:

image-20260407152947356
  • 设置好页面的相关参数后,需要将参数同步到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循环返回的结果,将结果处理成上面【合成素材】章节中点击【生成视频】对应请求参数的格式。

image-20260407181838142

例如,素材类型为图片的时候,该分支的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节点:

image-20260407182115130
// 获取所有输入项
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参数的值了。

image-20260407182348693

添加http节点

接下来进行视频生成请求发送。还是查看http://192.168.227.128:8080/docs中的生成视频的api进行http请求

image-20260407182518973 image-20260407183253524

添加wait节点

image-20260407183343054

添加http节点

查看视频生成状态

image-20260407183605292

添加if节点

如果视频没有生成完成则继续返回wait节点

image-20260407183711881

如果if返回false则连线到wait节点,继续等待:

image-20260407183806712

添加http节点

在if节点后面添加http节点下载视频

保存视频

添加ssh节点保存视频

n8n父子工作流

需求描述

实现在一个工作流中调用另一个工作流。

具体需求:父工作流读取飞书excel表格中的多行,然后在本地依次生成每一个视频主题对应的文件夹。飞书表格地址:https://co3nhi5ooh.feishu.cn/drive/folder/OETXfYE6vlyx6LdMD2ac87RmnMv

image-20260410104401286

表格内容:

image-20260410101842800

父工作流设计

添加【获取工作表】飞书节点

image-20260410102327873

添加【查询工作表】飞书节点

image-20260410102353006

添加【读取单个范围】飞书节点

image-20260410102426180

添加code节点:将读取到的数据进行适当格式转换

image-20260410102525552
// 提取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]
  }
}));

添加循环节点:循环调用子工作流

image-20260410103645210

子工作流负责创建视频主题对应的文件夹

  • 在该节点中添加【调用子工作流】节点:

    image-20260410102752532
    image-20260410103227880
  • 【调用子工作流】节点配置说明

    注意:只有某个工作流中存在【When Executed by Another Workflow】节点,才可以被视为【子工作流】,才可以在下图的workflow下拉列表中找到子工作流。

    image-20260410103411007

子工作流设计

添加子工作流核心触发节点

image-20260410103734876

配置节点:

点击`+ Add field`,依次添加字段名和类型(和父工作流要传的字段对应)。

image-20260410104017211

添加cmd节点创建文件夹

image-20260410104152082

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

posted @ 2026-04-14 18:54  凫弥  阅读(7)  评论(0)    收藏  举报