扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

博思AIPPT

大家好,我是焦哥。零代码基础手搓工作流,专注于AI智能体工作流的搭建知识分享。

今天给大家分享的是,如何通过coze工作流+剪映小助手插件,成一个音乐播放器。先看下效果

工作流原理

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

我们可以通过这个截图拆解所有视频元素:

  1. 1.歌名、歌手、歌词都是通过批量添加字幕节点,其中歌名与歌手的时间线对应整个视频时间,歌词分别对应自己的时间线;
  2. 2.贴纸1、贴纸2、贴纸3,都是通过批量添加贴纸节点,时间线对应整个视频时间;
  3. 3.封面图及背景图,通过批量添加图片节点,时间线对应整个视频时间。

工作流总览

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

工作流节点开始节点input:输入一首歌名+歌手,例如:过火 张信哲;background_img:音乐播放器的背景图片,非必填项,焦哥在后面的节点中内置了8张图片,开始节点不传背景图,就会随机使用一张图作为背景图。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

HTTP 请求节点这个工作流的核心之一就是先获得歌词与音乐,我用的是这个网址:https://mp3.ltyuanfang.cn/

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

因为我们是想获取查询后的网页内容,这里需要添加 【请求头】【请求体】有一个技巧,通过导入cURL自动添加打开https://mp3.ltyuanfang.cn/首页,按F12,点击网络→Fetch/XHR左边随便输入一首歌搜索一下,右边就会出现mp3.ltyuanfang.cn鼠标放在上面右键,复制为cURL(bash),导入到HTTP请求节点中。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

插件节点(Data_Sprite)接收上一个节点输出的 JSON 数据,通过索引值还可以灵活地提取数据数组中指定位置的元素。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

大模型节点(提取歌词)去除无歌词部分,只保留有歌词的部分。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

代码节点(提取新闻内容)通过python代码处理,获取歌词的文本内容及对应的时间线。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

pyrhon代码

# 导入操作系统路径处理模块,用于规范化文件路径
importos
# 导入正则表达式模块,用于匹配时间戳
importre

# 下面的类型是兼容处理:如果运行环境未预先定义 Args 和 Output,则此处定义
try: # 尝试使用外部环境可能已提供的类型
Args # 引用以触发 NameError(若未定义)
Output
exceptNameError: # 如果未定义,则本地定义占位类型,保证本脚本可运行
fromtypingimportTypedDict,Dict,Any

# 定义 Args 类型,占位用;其中包含一个 params 字段(字典)
classArgs(TypedDict):
params:Dict[str,Any]

# 定义 Output 类型,占位用;本质为一个字典
Output =Dict[str,Any]

# 将形如 "[mm:ss.mmm]" 的时间戳拆解为微秒整数的辅助函数
def_timestamp_to_microseconds(m_str:str, s_str:str, ms_str:str|None) ->int:
# 将分钟字符串转换为整数
minutes =int(m_str)
# 将秒字符串转换为整数
seconds =int(s_str)
# 毫秒字符串可能不存在,这里做兼容处理;不存在则为 0
millis =int(ms_str)ifms_strisnotNoneelse0
# 计算总微秒:分钟转微秒 + 秒转微秒 + 毫秒转微秒(毫秒 * 1000)
total_us = minutes *60*1_000_000+ seconds *1_000_000+ millis *1_000
# 返回总微秒数
returntotal_us

# 解析一行文本,提取开始/结束时间戳以及歌词正文的辅助函数
def_parse_line(line:str) ->tuple[int|None,int|None,str]:
# 定义匹配时间戳的正则:支持 [m:ss] 或 [mm:ss.mmm] 等形式
pattern = re.compile(r"\[(\d+):(\d+)(?:\.(\d{1,3}))?\]")
# 在该行中查找所有时间戳匹配结果
matches =list(pattern.finditer(line))
# 如果没有匹配到时间戳,则返回 (None, None, 去掉时间戳后的歌词),但这里歌词通常为空
ifnotmatches:
# 去掉类似 [xx:yy] 的片段后,获取剩余文本并去除首尾空白
lyric_text = re.sub(r"\[[^\]]*\]","", line).strip()
# 返回无时间戳的结果(均为 None)和歌词文本
returnNone,None, lyric_text
# 将匹配到的第一个时间戳作为开始时间
start_match = matches[0]
# 提取开始时间各部分(分钟、秒、毫秒)
m1, s1, ms1 = start_match.group(1), start_match.group(2), start_match.group(3)
# 转换开始时间为微秒整数
start_us = _timestamp_to_microseconds(m1, s1, ms1)
# 如果存在第二个时间戳,则作为结束时间;否则结束时间为 None(待后续补齐)
end_us =None
iflen(matches) >=2:
# 取第二个匹配结果作为结束时间
end_match = matches[1]
# 提取结束时间各部分(分钟、秒、毫秒)
m2, s2, ms2 = end_match.group(1), end_match.group(2), end_match.group(3)
# 转换结束时间为微秒整数
end_us = _timestamp_to_microseconds(m2, s2, ms2)
# 去掉所有时间戳标记后,得到纯歌词文本,并去除首尾空白
lyric_text = re.sub(r"\[[^\]]*\]","", line).strip()
# 返回 (开始时间微秒, 结束时间微秒或 None, 歌词文本)
returnstart_us, end_us, lyric_text

# 主函数,按要求的入参/出参格式实现
asyncdefmain(args: Args) -> Output:
# 从入参中获取原始输入字符串(可以是文件路径,也可以是整段歌词文本)
input_raw = args["params"]["input"] # 原始输入值
# 兼容去除 Windows 路径前导斜杠的情况(例如 "/d:/..." -> "d:/...")
ifre.match(r"^/[A-Za-z]:", input_raw): # 检测是否以 "/盘符:" 开头
input_raw = input_raw[1:] # 如果是,则移除最前面的斜杠
# 规范化可能的路径(统一斜杠方向、消除冗余),仅用于存在路径时
possible_path = os.path.normpath(input_raw) # 预处理可能是路径的字符串

# 判断输入是文件路径还是直接的歌词文本
ifos.path.exists(possible_path)andos.path.isfile(possible_path): # 如果存在且是文件
# 读取文件的每一行内容,使用 UTF-8 编码
withopen(possible_path,"r", encoding="utf-8")asf: # 打开文件
lines = f.readlines() # 逐行读取形成列表
else:
# 如果不是有效文件路径,则视为整段歌词文本,按行拆分
lines = input_raw.splitlines() # 使用换行符将文本拆分为行列表

# 用于保存解析出的记录:每条包含 text, start, end 三部分
records:list[dict] = []

# 遍历每一行,解析时间戳与歌词文本
forlineinlines:
# 调用辅助函数解析该行,获得开始时间、结束时间、歌词文本
start_us, end_us, lyric_text = _parse_line(line)
# 若缺少开始时间戳,则跳过(保证 timelines 每项都有 start),空行也跳过
ifstart_usisNoneornotlyric_text:
continue# 保证输出的 texts 与 timelines 一一对应且有效
# 构造当前行的记录字典
record = {
"text": lyric_text, # 当前行的歌词文本
"start": start_us, # 当前行的开始时间(微秒)
"end": end_us # 当前行的结束时间(微秒,可能为 None,待补齐)
}
# 将记录追加到列表中
records.append(record)

# 第二遍处理:为缺失结束时间的记录补齐结束时间
foridxinrange(len(records)):
# 获取当前记录
rec = records[idx]
# 如果结束时间为空,需要进行补齐
ifrec["end"]isNone:
# 如果不是最后一条记录,则用下一条的开始时间作为本条的结束时间
ifidx <len(records) -1andrecords[idx +1]["start"]isnotNone:
# 设置结束时间为下一条的开始时间
rec["end"] = records[idx +1]["start"]
else:
# 否则为最后一句或下一条没有有效开始时间,按要求:end = start + 3,000,000 微秒
# 若开始时间缺失,则默认从 0 开始,以保证数值存在(极端容错)
base_start = rec["start"]ifrec["start"]isnotNoneelse0
# 设置结束时间为开始时间 + 3,000,000 微秒(3 秒)
rec["end"] = base_start +3_000_000

# 构造输出的 texts:仅包含歌词文本,顺序与输入一致
texts = [rec["text"]forrecinrecords]
# 构造输出的 timelines:数组,每项为对象,start/end 为字符串(单位微秒)
timelines = [{"start":str(rec["start"]),"end":str(rec["end"])}forrecinrecords]

# 构建最终返回对象,包含所需的两个字段
ret: Output = {
"texts": texts, # 歌词文本数组
"timelines": timelines # 每句歌词的开始与结束时间(单位:微秒)
}
# 返回结果对象
returnret

插件节点获取歌曲的时间线列表,根据这个时间线,分别生成(歌词、歌名、歌手)字幕数据;封面图数据;歌曲音频数据。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

插件节点添加一个选择器节点,判断用户是否上传背景图片,若没有上传,随机使用一张,生成背景图片数据。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

插件节点添加一个白底图片,这是与封面图搭配用的(也可以不用添加这个白底),添加并生成一个特效(泡泡变焦)的数据。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

插件节点创建剪映草稿节点,把上面生成的数据逐个的添加到视频中。这次我们用 米核AI 开发的剪映小助手插件,与之前文章的 速推AIGC 的剪映小助手插件类似,都是通过草稿的ID,渲染成剪映草稿视频,都是免费的!

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

插件节点添加贴纸,需要提前从数据生成器search_sticker里面获取贴纸ID,这里的三张贴纸ID,焦哥已经整理好了,直接拿去。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

结束节点米核剪映小助手下载地址:https://miheai.com/#/jianying

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。

运行正常后,我们就可以点击发布了,绑定到智能体。


都已经看到这里了,如果觉得对你有帮助,记得点赞、在看、收藏、转发哦!获取工作流中的提示词、代码,麻烦您一键三连,评论区留言“音乐播放器”,加焦哥VX,邀请您加入交流群,免费领取飞书AI智能体知识库资料。完整的工作流,我已经上传到Coze团队空间了,后期会逐步更新新的智能体,如果你也想完整的复刻这样的工作流,欢迎加入我的团队空间,添加焦哥VX获取加入方法。

扣子(Coze)工作流实战:把歌名丢给coze,5分钟后它直接“吐”出一个音乐播放器。
© 版权声明

相关文章