dify案例分享-儿童故事绘本语音播报视频工作流

发布于:2025-03-21 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.前言

前期给大家介绍过儿童故事绘本dify工作流的制作,当时的工作流实现大模型生成分境图片提示词,利用文生图模型生成了图片。另外我们调用语音播报TTS 实现了一个简单儿童绘本工作流。当时这个工作流图片内容和文字内容是单独分开的。并没有做成一个完整儿童故事绘本的视频。当时就觉的做的不太好。今天把这个这块给补上。对之前文章不熟悉的小伙伴可以看我之前的文章dify案例分享-儿童故事绘本工作流. 下面我们给大家看一下时间的一个效果。

上面是一个合成后的儿童故事绘本视频流,下面的是工作流的具体事实现。

image-20250318223006968

由于生成视频流,目前dify还不支持。所以该功能的大部分功能主要是在后端代码来实现的。

点开视频可以放大看到大概1分钟的视频。

image-20250318223233406

下面我们介绍一下这个工作流是如何制作的。

2.儿童绘本工作流制作

2.1 开始

首选我们先定义一个开始节点,这个开始几点需要设置多个输入字段,一个是提示词,另外一个是绘本的分境数量。考虑输入方便,分境数量我们使用下拉列表形式展示。

prompt :文本提示词 这个很好理解就是输入用户的简单的输入提示词。

image-20250318223518610

language:语言 这里我们做成下拉的选项 目前支持的语音是 简体中文、繁体中文、美式英语、日语、韩语等5个国家的语言。

image-20250318223741105

segments:分镜数量 这里主要考虑提示词生成几个分境镜头。目前提供3 、4 、5个分境。这个数量越多生成的时间越长,生成的视频也就会越长(当然效果会比较好)

image-20250318223947571

voice_name:语音名称 这里主要是使用edgetts 实现各个国家男生和女生各种语气声音。这里我们提供16个语音提供大家选择使用。

image-20250318224236272

voice_rate:语音速率 这个就是生成的声音的语速,目前我们提供 1.0, 0.8 1.2 三中语速。当然你也可以在上面添加。

image-20250318224437209

resolution:图片分辨率 这个是生成的图片的分辨率,我们知道 目前主流图片有 1:1 16:9 9:16 3:2 等尺寸。 图片比例 512512 10241024 等。

image-20250318224702233

text_llm_provider:文本模型提供厂商 这里我们提供 siliconflow 、intern、aliyun。 国外的模型我这里就没添加了,大家可以自己根据需要添加。

image-20250318224850000

text_llm_model:文本模型名称 这个 上面文本生成厂家选好后,这里就要对应厂家提供的文本生成模型。我这里就用硅基的模型

image-20250318225023607

image_llm_provider:文生图模型提供厂商 这个和文本生成模型一样 也需要提供一个文生图模型厂商

image-20250318225136896

image_llm_model:文生图模型 这个和上面逻辑一样提供模型厂商后你的需要提供一个文生图模型,这里我们选了black-forest-labs/FLUX.1-schnell模型

image-20250318225259241

以上步骤我就完成了开始节点设置。

HTTP 请求后端服务接口

接下来我们需要工作流上使用http请求

image-20250318225411595

这个HTTP请求接口请求方式

这个http请求接口 提交方式post 地址我这里用局域网地址 http://192.168.1.3:8085/story/generatestory (待会测试也用本地电脑)

HEADERS 部分我们添加 一个api key

image-20250318225910184

body部分传入的参数是一个json格式数据,数据都是开始节点传入的参数

image-20250318230043304

这里超时设置我们设置300秒,识别重试取消

image-20250318230148425

以上我们就完成了客户端设置。

目前核心的功能主要还是在服务端代码中。

3.服务端代码

服务端代码目前我主要使用python来实现的,对外提供fastapi 服务端接口。代码结构如下:

image-20250318230344761

目前这个程序分为api包、models 、resource、schemas、services、utils 还有一个config.ini配置文件等组成。

该程序参考开源项目https://github.com/alecm20/story-flicks的代码。具体代码逻辑这块我就不做详细展开了。

接下来我们告诉大家如何启动和测试这个项目。

1.依赖包安装

首先需要在本地电脑上安装好python 运行环境,建议python3.10+

安装如下依赖包

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

image-20250318104545091

2.配置文件说明

config.ini

[common]
region = xxxx
secret_id = xxxx
secret_key = xxx
bucket = xxx

[llm]
text_llm_provider = intern
text_llm_model = internlm3-latest
image_llm_provider = siliconflow
image_llm_model = black-forest-labs/FLUX.1-schnell
openai_base_url = https://api.openai.com/v1
aliyun_base_url = https://dashscope.aliyuncs.com/compatible-mode/v1
deepseek_base_url = https://api.deepseek.com/v1
ollama_base_url = http://localhost:11434/v1
siliconflow_base_url = https://api.siliconflow.cn/v1
intern_base_url = https://chat.intern-ai.org.cn/api/v1
openai_api_key = ""
aliyun_api_key = ""
deepseek_api_key = ""
ollama_api_key = ""
siliconflow_api_key = sk-xxxxx
intern_api_key = 

[voice]
voice_name = zh-CN-XiaoxiaoNeural
voice_rate = 1.0

[server]
host = 127.0.0.1
port = 8000

[auth]
valid_tokens = ["zhouhui-1258720xxxx"]

说明 common 配置下面4个值是腾讯COS 相关配置,主要目的生成的视频上传腾讯COS 上方便后面浏览和显示视频。

llm 配置中text_llm_provider 文本类模型提供商,目前提供 上海人工智能实验室书生(intern)、openai、aliyun、deepseek、ollama、硅基流动(siliconflow);text_llm_model 对应使用各个厂商提供的模型名称; image_llm_provider 和 image_llm_model 顾名思义就是硅基提供的文生图的模型;api key 就是配置各个厂商提供api key 就可以了。

auth 是客户端和服务端通过http请求的鉴权账号。可以自定义,服务端配置后,客户端调用的地方需要和这个账号保持一致,否自会报401的错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面客户端API 可以key 需要和服务端 保持一致。

image-20250318115959122

如果是用dify 可以在调用http 请求API key 设置

image-20250318120104390

3.启动服务

 python main.py

完成启动服务

image-20250318105520756

4.客户端测试代码验证

服务端启动后我们使用teststoryvideo.py 可以对服务端请求发起测试 生成短视频

python teststoryvideo.py 

客户端代码如果想运行需要修改一些调用的地方

api_token

text_llm_provider

image_llm_provider

text_llm_model

image_llm_model

image-20250318231433845

image-20250318120354879

下面看一下运行效果服务端会返回 分镜提示词

image-20250318105921590

调用API 生成绘画,接下来会生成语音

image-20250318105958847

最后生成视频并上传腾讯COS 提供 视频链接地址

image-20250318110042223

客户端返回视频生成 URL

image-20250318110113576

视频同时在项目tasks 目录下生成最新的视频文件。

image-20250318110232095

​ 演示效果

080cz-wbxfc

5.给dify调用

后面我们就可以在dify上配置http请求调用该生成视频的http客户端请求调用了。

image-20250318111802065

http请求这块 目前是写死 方便调试 ,大家也可以使用Chrome插件 调试整理json格式

chrome-extension://pkgccpejnmalmdinmhkkfafefagiiiad/json-format/index.html

image-20250318111904213

通过该工具方便编写JSON,以及对JSON格式语法检查。

4.代码执行

这个主要的目的是为了http请求服务端代码返回的生成的视频的URL 对这个URL进行输出转换成markdown格式输出。

执行的代码

import json

def main(arg1: str) -> dict:
    try:
        # 解析外层的 JSON 字符串
        data = json.loads(arg1)
        
        # 检查 success 字段是否为 True
        if not data.get("success", False):
            return {"error": "操作失败,'success' 字段为 False"}
        
        # 提取 data 字段中的 video_url
        video_data = data.get("data")
        if not video_data or "video_url" not in video_data:
            return {"error": "JSON 中缺少 'data.video_url' 字段"}
        
        video_url = video_data["video_url"]
        
        # 定义文件名(可以根据需要调整)
        filename = "生成视频"
        
        # 生成 Markdown 格式的 HTML <video> 标签
        markdown_result = f"<video controls><source src='{video_url}' type='video/mp4'>{filename}</video>"
        
        # 返回结果字典
        return {"result": markdown_result}
    
    except json.JSONDecodeError:
        return {"error": "无效的 JSON 字符串"}
    except Exception as e:
        return {"error": f"发生未知错误: {str(e)}"}

输入参数是上个节点的body部分

image-20250318231706254

返回的结果result 返回类型string

image-20250318231738777

5.直接回复

这个就比较简单了就是对代码执行结果的显示。

image-20250318231827359

以上我们就完成了整个工作流的配置。

3.验证及测试

我们首选需要把服务端代码启动起来,详细步骤可以看服务端代码 启动服务(上面提到),接下来我们点击工作流右上角预览,填写相应的值。

image-20250318232118265

点击右下角运行按钮执行工作流。(这个工作流执行时间会有点长大概2-3分钟大家耐心等待)

3334

这个工作流在执行过程中会消耗一定额资源我之前的服务器资源不够运行不起来。不能提供在线演示环境了,大家可以把源码下载下来自己部署使用。

相关资料和文档可以看我开源的项目 https://github.com/wwwzhouhui/dify-for-dsl

4.总结

今天主要带大家基于大模型实现了一个儿童故事绘本语音播报视频的工作流。详细介绍了整个工作流的实现步骤,工作流包含开始节点设置、HTTP 请求后端服务接口等部分。开始节点需设置多个输入字段,如提示词、绘本分境数量、语言、语音名称等;之后通过 HTTP 请求将开始节点传入的参数以 JSON 格式数据提交到后端服务接口。该工作流由于生成视频流功能目前 Dify 不支持,大部分核心功能在后端代码实现,有一定难度,但实现了将文字内容和图片内容合成完整儿童故事绘本视频的功能,具有较好的可扩展性。感兴趣的小伙伴可以动手尝试,今天的分享就到这里结束了,我们下一篇文章见。