生成式AI自动化制作产品宣传片:开源Skill全流程解析

发布时间:2026/10/7 6:40:24
生成式AI自动化制作产品宣传片:开源Skill全流程解析 几天前一个做硬件的朋友跑来问我能不能用两三千块钱给新品做一条六十秒宣传片我的第一反应是要不要这么天真——但仔细聊下来发现他真正缺的不是摄影团队而是一条能把产品卖点自动变成成片的代码流水线。我手里正好有一套基于生成式AI的自动化方案最近把它整理成了一个开源 Skill喂进去一份产品资料它就能自动产出分镜脚本、画面素材、配音和最终宣传片。这篇文章把核心思路、关键代码和实际踩过的坑都写清楚给同样被“宣传片预算”卡住的产品开发者、独立开发者和运营同学参考。1. 一条产品宣传片的钱都花在哪我把成本拆开算了算1.1 传统外包钱主要花在流程协调在上一家创业公司待过两年我和视频供应商打过不少交道。一条30秒以内的产品宣传片外包报价通常这样拆脚本创意、拍摄执行、后期剪辑、配音配乐、字幕包装。每一项单看都不算夸张但叠加起来报价从8000到50000元都有周期基本一到两周。这里最大的成本其实不是“做片子”本身而是沟通和改稿需求文档反复确认、拍摄档期协调、初剪出来之后一堆意见来回拉扯。等真正拿到第一版可用成片市场需求往往已经变了。这就是传统方案的死穴——流程越重迭代越慢而宣传片偏偏是最需要跟着产品节奏快速变的东西。1.2 自己动手时间成本高效果还不稳定也有不少团队想过“我们自己来剪”。拿剪映套模板很快但快的前提是素材现成。如果素材来自产品实拍产品改版一次素材就废了如果素材来自AI生成在对话框里让AI“帮我生成一张产品图”出来的画面每次都不一样更别说把这些画面编成一条有叙事顺序的视频。纯靠自然语言驱动一次两次可以做成常态化流程就是灾难。原因很简单聊天窗口没有“状态”每次生成都是重新开始。你在第一条视频里指定过的产品外观、色调、镜头风格到下一条视频里AI完全想不起来除非你每次都把一堆约束条件重新打一遍。1.3 Skill 能把“拍片经验”固化成代码我后来想明白一件事宣传片制作贵是因为它高度依赖人的临场判断。导演看产品、写脚本、盯画面、调节奏这些经验都存在脑子里没法复用。但如果把这些步骤全部变成可执行脚本和可复用的提示词模板它就从“手艺活”变成了“流水线”。这也是我开源这个Skill的根本动机不是取代导演而是把最费时间的制作过程变成一个命令。所谓Skill这两年Agent圈说得很多本质就是一个带说明文档、提示词模板和脚本的目录。Claude Code、Codex这些工具都支持把Skill放进指定目录让AI在遇到相关任务时自动加载。我这个Skill的定位更直白它是一套“拍片工作流”的代码实现。为什么叫低成本因为成本结构被改变了。传统方案里每多改一版就要重新走一轮沟通和返修流程在这套方案里改一行JSON、重新跑一遍脚本边际成本趋近于零。这不是省了十倍钱的问题是彻底改变了产品团队更新宣传视频的频率。2. 流水线骨架一份产品资料如何一步步变成成片2.1 输入层先把产品资料变成一份结构化的 JSON流水线第一步是把产品资料转成结构化JSON。我一开始也犹豫过要不要直接让用户写一段文字描述试了几轮就放弃了。自由文本没法被脚本稳定解析——产品名可能出现在第一句也可能埋在第三句卖点可能列了三条也可能藏在某个长段落里。组织成固定结构之后后续所有环节都能程序化读取这是整个工程里最不起眼但最不能省的一步。我把输入收敛成这样一个文件{ product_name: MechKit 积木机器人, slogan: 让每个孩子都能亲手造出会跑的小车, selling_points: [ 模块化拼装无需螺丝刀, 支持图形化编程与手机遥控, 全彩拼装说明书零基础可上手 ], audience: 8-14岁学生及家长, tone: 明快、活泼、科技感, duration_seconds: 30, resolution: [1920, 1080] }字段不需要太多够用就行。产品名、标语、卖点、目标人群、色调、时长这套结构覆盖了绝大多数产品宣传片的核心信息。后续所有环节都从这个JSON读取数据改文案就改JSON换产品就换JSON全流程一行代码都不用动。2.2 脚本层让大模型生成严格格式的分镜脚本拿到结构化产品信息后调用大模型生成分镜脚本。这一步是整条流水线的灵魂也是我调得最久的地方。核心思路不是让AI自由创作而是要求它严格输出一个JSON数组每个镜头包含五个字段序号、时长、画面描述、旁白口播词、字幕文本。一个镜头的理想结构长这样{ scene: 1, duration: 4, visual: 特写彩色模块散落在桌面一只小手拿起红色齿轮模块, narration: 还在为孩子挑玩具发愁吗, subtitle: 还在为孩子挑玩具发愁吗 }为什么必须让它输出这种“可编程”的结构因为后面的生图、配音、合成环节全部都要按镜头逐个处理。如果模型给回来的是自然语言描述比如“第一个镜头先展示产品外观然后切换到使用场景”脚本就会变成一段需要人再加工的文字自动化就断了。2.3 视觉层我为什么坚持“一镜一张图”而不是直接文生视频视觉层有两种路线直接让文生视频模型生成动态画面或者用文生图模型逐镜生成静态图、再用后期动效让画面动起来。我最终选了后者原因是成本和可控性。文生视频模型的确惊艳但一条30秒视频无论按次计费还是按时长计费都不便宜而且可控性差——模型自己决定镜头怎么推、角色怎么动你很难指定“第三秒时镜头往左拉一点”。文生图API价格低一个数量级每张图还能单独审核不满意的镜头只重生成那一张就行。所以设计上采用“逐镜生图FFmpeg后期运镜”的策略每个分镜生成一张高分辨率静态图合成时用缩放、平移让画面活起来。这个策略牺牲了人物的复杂动作但产品宣传片绝大多数是在静态展示外观和卖点完全够用。2.4 音频层先在时间轴上定配音再安排镜头时长音频层我推荐一个顺序先把整段口播文案生成一条完整的配音再根据音频实际总时长回头微调每个镜头的时长配比。如果顺序反了先定画面时长再配音很容易出现“画面4秒、音轨3秒”的空档。产品宣传片的配音绝大多数是平铺直叙地播报卖点用自然音色的TTS就够。真正影响听感的是文案里的标点、断句和重音位置这些在生成配音时就要处理到位而不是等合成了再去拉长或加速音轨。2.5 合成层FFmpeg 是最后一道工序合成层负责把所有素材装进一个视频文件把每张图变成一个带缓慢推拉动效的视频片段按脚本顺序拼接挂上完整配音再烧录字幕。FFmpeg干这些活非常合适、而且免费。这一层没太多技术含量但参数坑极多我自己在前面几版里被折磨过不少次。中文字幕烧不出来、画面时长和音频对不上、镜头片段拼接时报编码错都属于新手特区。第三章我会集中列几个最典型的坑和对应的解决办法。3. 关键代码与踩坑实录生图、配音、合成三个环节的经验3.1 分镜脚本生成大模型输出格式不稳怎么兜底生成分镜脚本的代码本身不复杂核心是把系统提示词写到位。我用的Python调用长这样import json from openai import OpenAI client OpenAI() def generate_storyboard(product_info: dict, modelgpt-4o-mini) - list: system_prompt 你是一个产品宣传片导演。请根据产品信息生成分镜脚本。 必须输出合法JSON数组不要输出任何解释文字。每个镜头包含字段 scene(镜头序号), duration(秒), visual(画面描述用于文生图), narration(旁白口播文案), subtitle(字幕文本)。 严禁添加markdown代码块标记。 resp client.chat.completions.create( modelmodel, response_format{type: json_object}, messages[ {role: system, content: system_prompt}, {role: user, content: json.dumps(product_info, ensure_asciiFalse)}, ], temperature0.7, ) data json.loads(resp.choices[0].message.content) if scenes in data: return data[scenes] return data if isinstance(data, list) else [] def validate(scenes: list) - None: required {scene, duration, visual, narration, subtitle} for s in scenes: missing required - s.keys() if missing: raise ValueError(f镜头 {s.get(scene, ?)} 缺少字段: {missing})这里有个很实际的坑即使你指定了返回JSON格式部分模型仍可能把内容包在markdown代码块里或者嵌套在{scenes: [...]}这种外壳里。所以解析时要兼容两层结构并且必须做字段校验不要想当然按下标访问。另一个坑是时长规划。大模型对“30秒里应该有6到8个镜头”理解得不错但“每个镜头2秒还是6秒”经常凭感觉。我的解法是在系统提示词里加一条公式镜头时长该镜口播词字数×0.35至0.4秒让模型自己算完了填进duration字段。这一步能把后期音画不同步的概率降一半以上。3.2 生图环节镜头与镜头之间的“视觉一致性”最难搞生图的代码比脚本生成还简单def generate_image(visual_desc: str, output_path: str, seed: int 42): prompt f{STYLE_ANCHOR}。{visual_desc} resp client.images.generate( modelgpt-image-1, promptprompt, size1920x1080, n1, qualityhigh ) url resp.data[0].url # 下载 url 并保存到 output_path难的不是调用而是让不同镜头里的同一个产品长得一致。第一批测试时我踩过大跟头同一个“红色小车”在第二镜是红白配色到第五镜成了黑红配色成片看起来像两个产品轮流出镜。我的治疗手段分三层从免费到加钱把产品外观描述做成固定文本块放到每个镜头提示词最前面前后不变固定seed降低生图随机性个别镜头实在不一致就单独重跑那张图另外图片风格锚点必须统一。比如“明亮产品摄影棚柔光浅色背景三维渲染风格”这段前缀每次都要放在最前面生出来的图才会有同一个“剧组”的感觉。这比在描述里反复强调“风格一致”有效得多。3.3 配音环节普通宣传片别一上来就上重武器配音选型上我的原则是够用就好。普通产品口播用免费轻量级的TTS就足够比如edge-tts这类开源项目一条命令就能生成音频edge-tts --voice zh-CN-YunxiNeural \ --text 让每个孩子都能亲手造出会跑的小车 \ --write-media audio_001.mp3它的好处是免费、快、中文自然度高还支持多种音色。短板是长句的停顿处理一般需要在文案里手动加逗号、加省略号来模拟语气换气。如果你的宣传片要做大促风格想听起来很兴奋不用专门换贵价语音模型先在文案里加感叹号试试。实测感叹号对语气的影响非常明显比在系统提示词里写一百句“要热情”都管用。文案写成“特别提醒库存有限”TTS自然就会把语调扬起来。3.4 合成环节FFmpeg 这几个坑最容易被忽略FFmpeg部分我踩过的坑按影响程度排列。第一中文字幕烧录必须指定中文字体。FFmpeg的drawtext滤镜不指定中文字体中文会显示成方框甚至直接报错。我用的是开源的思源黑体ffmpeg -i scene_001.mp4 -vf \ drawtextfontfile/usr/share/fonts/SourceHanSansCN-Bold.otf:text让每个孩子都能亲手造出会跑的小车:x(w-text_w)/2:yh-th-60:fontsize48:fontcolorwhite:borderw2:bordercolorblack \ -c:v libx264 -pix_fmt yuv420p scene_001_sub.mp4第二zoompan的d参数表示总帧数必须是“帧率×时长”。比如帧率25、镜头时长4秒d100。这个值算错了画面会表现成快进或定格排查起来很费时间。第三镜头片段拼接时必须保证所有片段编码参数一致。分辨率、帧率、像素格式都要一样建议统一用-c:v libx264 -pix_fmt yuv420p。合并时用concat demuxer不要重新编码cat list.txt EOF file scene_001.mp4 file scene_002.mp4 file scene_003.mp4 EOF ffmpeg -f concat -safe 0 -i list.txt -c copy merged_no_audio.mp4注意这一步出来的是无声画面拼接版最后还得把完整配音、字幕再合成一次才算最终成片。顺序上先把所有镜头的画面片段准备好确认无误了再挂满整段音频能避免大量返工。4. 实测账本与效果边界走这条路到底划不划算4.1 一条30秒宣传片的真实成本明细我拿前面的“MechKit积木机器人”示例完整跑了一遍流水线成本明细如下环节花费说明分镜脚本生成约0.1元小模型即可几十次调用费用可忽略生图API约6-12元30秒片约6-8张图按张计费平台不同价格有差异TTS配音0元edge-tts本地生成免费FFmpeg合成0元本机执行CPU也能跑只是稍慢人工修改1-2小时主要花在重生成个别镜头、微调字幕合计约10-20元不含自己的时间成本对比传统外包同样一条30秒产品宣传片最低报价也要3000元带实拍的要到一两万。这条流水线把价格打到了几十块钱的量级代价是你要自己承担审美和设计环节AI生成的画面不一定每一帧都符合预期。4.2 哪类产品最适合用这个方案出片测试了几十轮后我总结出三个特别适合的场景开源项目或软件工具有界面截图、有演示视频适合做功能亮点的快速混剪电商上新短时间内需要多版本素材方便测试不同卖点组合的转化率活动预热、官网头图轮播不需要真人出镜强调氛围感和产品外观不适合的场景也很明确。真人出镜、需要实拍细节、对复杂运镜有高要求、或者品牌方要求每个镜头都有导演级审美把关——在这些场景里AI素材只能当垫场和参考取代不了专业视频团队。4.3 客观看成功率十条里能直接用的有多少我统计了自己跑过的十条产品资料结果是这样的直接可用的有两条需要小幅修改的六条完全推倒重来的两条。小修主要指某几个镜头画面不对、某句配音语气平淡、某条字幕被截断。这个成功率单独看不算高但有一个关键特征修复成本极低。哪一幕不对就重跑那一幕几分钟出结果由于输入是JSON、中间产物都是文件重跑不会影响已经满意的部分。这种“微创手术”式的迭代节奏在传统外包流程里根本不存在。5. 开源一个 Skill 的正确姿势目录、文档和两种调用方式5.1 先写好 SKILL.md别让使用者读完还不会用开源一个Skill最大的难点不是代码而是文档。别人拿到项目第一眼看的就是说明文件我在整理时参考了目前各家Agent Skill的通用约定把说明做成一个SKILL.md文件# Product Video Maker ## 功能 根据产品资料自动生成30-60秒产品宣传片输出分镜脚本、逐镜头图片、配音和最终成片。 ## 输入 - config/product.json产品信息字段见示例文件 ## 运行方式 - 方式一bash scripts/run.sh config/product.json - 方式二作为Agent Skill由Agent读取SKILL.md后自动调用 ## 输出目录 - output/分镜脚本、图片序列、音频、最终视频 ## 注意事项 - 调用生图API的Key需在config/settings.yaml配置 - 字幕使用思源黑体字体缺失时先安装这份文档要回答三个问题什么时候用它、怎么喂数据、跑完去哪拿结果。一个新手能在五分钟内跑通这个Skill才算合格。我甚至把product.json的示例直接复制到了文档里让使用者不用翻代码也能明白输入长什么样。5.2 CLI直跑和Agent调用我保留了两种模式这个Skill最终同时支持两种运行模式。第一种是命令行直接执行适合有Python基础的开发者本地环境跑完就出片逻辑透明、便于调试。第二种是通过Agent调用把Skill文件夹放进Agent的skill目录使用者用自然语言说一句“给MechKit生成一条宣传片”Agent就会读取SKILL.md、按流程执行脚本。第二种模式更贴近“低成本”理念。它把“教AI拍宣传片”变成了一次性的环境配置之后团队里哪怕完全不懂代码的运营同学也能用一句话触发整个流水线。实际测试下来Agent读取SKILL.md后自主调用脚本的成功率挺高偶尔会漏跑中间一步所以在脚本层我做了一个进度检查每一步产物没有生成就拒绝进入下一步从机制上避免“模型以为自己跑完了”。5.3 开放之后还能怎么扩展几个我已经验证过的方向开源的好处是别人能走到你没想到的地方。我目前至少验证过这几个扩展方向技术上都不难多语言版本TTS切一个音色参数就能出英文、日文宣传片适合出海产品产品官网截图提取自动抓取产品页面图片作为素材让生图模型重绘省掉人工整理素材A/B测试同时生成三种侧重点不同的文案各出一版成片交给投放系统测点击率接入CI产品文档每次更新自动触发宣传片重新生成保证对外视频永不过期这些扩展方向都不复杂真正难的是第一步——把流程从“人找AI要素材”变成“代码直接产出成片”。一旦这个思路打通宣传片就不再是“求人做的事”而是产品构建流程里一个普通产出物而已。