day03-Coze高级案例(飞影数字人)
今日内容
1 目标
# 1 做一个智能体,实现:
1.1 用户传一段视频 + 一段音频---》合成到一起----》对口型视频
1.2 用户传一段视频 + 写一段文字 + 克隆某个人的音色---》生成口播
-以我自己音色为例
-只要有别人的声音--》录成音频--》都可以克隆
1.3 用户传一段视频 + 没有声音,没有文字--》使用大模型生成一段搞笑的文字---》生成口播
# 2 做成的视频:可以发抖音--》小红书引流
# 3 解决了:不需要每次都让我录视频,只需要提前录好一个底视频,填入文字--》自动生成视频
2 注册飞影数字人-克隆音色
# 1 地址
https://hifly.cc/
# 2 注册后,选择声音克隆
https://hifly.cc/clone
# 3 上传一段自己的音色
-使用ev录屏
-使用其他的都可以
-录一段:你的或别人的声音
# 4 制作完成后,复制声音ID
河南话版:43bbccf8-0df0-4a98-b50d-acb68e94753e
普通话版:bf45fcee-37f3-4226-8e28-429004d0e551
# 我们coze智能体,使用的是测试版,不扣点数---》会有水印
-购买会员,可以去水印
# 5 不会录音:
-下载ev录屏
-双击;EVCapture_v5.3.9.exe 装到电脑上
-把录好的音频,放到电脑某个位置备用


3 整体流程【工作流】
3.1 开始
# 1 接受变量
1 用户的视频---》必传--》它是底片 ---》video_url
2 用户的音频--》选传 ---》voice_url
-如果音频传了--》跟视频合并到一起
-如果没传---》使用文字,生成
3 用户的口播文字 ---》voice_url
-如果用户传了文字,就用用户传的
-如果用户没传文字,使用大模型,生成一段搞笑的话
# 流程
开始:----如果用户没传音频---》判断是否传了文字----》传了文字---》合成视频
没传文字--》大模型生成文字---》合成视频
----如果用户传了音频---》直接合成

3.2 选择器
判断用户是否传了音频

3.3 选择器
判断用户文字是否传了
-如果用户没传文字,需要接个大模型,生成

3.4 大模型

3.4.1 提示词
# 角色
你是一位极具幽默感的口播创作者,擅长创作出令人捧腹大笑且时长在 1 分钟内的口播文字内容。
## 技能
### 技能 1: 生成搞笑口播
无需用户输入,直接随机创作一段搞笑且时长在 1 分钟内的口播文字内容。内容可以涵盖生活趣事、幽默段子、诙谐故事等各种搞笑元素,要确保语言生动活泼、风格独特,能让听众在短时间内开怀大笑。
## 限制:
- 输出内容必须是搞笑风格的口播文字,且时长要在 1 分钟内。
- 语言表达要清晰易懂、生动有趣,避免使用过于晦涩或专业的词汇。
3.4 代码
# 1 在工作流中写python代码,完成我们的需求
# 2 关于代码,我会给大家解释每行意思---》如果还是不懂,等学会python以后,再看也不迟
-目前先把老师的copy过去
# 3 工作流中,可以使用的语言
-js
-python:我个人喜欢py

4.3.1 python代码模版
async def main(args: Args) -> Output:
params = args.params
ret: Output = {
"key2": ""
}
return ret
4.3.2 复杂代码
async def main(args: Args) -> Output:
# 1 拿到一个变量--》放了很多东西---》传入的变量,都从params这里面取出来
# params 是个麻袋---》麻袋中有--》llm_text 和 text
params = args.params
# 2 从麻袋中拿出两个变量
llm_text=params['llm_text']
text=params['text']
# 3 如果text为空,就以llm_text 为准返回,如果不为空,就返回text
res=''
if text: # 如果text有值,用户传了,把这个值给res
res=text
else: # 如果text没有值,用户没传,把llm生成的文字,给res
res=llm_text
ret: Output = { # 这个大括号中,是我们输出的内容--》一个新麻袋--》我们要把输出的内容,放到麻袋中
"out": res
}
return ret
4.3.3 简单代码-用这个
async def main(args: Args) -> Output:
# 1 拿到一个变量--》放了很多东西---》传入的变量,都从params这里面取出来
# params 是个麻袋---》麻袋中有--》llm_text 和 text
params = args.params
# 2 从麻袋中拿出两个变量
llm_text=params['llm_text']
text=params['text']
ret: Output = { # 这个大括号中,是我们输出的内容--》一个新麻袋--》我们要把输出的内容,放到麻袋中
"out": text or llm_text
}
return ret


3.5 视频创作之文字
借助于插件:
飞影数字人提供的coze插件我们使用视频生成的插件:
如果免费用,速度慢点,会带水印
如果买会员了:没有水印



3.6 视频创作之音频
只要传音频和视频

3.7 循环等待视频制作完成
我们传了该传的东西给了飞影数字人插件---》这个插件制作视频需要时间
等待数字人视频制作完成:数字人提供了一个查询数字人是否制作完成的插件
-先睡15s钟---》查询视频是否制作完成---》如果制作完成---》输出
-先睡15s钟---》查询视频是否制作完成---》没有制作完成--》再重新循环

3.7.1 代码--睡一会
import time
async def main(args: Args) -> Output:
params = args.params
time.sleep(15) # 在这睡15s
ret: Output = {
}
return ret

3.8.1 插件-查询数字人生成状态


3.8.2 判断视频是否生成了
如果生成了,结束循环
如果没生成,继续下一次循环

3.8 代码取出视频地址
代码作用是从一堆可能没有视频地址的包裹中,找到有视频地址的--》返回出来
def filter_first_non_empty(data):
# 确保输入是列表
if not isinstance(data, list):
raise ValueError("Input data.output must be a list.")
# 找到第一个非空的元素
for item in data:
# 确保元素是字符串类型并去除空白后检查
if isinstance(item, str) and item.strip() != "":
return item
# 如果没有找到非空元素,返回空字符串
return ""
async def main(args: Args) -> Output:
params = args.params
# 构建输出对象
ret: Output = {
"output": filter_first_non_empty(params["input"])
}
return ret

3.9 处理视频job_id--代码

async def main(args: Args) -> Output:
params = args.params
job_id01=params['job_id01']
job_id02=params['job_id02']
ret: Output = {
"key0": job_id01 or job_id02
}
return ret
3.10 结束

4 智能体中集成


浙公网安备 33010602011771号