Coze一键制作爆款短视频“假如书籍会说话”(扣子工作流拆解)

带大家今天拆解下最近非常火爆的解读书籍爆款短视频,单个视频最高20多万的点赞,该博主通过两个角色对话的方式解读一本书的短视频形式,仅仅只用了18个作品获得了19.5万粉丝,45.9万点赞。

img

我带大家来拆解下具体的实现原理。

img

拆解

开始节点有三个输入参数【书名、作者、文字水印】给到豆包1.5-Pro-深度思考模型输出对话内容。

img

生成对话文案提示词:


# 角色
你是一个擅长生成书籍对话口播字幕文案的助手,能够根据给定的书籍名称和作者,创作视频对话口播字幕文案。对话角色设定为主持人和拟人化的书籍,采用跨时代的形式展开对话。
## 技能
### 技能1: 生成对话文案
1. 当用户提供《具体书籍名称》及作者等信息后,深度解读书籍内容。
2. 将书籍拟人化,如“富爸爸老师,请问......”,“富爸爸老师,为什么......”,其中后续问题要紧密结合讲解书籍里的核心痛点,吸引观众兴趣。
3. 生成至少1000字以上对话文案,提出至少10个以上问题,每个问题都要围绕这本书的痛点以及读者可能想了解或感兴趣的点展开。解答问题时,需结合现实生活中的实际情况或案例以及书籍知识点进行说明。
4. 文案中不能仅有提问和回答情节,要加入对话情节。当说到重点或真相时,提问的人要说出惊讶的话,使整个视频看起来更像真实的对话或采访。
5. 文案内容需包含每个问题对应的对话、解释、现如今是什么情况、之后该怎么做等部分。对于较长的台词,要用标点符号合理拆分为短句, 且每个短句不能超过10个字。
6. 回复内容说明:role_name=角色名称,固定2个,主持人和书籍名称, order=台词出场顺序,也是台词 唯一编号,line=角色台词,口播字幕文案
7.如果用户输入了{{text}},请直接对文案进行台词编号
  - **回复示例**:
```json
{
    "role_list": [
        {
            "role_name": "[主持人]"
        },
        {
            "role_name": "[书籍]"
        }
    ],
    "text_list":[
                {
                   "order": 1,
                    "line": "[台词]",
                   "role_name":"主持人"
                },
                {
                   "order": 2,
                    "line": "[台词]",
                   "role_name":"书籍"
                },
                {
                   "order": 3,
                    "line": "[台词]",
                   "role_name":"主持人"
                },
                {
                   "order": 4,
                    "line": "[台词]",
                   "role_name":"书籍2"
                },
                {
                   "order": 5,
                    "line": "[台词]",
                   "role_name":"主持人"
                },
                {
                   "order": 6,
                    "line": "[台词]",
                   "role_name":"书籍"
                }
    ]
}

## 限制
- 只围绕用户提供的书籍相关内容生成对话文案,拒绝回答与书籍无关的话题。
- 文案需满足用户提出的格式和要求,不能偏离框架设定,尤其要注意将过长台词用标点符号拆分为短句。
- 采用长短句形式进行提问和回答, 用逗号将长句进行分隔。

生成的内容:


{
  "role_list": [
    {
      "role_name": "主持人"
    },
    {
      "role_name": "《富爸爸与穷爸爸》"
    }
  ],
  "text_list": [
    {
      "role_name": "主持人",
      "line": "富爸爸老师,您好!今天想请教,为什么您总强调‘穷爸爸’和‘富爸爸’的思维差异是关键?",
      "order": 1
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "因为思维决定行为,行为决定结果。穷爸爸说‘我买不起’,富爸爸问‘怎么买得起’。一个是终点思维,一个是探索思维。",
      "order": 2
    },
    {
      "role_name": "主持人",
      "line": "这确实很不同!那现实中,这种思维差异具体体现在哪里?",
      "order": 3
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "比如买房。很多人觉得‘有房就是资产’,却忽略贷款压力。若房子消耗现金流,它其实是负债。富爸爸会算租金能否覆盖月供,能覆盖的才是资产。",
      "order": 4
    },
    {
      "role_name": "主持人",
      "line": "啊!原来我一直搞错了资产定义?",
      "order": 5
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "对!书中核心就是:资产是能把钱放进你口袋的东西,负债是把钱从你口袋拿走的。车、自住房若需持续支出,都是负债。",
      "order": 6
    },
    {
      "role_name": "主持人",
      "line": "那普通人总说‘努力工作就能变富’,这想法错在哪?",
      "order": 7
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "错在为钱工作,而非让钱为你工作。穷爸爸拼命升职加薪,却被税收、通胀稀释财富。富爸爸用工资买资产,让资产生钱。",
      "order": 8
    },
    {
      "role_name": "主持人",
      "line": "那年轻人刚工作,该怎么开始积累资产?",
      "order": 9
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "先学财商知识,再从小资产起步。比如买指数基金、出租小公寓,甚至用副业收入投资。关键是让第一笔钱‘活’起来。",
      "order": 10
    },
    {
      "role_name": "主持人",
      "line": "现在很多人月光,甚至负债消费,这该怎么破?",
      "order": 11
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "停止‘收入增加—消费升级’的陷阱。先支付自己,把10%收入存起来买资产,再用剩下的钱支付账单。习惯了就不会觉得难。",
      "order": 12
    },
    {
      "role_name": "主持人",
      "line": "学校为什么不教这些财商知识?我们只能自己学吗?",
      "order": 13
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "传统教育培养‘雇员’,不是‘投资者’。但时代变了,打工人也可能被裁员。所以必须主动学,否则永远在‘老鼠赛跑’里转圈。",
      "order": 14
    },
    {
      "role_name": "主持人",
      "line": "那‘财富自由’到底是什么状态?普通人能实现吗?",
      "order": 15
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "当被动收入超过总支出,你就自由了。比如租金、股息、版权收入。普通人只要坚持买资产,5-10年就能看到变化。",
      "order": 16
    },
    {
      "role_name": "主持人",
      "line": "有人说‘负债是毒药’,但您书里提到‘聪明负债’,这怎么理解?",
      "order": 17
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "关键看负债用途。用信用卡消费是坏负债,用低息贷款买能生钱的资产是好负债。比如贷款买商铺收租,租金覆盖利息还有剩。",
      "order": 18
    },
    {
      "role_name": "主持人",
      "line": "最后想问问,现在年轻人最该避开的理财误区是什么?",
      "order": 19
    },
    {
      "role_name": "《富爸爸与穷爸爸》",
      "line": "别等‘有钱了再理财’。现在就开始,哪怕每月存300元买基金。拖延才是最大的敌人,时间复利比本金更重要。",
      "order": 20
    }
  ]
}

当拿到对话内容之后下一步就是同时去做 5 件事情:

第一件事情:提取开场文案并生成音频,然后获取每个音频的时间,最后合并成进行数据组装,最后得到两个数组,一个是音频数组一个是对应时间的数组。

img

在这里用到了两个核心插件:(后续会反复使用)

一个是扣子官方的语音合成:输入文字生成音频文件

img

https://www.coze.cn/store/plugin/7426654728890777650

另一个是速推AIGC的视频合成_剪映小助手

img

https://www.coze.cn/store/plugin/7457837529027493922

第二件事情:使用画板组件生成一个视频背景图,图片右下角写入了开始节点的文字水印参数。

第三件事情:从对话内容中提取对话中的核心关键词,后续要做核心文字的字幕特殊处理。

img

第四件事情:启动了三个循环节点生成对话音频内容与获取每段音频的时间,在循环体中判断不同的角色生成不同的音频信息。

img

接下来拿到所有的数据进行整合与配置

img

整合数据相关代码:

async function main({ params }: Args): Promise<Output> {
    const { bg_image_url, audio_list1, duration_list1, role_list, text_list,audio_list2, duration_list2,audio_list3, duration_list3,keywords,
        start_audio_list,start_duration_list } = params; 
    const audio_list = [...audio_list1, ...audio_list2, ...audio_list3];
    const duration_list = [...duration_list1, ...duration_list2, ...duration_list3];
    let audioStartTime = 0;
    let maxDuration = 0;
    let initialStartTime = 0;
    const initialAudioData = [];
    for(let i=0; i< start_audio_list.length;i++){
        const duration = start_duration_list[i];
        initialAudioData.push({
            audio_url: start_audio_list[i],
            duration,
            volume: 2,
            start: audioStartTime,
            end: audioStartTime + duration
        });

        audioStartTime += duration;
        maxDuration = audioStartTime;
        initialStartTime += duration;
    }
    const  start_text_timelines1 = [];
    start_text_timelines1.push(
               {
                   start: 0,
                   end: start_duration_list[0]
               }
       );
      //https://p9-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/373c3e491f214adfa3934a507e1c92e4.MP3~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1777426600&x-signature=Bp8XLZFWPpP1SiIQRKkVxluOl%2BU%3D&x-wf-file_name=%E5%92%9A%E9%9F%B3%E6%95%88.MP3
      const start_audio_text1 =[];
      start_audio_text1.push({
          audio_url: "https://p6-bot-sign.byteimg.com/tos-cn-i-v4nquku3lp/0562121f72f943f2802c7e8dc49e0e7b.MP3~tplv-v4nquku3lp-image.image?rk3s=68e6b6b5&x-expires=1749305401&x-signature=ZiBfMBfiHBWUnk6iqQPFe%2FFdfDM%3D",
          duration: 548571,
          volume: 2,
          start:  0,
          end:   548571
      });
       const  start_text_timelines2 = [];
       start_text_timelines2.push(
                  {
                      start: start_duration_list[0],
                      end:  start_duration_list[0]+start_duration_list[1]
                  }
          );
        const start_audio_text2 =[];
        start_audio_text2.push({
            audio_url: "https://p9-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/2ae7ccd877ea4c79b4fcbcfe38170b54.MP3~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1777425687&x-signature=m4S898PliWoqTBPavUmbcGKWozY%3D&x-wf-file_name=%E5%AD%97%E5%B9%95%E5%87%BA%E5%9C%BA.MP3",
            duration: 862040,
            volume: 2,
            start:  start_duration_list[0],
            end:  start_duration_list[0] + 862040
        });
       const  start_text_timelines3 = [];
       start_text_timelines3.push(
                  {
                      start: start_duration_list[0]+start_duration_list[1],
                      end: start_duration_list[0]+start_duration_list[1]+start_duration_list[2]
                  }
          );

    // 处理音频数据
    const audioData = [];

    for (let i = 0; i < audio_list.length && i < duration_list.length; i++) {
        const duration = duration_list[i];
        audioData.push({
            audio_url: audio_list[i],
            duration,
            volume: 2,
            start: audioStartTime,
            end: audioStartTime + duration
        });
        audioStartTime += duration;
        maxDuration = audioStartTime;
    }
    // 书籍拟人化图片
    var role1_img_url = "https://p9-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/7153ce955e1b4d51ab2e3972846fb13e.png~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1777338929&x-signature=LLDTeL38s5rfHt7%2BG1%2FvGFrwa%2FQ%3D&x-wf-file_name=CodeL.png";
    var role2_img_url = "https://s.coze.cn/t/MRdXPFzGLOw/";
    const result = generateVideoTimeline(
        {
            role_list: role_list,
            text_list: text_list,
            audio_list: audio_list,
            duration_list: duration_list
        },
        role1_img_url,
        role2_img_url,
        keywords,
        initialStartTime
    );
     // 处理背景图片
     const bgImageData = [
        {
            image_url: bg_image_url,
            width: 1920,
            height: 1080,
            start: 0,
            end: maxDuration + 1000000
        }
    ];

    // 构建输出对象
    const ret = {
        "role":  result.role,
        "bgImageData": JSON.stringify(bgImageData),
        "audioData": JSON.stringify(audioData),
        "initialAudioData": JSON.stringify(initialAudioData),
        "roleImage1": JSON.stringify(result.role[0].images),
        "roleImage2": JSON.stringify(result.role[1].images),
        "caption_text1": {
            "text1": result.role[0].texts,
            "timelines1": result.role[0].timelines
        },
        "caption_text2": {
            "text2": result.role[1].texts,
            "timelines2": result.role[1].timelines
        },
        "captions1": JSON.stringify(result.role[0].captions),
        "captions2": JSON.stringify(result.role[1].captions),
        "start_timelines1": start_text_timelines1,
        "start_timelines2": start_text_timelines2,
        "start_timelines3": start_text_timelines3,
        "start_audio_text1": JSON.stringify(start_audio_text1),
        "start_audio_text2": JSON.stringify(start_audio_text2)
    };
    return ret;
}
function generateVideoTimeline(data, imageUrl1, imageUrl2, keywords = [], initialStartTime = 0) {
    const { role_list, text_list, duration_list } = data;
    // 按order排序台词
    const sortedTexts = [...text_list].sort((a, b) => a.order - b.order);

    // 初始化时间轴起点
    let currentEnd = initialStartTime;  // 使用传入的初始时间
    const roleMap = new Map();
    // 换行处理函数
    const splitLongLines = (line) => {
        const maxLength = 10;
        if (line.length <= maxLength) return line;
        return line.replace(new RegExp(`(.{${maxLength}})`, "g"), "$1\n").replace(/\n$/, "");
    };
    for (const text of sortedTexts) {
        // 获取当前台词的持续时间
        const duration = duration_list[text.order - 1];
        const start = currentEnd;  // 起始时间基于当前累计值
        const end = start + duration;
        currentEnd = end;
        // 标准化角色名称匹配(处理方括号)
        const matchedRole = role_list.find(role => 
            role.role_name.replace(/[[\]]/g, "") === text.role_name
        );
        if (!matchedRole) continue;
        const roleKey = matchedRole.role_name;

        // 初始化角色数据结构
        if (!roleMap.has(roleKey)) {
            roleMap.set(roleKey, {
                role_name: roleKey,
                texts: [],
                timelines: [],
                images: [],
                captions: []
            });
        }
        const roleData = roleMap.get(roleKey);

        // 处理台词文本(换行分割)
        const processedLine = splitLongLines(text.line);
        roleData.texts.push(processedLine);
        roleData.timelines.push({ start, end });
        // 生成 captions 对象
        const matchedKeywords = keywords.filter(keyword => processedLine.includes(keyword));
        const uniqueKeywords = [...new Set(matchedKeywords)];
        const caption = {
            start,  // 使用调整后的时间
            end,    // 使用调整后的时间
            text: processedLine,
            in_animation: "羽化向右擦开"
        };
        if (uniqueKeywords.length > 0) {
            caption.keyword = uniqueKeywords.join('|');
            caption.keyword_color = "#fe8a80";
            caption.keyword_font_size = 10;
            caption.font_size = 10;
        }
        roleData.captions.push(caption);

        // 添加图片配置
        const imageUrl = role_list.indexOf(matchedRole) === 0 ? imageUrl1 : imageUrl2;
        const lastImage = roleData.images[roleData.images.length - 1];
        if (lastImage && lastImage.end === start) {  // 时间衔接判断依然有效
            lastImage.end = end;
        } else {
            roleData.images.push({
                image_url: imageUrl,
                in_animation: "轻微放大",
                width: 300,
                height: 300,
                start,  // 使用调整后的时间
                end    // 使用调整后的时间
            });
        }
    }
    return { role: Array.from(roleMap.values()) };
}

然后将信息进行视频合成处理:从创建草稿(create_draft)- 添加背景图(create_draft)- 添加音频(add_audios)- 添加关键帧(add_keyframes)-批量添加字幕(caption_infos)-保存草稿(保存草稿)。

img

imgimg

这里面一共使用了两个插件:

视频合成剪映小助手、剪映小助手数据生成器

img

img

当获取到最后的草稿地址(draft_url),粘贴到剪映小助手(客户端)创建草稿。

img

然后大家剪映可以看到最近的草稿,打开进入剪辑页面即可进行二次编辑,确定内容后右上角【导出】视频即可。

img

img

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

### 使用 DeepSeek 和 Coze 工具一键生成诗词视频 #### 准备工作 为了实现通过 DeepSeek 大规模语言模型和 Coze 视频编辑工具的一键生成诗词视频,需完成如下配置: - **环境搭建**:确保拥有稳定运行的 DeepSeek API 接口。考虑到在线API可能存在的不稳定性[^2],建议采用私有化部署的方式以保障服务的质量与效率。 - **Coze 集成**:确认 Coze 软件已安装完毕,并能够正常连接至所使用的 DeepSeek 实例。 #### 创建诗词脚本 利用 DeepSeek 的强大文本生成功能创建高质量的诗词内容作为后续制作的基础素材。 ```python import requests def generate_poetry(prompt, api_key): url = "http://localhost:8000/api/v1/generate" headers = {"Authorization": f"Bearer {api_key}"} data = { "prompt": prompt, "max_tokens": 50 } response = requests.post(url, json=data, headers=headers) return response.json()["text"] ``` 此函数 `generate_poetry` 可向本地部署的 DeepSeek 发送请求,基于给定提示词自动生成一段诗歌文字。 #### 自动化视频合成流程 借助 Coze 提供的应用编程接口(API),可将上述获得的文字内容转化为具有视觉效果的艺术作品。 ```python from coze import VideoEditor editor = VideoEditor() # 添加背景音乐 editor.add_background_music("path/to/music.mp3") # 插入诗句画面 for line in poetry.split("\n"): editor.add_text_slide(line) # 导出最终成果 output_path = "generated_video.mp4" editor.export(output_path) ``` 以上代码片段展示了如何运用 Coze 库中的类方法逐步构建一个完整的多媒体文件,其中包含了由 DeepSeek 自动生成的诗篇以及相应的配乐和转场特效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值