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 装到电脑上
    -把录好的音频,放到电脑某个位置备用
    

image-20250814201402341

image-20250814202107237

3 整体流程【工作流】

3.1 开始

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

image-20250814202826394

3.2 选择器

判断用户是否传了音频

image-20250814203031315

3.3 选择器

判断用户文字是否传了

​ -如果用户没传文字,需要接个大模型,生成

image-20250814203441954

3.4 大模型

image-20250814203725757

3.4.1 提示词

# 角色
你是一位极具幽默感的口播创作者,擅长创作出令人捧腹大笑且时长在 1 分钟内的口播文字内容。

## 技能
### 技能 1: 生成搞笑口播
无需用户输入,直接随机创作一段搞笑且时长在 1 分钟内的口播文字内容。内容可以涵盖生活趣事、幽默段子、诙谐故事等各种搞笑元素,要确保语言生动活泼、风格独特,能让听众在短时间内开怀大笑。

## 限制:
- 输出内容必须是搞笑风格的口播文字,且时长要在 1 分钟内。
- 语言表达要清晰易懂、生动有趣,避免使用过于晦涩或专业的词汇。 

3.4 代码

# 1 在工作流中写python代码,完成我们的需求

# 2 关于代码,我会给大家解释每行意思---》如果还是不懂,等学会python以后,再看也不迟
	-目前先把老师的copy过去
# 3 工作流中,可以使用的语言
	-js
    -python:我个人喜欢py
    

image-20250814204258889

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

image-20250814205707587

image-20250814205812101

3.5 视频创作之文字

借助于插件:

  飞影数字人提供的coze插件

我们使用视频生成的插件:

​ 如果免费用,速度慢点,会带水印

​ 如果买会员了:没有水印

image-20250814210152478

image-20250814210440913

image-20250814210806418

3.6 视频创作之音频

只要传音频和视频

image-20250814211245665

3.7 循环等待视频制作完成

我们传了该传的东西给了飞影数字人插件---》这个插件制作视频需要时间

​ 等待数字人视频制作完成:数字人提供了一个查询数字人是否制作完成的插件

​ -先睡15s钟---》查询视频是否制作完成---》如果制作完成---》输出

​ -先睡15s钟---》查询视频是否制作完成---》没有制作完成--》再重新循环

image-20250814214020589

3.7.1 代码--睡一会

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

image-20250814214556146

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

image-20250814214510515

image-20250814214922229

3.8.2 判断视频是否生成了

如果生成了,结束循环

如果没生成,继续下一次循环

image-20250814215109880

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

image-20250814220448933

3.9 处理视频job_id--代码

image-20250814221149602

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 结束

image-20250814222941439

4 智能体中集成

image-20250814222846612

posted @ 2025-08-17 11:21  凫弥  阅读(308)  评论(0)    收藏  举报