AI工具搭建自动化视频生成Slack机器人
## 从代码到通知当AI视频流遇上钉钉机器人项目启动那周项目经理在晨会上说客户要求每天凌晨自动生成一段库存预警视频然后推送到钉钉群里。当时第一反应是这活儿要么找人半夜盯数据要么写个脚本把截图拼成视频。后来发现用现成的AI工具生成视频内容再通过钉钉机器人推送比想象中简单得多也灵活得多。它到底是什么说白了这是一套把“AI生成视频”和“钉钉消息推送”粘合起来的自动化流程。核心是两个独立模块一边是调用大模型或AI视频生成接口比如腾讯混元、百度文心一言的API或者本地部署的Stable Video Diffusion根据结构化数据生成带有解说或动画的视频片段另一边是用钉钉开放平台的机器人Webhook把生成好的视频文件作为消息卡片发到指定群聊。关键点在于“串联”。不是每次生成视频都手动上传而是让Python脚本充当调度中心从数据库或API拉取数据塞进视频生成模板得到MP4文件再调用钉钉接口上传并发送。整个链条里Python的requests库和subprocess模块是主力偶尔会用到FFmpeg做格式转换或拼接。真正能解决什么问题最早接触这个需求时有人提议用录屏软件定时录播。但录屏无法动态适应数据变化——比如库存低于警戒线时视频里需要自动生成红色警告字幕。AI视频生成的优势在于内容可变同一个模板填入不同的数字、图表、文案每次产出的视频都不一样。实际场景里最常见的是三类数据日报视频化把Excel表格或数据库查询结果变成带语音解说的短视频晨会前自动发到群里。监控预警当系统检测到异常流量或设备离线自动生成一段15秒的故障描述视频附带截图和文字说明。批量培训材料把操作文档转化为AI配音的演示视频按部门分组推送到不同钉钉群。有个客户把这种流程用在工厂质检环节AI根据当日良品率数据生成柱状图动画配上语音播报生产主管每天通过视频而不是表格来掌握质量趋势。从零搭一套的常见路径第一步是明确数据源。假设从MySQL读库存数据importmysql.connector connmysql.connector.connect(hostlocalhost,userroot,passwordpwd,databasewarehouse)cursorconn.cursor()cursor.execute(SELECT product_name, stock_quantity FROM products WHERE stock_quantity 50 ORDER BY stock_quantity ASC)low_stock_itemscursor.fetchall()第二步是用AI生成视频。如果选腾讯混元需要先申请API然后组装参数。一个取巧的做法是先生成图片序列再用FFmpeg合成视频importrequestsimportjsonfrompathlibimportPathdefgenerate_alert_image(product,quantity):# 调用文生图API生成带文字的预警图片urlhttps://api.hunyuan.cloud.tencent.com/v1/images/generationsheaders{Authorization:Bearer YOUR_API_KEY}promptf一张深色背景的工业风格卡片中间显示产品{product}库存仅剩{quantity}件红色警示边框payload{prompt:prompt,size:1280x720}resprequests.post(url,jsonpayload,headersheaders)# 下载返回的图片并保存到本地image_urlresp.json()[data][0][url]img_datarequests.get(image_url).content save_pathPath(f./frames/alert_{product}.png)save_path.write_bytes(img_data)returnstr(save_path)生成多张图片后用FFmpeg拼成带过渡效果的视频importsubprocess frames_dir./framesoutput_video./output/daily_alert.mp4cmd[ffmpeg,-y,-framerate,1,# 每张图片展示1秒-pattern_type,glob,-i,f{frames_dir}/*.png,-c:v,libx264,-pix_fmt,yuv420p,output_video]subprocess.run(cmd,checkTrue)第三步是发送到钉钉。先在企业钉钉后台创建一个机器人拿到Webhook地址。注意要设置自定义关键词或者加签不然会被拦截。上传文件需要先获取上传凭证然后拼接消息卡片defsend_dingtalk_video(webhook,video_path):# 第一步获取access_token这里假设已拿到实际要调用获取token接口upload_urlfhttps://oapi.dingtalk.com/media/upload?access_token{token}typefilewithopen(video_path,rb)asf:files{media:f}upload_resprequests.post(upload_url,filesfiles)media_idupload_resp.json()[media_id]# 第二步发送消息卡片card_data{msgtype:action_card,action_card:{title: 今日库存预警视频,markdown:请查看附件红底标注为紧急补货项,btn_orientation:1,btn_json_list:[{title:查看视频,action_url:dingtalk://dingtalkclient/page/link?url直接播放链接}]}}# 或者直接发文件消息file_msg{msgtype:file,file:{media_id:media_id}}requests.post(webhook,jsonfile_msg)最后用cron或APScheduler调度整个流程设定每天5:30执行。踩过的一些坑最初尝试直接用现成的“AI视频生成钉钉发送”工具比如某些低代码平台的预制组件。但很快发现这类工具生成视频的模板太死板只能替换文本无法控制图表位置或动画时长。后来换成自研方案虽然代码量大了些但定制空间大得多。另一个坑是视频文件大小。钉钉机器人对文件大小有限制免费版最大20MBAI生成视频如果分辨率太高或时长过长很容易超限。解决方案是在FFmpeg阶段控制码率cmd[ffmpeg,-i,output_video,-b:v,800k,# 降低码率-maxrate,1000k,-bufsize,1500k,output_compressed.mp4]此外视频配音如果不做语音识别同步容易造成音画不同步。建议先用AI语音合成生成音频文件再通过FFmpeg精确对齐时间戳。与同类技术的差异市面上有一些专门的“智能视频生成平台”比如剪映的商业版、腾讯智影、Mootion等它们支持直接导出并分享到钉钉。这种方案的好处是完全不需要写代码拖拽就能用。但局限性在于无法嵌入到已有的业务系统里数据更新全靠手动导入。如果每天的数据从内部ERP自动同步这类工具就显得笨重。另一种方案是纯用Python库比如moviepy生成视频再用钉钉sdk推送。moviepy的优势是原生Python不需要调API适合生成简单的文字动画。缺点是对复杂场景比如接入外部AI模型做画面生成支持较弱性能也差一些渲染较长视频时容易内存溢出。对比下来综合方案灵活度最高AI负责内容生成FFmpeg负责后期处理钉钉API负责分发。每一层都可以独立替换——今天用混元明天换成sd-webui不影响其他模块。而且所有代码都控制# # 用AI搭个Slack机器人自动生成视频一个Python老手的实践笔记这个机器人到底是什么最近在搞一个视频内容生成的项目说白了就是让AI在Slack里听命令然后自动把文字变成视频。听着挺科幻其实就是一个Python程序挂在服务器上订阅Slack的消息收到指令就调用各种API去生成视频。它不是什么高大上的新发明就是把几个现成的工具串在一起让协作流程更顺滑一些。工作流程大致是这样你在Slack里机器人说“帮我把这篇周报做成短视频”它就会调用大模型把文字改写、分镜然后通过视频生成API合成最后把成品链接丢回给你。整个过程大概三五分钟看你文字有多长。它能干什么这个机器人在实际工作中能解决几个很实在的问题。比如运营团队要批量做短视频分发以前得找设计师、剪辑师来回沟通改稿现在直接丢指令就行。再比如技术团队的周报每次都做成同样的模板视频省得人肉复制粘贴。最实用的场景我觉着是自动化产品演示。有个哥们在做SaaS工具他们的功能介绍视频每个月都要更新以前外包做一次几千块现在让机器人每个月自动跑一遍成本降了八成。还有那些需要频繁更新数据的报表视频也特别适合交给机器人。当然它也不是万能。生成的视频质量取决于你喂的模板和素材指望它像专业导演那样构思分镜不现实。但要是你有固定的模式、清晰的诉求它确实能省大量时间。怎么搭一个这样的机器人稍微有点Python基础的话整个过程并不复杂。选个稳定的云服务器或者本地机器跑就行关键步骤有这几个第一步搞定Slack的接入。去Slack API后台建个应用申请机器人的权限拿到Bot Token。然后在你的代码里用slack_sdk库监听事件比如收到机器人 生成视频就触发后续流程。这块要注意的是得确认消息的channel id别让机器人产生误操作。第二步把AI生成能力接进来。这里选哪个模型看具体需求。要是写稿子、改文案可以用OpenAI或者Claude调用它们的API拿到改写后的文本。要是直接生成视频帧就得用那些有图像生成能力的模型比如Stable Diffusion或者DALL-E。我个人的做法是让大模型先产出文字脚本和分镜描述再单独调图像模型去生成。第三步把文字变成视频。最成熟的方式是用moviepy这个库它能在Python里操纵视频片段。先准备好背景素材、字幕模板然后把AI生成的文字渲染上去。如果觉得moviepy太底层的干活量太大可以试试一些商业的视频生成API它们提供更高级的封装丢个JSON描述过去就能拿到视频。第四步把视频推送回去。用Slack的API上传文件或者生成临时链接发到channel。这里有个小细节Slack对文件大小有限制超过100MB的视频可能要存到云存储再分享链接。整个流程的骨架大概是from slack_sdk import WebClientfrom slack_sdk.socket_mode import SocketModeClientimport openaifrom moviepy.editor import *def handle_message(event):if “生成视频” in event[“text”]:# 1. 调用大模型生成脚本script openai.ChatCompletion.create(…)# 2. 根据脚本生成视频帧images generate_images(script)# 3. 用moviepy合成视频clip ImageSequenceClip(images, fps24)clip.write_videofile(“output.mp4”)# 4. 发回Slackclient.files_upload_v2(channelevent[“channel”], file“output.mp4”)这段代码省略了细节但核心思路就是这样。真正投产的时候还得考虑异步任务、错误重试、并发控制这些工程问题。几个实用的实践经验第一个别让机器人一次性处理太长内容。视频太长了生成时间久Slack那边的连接会超时。我一般限制文本不超过3000字生成的视频控制在5分钟以内。超过这个长度的内容可以拆成多段让机器人分批处理。第二个模板化是个好习惯。把常用的视频风格、字体、背景音乐都做成配置文件机器人收到指令时根据关键词选模板。这样生成出来的视频一致性高客户也满意。第三个加个缓存层。如果同样的素材生成过视频直接返回历史记录别浪费钱反复调API。特别是一些周报模板类的视频文本差异不大完全可以复用。第四个监控和日志要跟上。视频生成这种耗时操作很容易出各种意外比如模型调用失败、文件格式不对。加个完整的日志系统出了事能快速定位。我用的方案是把所有请求和状态写到一个SQLite数据库里配合Kibana做可视化。跟其他方案比比看纯自己做对比现成的SaaS工具比如Lumen5或者InVideo。SaaS工具的优势是上手快拖拽式操作不需要写代码。但问题也明显一是贵按视频数量或时长收费量大了扛不住二是定制能力差你想加个特别的转场效果得看人家支不支持。自己搭的机器人虽然前期要投入开发精力但一劳永逸后期每生成一个视频的成本几乎为零除了API调用费。再对比下直接用AI视频生成工具比如Runway ML或者Pika。这些工具生成的视频质量更高更动态但它们没有协作能力不能集成到团队的工作流里。Slack机器人胜在“顺手”大家不用切工具在日常沟通里就把事办了。还有个曲线救国的方案用Zapier这类低代码平台去串联不同工具。比如Triggers来自Slack然后调用Replicate上的模型生成视频最后再存到Google Drive。优点是不用写代码缺点是流程复杂一步就得付费而且定制空间有限出现错误不好排查。我自己的倾向是团队如果就两三人用SaaS工具可能是最省心的选择。但要是团队上了规模每天要生成几十个视频那自己撸一个机器人反而是性价比最高的解法。另外就是如果你对最终视频有比较强的品牌要求比如必须用某个特定的字体、配色、动画效果那自己搭的机器人几乎是不二之选。说到底这个方案的核心价值不在于技术多炫酷而在于把“生成视频”这个事儿变成了沟通流的一部分。像发条消息一样简单背后的AI替你完成了所有脏活累活。这就是我理解的实用主义工程。在千行以内维护成本并不高。如果团队里有人对视频质量要求特别高也可以改成先通过AI生成脚本描述再调用专业渲染引擎比如Blender的Python接口输出视频。但这就属于进阶玩法了日常预警场景完全不用这么复杂。