一、工作流概述:Dify在视频生成中的核心价值
在AIGC技术快速迭代的背景下,视频内容的自动化生产已成为企业降本增效与个人创意落地的关键需求。Dify作为开源的LLM应用开发平台,通过可视化工作流编排能力,可无缝串联文本处理、第三方API调用、存储服务等组件,构建从“文本提示词”到“完整视频”的端到端生成链路。与传统视频制作流程相比,基于Dify的工作流可将创意落地周期从数天缩短至分钟级,并支持多模态输入(文本/图像)、多平台适配(社交媒体/教育/营销)等场景需求。
根据CSDN博客(2025-05-27)案例,一个典型的Dify视频生成工作流包含四大核心环节:
- 提示词工程:通过LLM扩展用户输入的简短文本,生成符合视频模型要求的结构化描述;
- 视频生成调用:对接第三方文生视频API(如即梦AI、豆包Seedance等)生成原始视频;
- 存储与分发:将视频文件上传至对象存储服务(阿里云OSS/华为云OBS)并获取可访问URL;
- 结果反馈:向用户返回视频链接或进一步触发后续流程(如自动发布至社交媒体)。
二、环境准备:从依赖安装到配置文件设置
2.1 核心依赖与安装
视频生成工作流需依赖Python环境(3.8+)及以下工具包,通过requirements.txt
统一管理:
uvicorn==0.34.0 # FastAPI服务运行依赖
fastapi==0.115.6 # 构建视频生成API服务
oss2==2.18.0 # 阿里云OSS存储SDK
pydantic==2.8.2 # 数据验证与模型定义
requests==2.31.0 # HTTP请求库(调用视频生成API)
openai==1.12.0 # 可选,用于LLM提示词扩写
安装命令:pip install -r requirements.txt
2.2 配置文件关键参数
创建config.ini
文件存储敏感信息与服务配置,典型结构如下(以阿里云OSS为例):
[DEFAULT]
image_generation_url=https://jimeng.duckcloud.fun/v1/images/generations # 即梦AI图像生成接口
audio_generation_url=http://111.119.215.74:8084/generate-audio/ # 音频生成接口(可选)
[common]
video_output_path = /path/to/video/output # 本地视频临时存储路径
region = oss-cn-hangzhou # OSS地域
secret_id = your_secret_id # OSS访问密钥ID
secret_key = your_secret_key # OSS访问密钥
bucket = your_bucket_name # OSS桶名称
endpoint = https://oss-cn-beijing.aliyuncs.com # OSS访问端点
[auth]
valid_tokens = ["your_valid_token1", "your_valid_token2"] # API调用鉴权Token
[video_api]
cookie = your_cookie_string # 第三方视频API的Cookie(如即梦AI)
sign = your_sign_string # 第三方视频API的签名参数
注:
cookie
与sign
需通过第三方平台逆向获取,具体方法可参考即梦AI API调用指南。
三、核心实现:FastAPI服务与Dify工作流编排
3.1 FastAPI中间层服务
为实现Dify与第三方视频API的对接,需构建FastAPI服务处理视频生成请求、结果存储与鉴权。核心代码示例(jimeng_video_service.py
):
from fastapi import FastAPI, HTTPException, Depends, Header
from pydantic import BaseModel
import logging
import time
import requests
import uuid
import configparser
import json
import os
import datetime
import random
import oss2
# 日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()
# 读取配置文件
config = configparser.RawConfigParser()
config.read('config.ini', encoding='utf-8')
# 视频输出目录检查与创建
video_output_path = config.get('common', 'video_output_path')
if not os.path.exists(video_output_path):
os.makedirs(video_output_path)
logger.info(f"创建视频输出目录: {video_output_path}")
# OSS初始化
auth = oss2.Auth(config.get('common', 'secret_id'), config.get('common', 'secret_key'))
bucket = oss2.Bucket(auth, config.get('common', 'endpoint'), config.get('common', 'bucket'))
# 数据模型定义
class VideoRequest(BaseModel):
prompt: str # 视频生成提示词
aspect_ratio: str = "16:9" # 视频宽高比
duration_ms: int = 5000 # 视频时长(毫秒)
fps: int = 24 # 帧率
# 鉴权依赖
def verify_auth_token(authorization: str = Header(None)):
if not authorization:
raise HTTPException(status_code=401, detail="Missing Authorization Header")
scheme, _, token = authorization.partition(" ")
if scheme.lower() != "bearer":
raise HTTPException(status_code=401, detail="Invalid Authorization Scheme")
valid_tokens = json.loads(config.get('auth', 'valid_tokens'))
if token not in valid_tokens:
raise HTTPException(status_code=403, detail="Invalid or Expired Token")
return token
# 视频生成接口
@app.post("/generate-video")
async def generate_video(request: VideoRequest, token: str = Depends(verify_auth_token)):
# 生成唯一文件名
filename = f"video_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}_{random.randint(1000, 9999)}.mp4"
local_path = os.path.join(video_output_path, filename)
# 调用第三方视频生成API(以即梦AI为例)
video_api_url = "https://api.jimengai.com/v1/video/generate" # 即梦AI视频生成接口
headers = {
"Cookie": config.get('video_api', 'cookie'),
"Sign": config.get('video_api', 'sign'),
"Content-Type": "application/json"
}
payload = {
"prompt": request.prompt,
"aspect_ratio": request.aspect_ratio,
"duration_ms": request.duration_ms,
"fps": request.fps
}
try:
response = requests.post(video_api_url, json=payload, headers=headers, timeout=300)
response.raise_for_status()
video_data = response.content
# 保存视频到本地
with open(local_path, "wb") as f:
f.write(video_data)
# 上传至OSS
bucket.put_object_from_file(filename, local_path)
video_url = f"https://{config.get('common', 'bucket')}.{config.get('common', 'endpoint')}/{filename}"
# 删除本地临时文件
os.remove(local_path)
return {"video_url": video_url, "filename": filename}
except Exception as e:
logger.error(f"视频生成失败: {str(e)}")
raise HTTPException(status_code=500, detail=f"Video generation failed: {str(e)}")
3.2 Dify工作流可视化编排
在Dify平台中,通过拖拽节点即可完成视频生成流程的设计,核心节点包括开始节点、LLM提示词扩写、HTTP请求、代码处理与输出节点。
3.2.1 开始节点:定义用户输入
配置用户输入字段,包括:
prompt
(必填,文本):用户原始视频创意描述;aspect_ratio
(可选,下拉框):视频宽高比(如16:9/9:16/1:1);duration_ms
(可选,数字):视频时长(默认5000毫秒)。
3.2.2 LLM提示词扩写节点
使用大语言模型(如书生浦语internlm3-8b-instruct)将用户简短输入扩展为结构化视频描述。系统提示词配置示例:
你是文生视频提示词专家,需将用户输入的简短提示词{{#prompt#}}扩展为符合即梦AI要求的详细描述。需包含:
- 主体细节(外观、动作、表情)
- 场景环境(地点、光线、天气)
- 风格定义(写实/动画/复古等)
- 镜头运动(推/拉/摇/移等)
示例:
用户输入:"小男孩踢足球"
输出:"画面中心是身着蓝色足球服的小男孩,脚蹬黑色球鞋,正奋力踢向黑白相间的足球。翠绿草坪边缘有白色边线,围栏外是蓝色观众座椅。天空湛蓝飘着白云,男孩表情专注兴奋,镜头跟随足球运动轨迹推进。"
3.2.3 HTTP请求节点:调用视频生成API
配置Dify的HTTP请求节点,调用上述FastAPI服务:
- 请求URL:
http://your-fastapi-server:8000/generate-video
- 请求方法:POST
- 请求头:
Authorization: Bearer {valid_token}
(从config.ini
的auth
部分获取) - 请求体:
{ "prompt": "{{LLM扩写后的提示词}}", "aspect_ratio": "{{aspect_ratio}}", "duration_ms": {{duration_ms}} }
3.2.4 代码节点:处理返回结果
通过Python代码节点解析API返回的视频URL,并格式化输出内容:
def main(response: dict) -> dict:
return {
"video_title": f"视频生成结果:{response['filename']}",
"video_url": response["video_url"],
"tips": "点击链接即可下载或在线查看视频"
}
3.2.5 输出节点:返回结果给用户
将代码节点处理后的video_title
与video_url
以自然语言格式返回,例如:
🎉 视频生成成功!
标题:{{video_title}}
访问链接:{{video_url}}
有效期:24小时,请及时保存。
四、企业级案例:华为云Dify-LLM高可用工作流
对于企业级需求,华为云提供了基于FlexusX实例与CCE Turbo容器集群的Dify高可用部署方案,支持大规模视频生成任务。根据华为云技术博客(2025-06-28),该方案具备以下特点:
4.1 架构与资源配置
资源类型 | 规格与用途 |
---|---|
弹性公网IP(EIP) | 3个,用于公网访问与负载均衡 |
弹性负载均衡(ELB) | 分发流量至后端Dify服务,实现高可用 |
FlexusX实例 | 4台,3台部署Dify核心插件,1台部署Embedding模型 |
云容器引擎(CCE Turbo) | 纳管FlexusX实例,提供容器化部署能力 |
对象存储(OBS) | 存储视频文件与知识库数据 |
Redis数据库 | 缓存工作流状态与会话数据 |
PostgreSQL数据库 | 存储用户配置与任务日志 |
4.2 核心能力扩展
- 多模型集成:对接华为云DeepSeek-V3推理服务与豆包视频模型(Doubao-Seedance-1.0-lite-t2v),支持文本生成视频(T2V)、图像生成视频(I2V)双模式;
- 成本优化:通过FlexusX实例的动态资源调度,将视频生成任务的GPU利用率从60%提升至90%,单视频生成成本降低35%;
- 合规性检查:集成华为云内容审核API,自动过滤涉敏内容,违规率从8%降至0.5%以下。
五、高级配置与优化建议
5.1 性能优化
- 异步任务处理:通过FastAPI的
BackgroundTasks
或Celery将视频生成任务异步化,避免长时阻塞; - 缓存策略:对相同提示词的视频生成请求,缓存结果URL(有效期可设为24小时);
- 并发控制:限制单用户每秒请求次数(如5次/秒),防止API过载。
5.2 成本控制
- 存储分层:将生成的视频文件30天后自动从OBS标准存储迁移至归档存储,存储成本降低70%;
- 模型选择:根据需求选择视频模型,例如短时长(<10秒)视频使用即梦AI免费接口,长视频(>30秒)使用豆包付费API。
5.3 安全加固
- Token管理:定期轮换
config.ini
中的valid_tokens
与API密钥,避免泄露风险; - 输入过滤:在LLM节点前添加敏感词过滤规则,防止生成违规内容。
参考资料:
- 使用Dify构建文生视频工作流(CSDN博客,2025-05-27)
- 基于Dify-LLM的企业级高可用工作流(CSDN博客,2025-06-28)
- 5步解锁免费即梦文生视频工作流(CSDN博客,2025-06-15)