ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

智能体自动化:公众号文章一键生成视频号短视频全链路方案

智能体自动化:公众号文章一键生成视频号短视频全链路方案 1. 从图文到视频的自动化链路拆解公众号文章和视频号短视频之间隔着的不是简单的“复制粘贴”而是一整套内容形态的转换工程。我做了大半年的智能体基建踩过的坑比写过的代码还多今天就把这套“公众号文章自动生成视频号短视频”的完整方案摊开来讲。核心思路很直接用智能体串联起文案提取、语音合成、画面生成、视频合成四个环节让一篇三千字的公众号长文在十分钟内变成一条带字幕、有配音、画面不违和的短视频。这套方案适合谁适合那些手里有大量图文内容、想低成本试水短视频的内容创作者也适合想了解智能体落地场景的技术爱好者。你不需要会剪辑但需要有一点折腾环境的耐心。先说说为什么选智能体这条路。传统做法是人工把文章改成脚本再录音、找素材、剪辑一条视频至少两小时。而智能体的价值在于它能把“理解文章结构”这件事自动化。我试过用纯脚本硬编码结果文章一换风格就崩也试过用现成的SaaS工具但模板感太重发出去像批量生产的垃圾内容。最后定下来的方案是用大语言模型做内容理解和脚本改写用Whisper做语音转写校对用FFmpeg做视频合成中间用Python脚本做调度。这套组合的灵活性最高每个环节都能单独替换或调参。整个链路我拆成四步。第一步从公众号文章链接或正文里提取纯文本去掉广告和无关推荐位。第二步把长文喂给大语言模型让它输出适合口播的短文案同时生成分镜描述。第三步用TTS把文案转成语音再用Whisper做一遍回译校对确保没有多音字错误。第四步根据分镜描述匹配素材或生成纯色背景加文字动画最后用FFmpeg把语音、画面、字幕合成到一起。这四步里第三步的校对环节最容易被忽略但恰恰是决定视频“能不能听”的关键。注意公众号文章里经常有图片、表格、代码块提取文本时要做好过滤否则大语言模型会被无关符号干扰输出的脚本质量断崖式下跌。1.1 为什么不用现成的视频生成大模型市面上确实有文生视频的大模型但我实测下来直接拿公众号文章生成视频效果并不好。原因有两个一是文生视频模型对长文本的理解能力有限三千字的文章它抓不住重点二是生成视频的时长和分辨率不可控一条三分钟的视频可能要渲染半小时成本扛不住。所以我选择“拆解再组装”的思路把视频生成拆成语音、画面、字幕三个独立模块每个模块用最成熟的工具解决。语音用Edge TTS免费且音色自然画面用FFmpeg合成稳定且速度快字幕用Whisper对齐时间轴准确率够用。这套方案的单条视频生成时间可以压到三分钟以内硬件成本几乎为零。1.2 智能体在链路中的角色定位这里的“智能体”不是那种能自主决策的复杂系统而是一个有状态的工作流调度器。它负责接收文章输入判断文章类型干货、故事、资讯然后选择不同的脚本改写策略。比如干货类文章智能体会保留核心论点删掉冗余案例故事类文章智能体会保留情节线压缩环境描写。这个判断逻辑我用的是提示词工程加少量规则匹配没有上复杂的多智能体框架。原因很简单内容创作这件事过度自动化反而会丢失“人味”。智能体做80%的脏活累活剩下20%的润色和把关还是得人来。2. 核心工具链的选型与配置细节工具选型这件事我走过不少弯路。最开始用某款在线TTS结果免费额度用完后按字符收费一条视频成本三块钱一个月下来比买会员还贵。后来换成Edge TTS虽然音色选择少一些但胜在免费、稳定、支持SSML标记。FFmpeg的安装是个门槛Windows用户建议直接下载官网的静态编译包解压后把bin目录加到环境变量里别去折腾什么包管理器容易出玄学问题。Whisper本地部署对硬件有要求如果机器没有独立显卡建议用whisper.cpp的量化版本速度慢一点但能跑。2.1 Edge TTS的安装与音色选择Edge TTS的安装很简单一行命令搞定pip install edge-tts但音色选择有讲究。中文口播我推荐这几个音色zh-CN-XiaoxiaoNeural适合情感类内容语调起伏自然zh-CN-YunxiNeural适合干货类内容语速平稳zh-CN-YunjianNeural适合资讯类内容节奏偏快。你可以在命令行里用edge-tts --list-voices查看所有可用音色。实测下来Xiaoxiao的断句最准遇到长句不会一口气读完而是会在逗号处自然停顿。如果你要做多角色对话的视频可以给不同角色分配不同音色但注意别超过三种否则观众会听觉疲劳。提示Edge TTS生成的音频默认是24kHz采样率如果后续要用FFmpeg做变调或变速处理建议先用ffmpeg -i input.mp3 -ar 44100 output.wav转成44.1kHz避免重采样带来的音质损失。2.2 FFmpeg的安装与常用命令速查Windows用户去FFmpeg官网下载ffmpeg-release-essentials.zip解压到C:\ffmpeg然后把C:\ffmpeg\bin加到系统Path里。验证安装是否成功ffmpeg -versionLinux用户直接用包管理器sudo apt install ffmpegmacOS用户用Homebrewbrew install ffmpeg安装完成后这几个命令你一定会用到。把音频和图片合成视频ffmpeg -loop 1 -i background.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest output.mp4给视频加字幕ffmpeg -i input.mp4 -vf subtitlessubtitle.srt:force_styleFontSize24,PrimaryColourHFFFFFF output.mp4调整视频速度ffmpeg -i input.mp4 -filter:v setpts0.5*PTS -filter:a atempo2.0 output.mp4这几个命令覆盖了80%的合成需求。注意-pix_fmt yuv420p这个参数不加的话在某些播放器上会显示花屏这是编码格式兼容性问题踩过一次坑就记住了。2.3 Whisper本地部署的硬件门槛与优化Whisper的官方实现基于PyTorch安装命令是pip install openai-whisper但如果你没有NVIDIA显卡推理速度会慢到怀疑人生。我的测试数据是用CPU跑medium模型一分钟的音频要转写三分钟用GPU跑同样的模型一分钟音频只要十秒。所以没有显卡的话建议用whisper.cpp它支持量化模型CPU推理速度能提升三到五倍。安装whisper.cpp的步骤稍微麻烦一点需要先克隆仓库再编译git clone https://github.com/ggerganov/whisper.cpp cd whisper.cpp make然后下载量化模型bash ./models/download-ggml-model.sh base用的时候./main -m models/ggml-base.bin -f audio.wav -l zhbase模型在中文上的准确率已经够用如果对时间轴精度要求高可以换small模型但速度会慢一倍。3. 完整实操流程与关键环节实现这一节我把整个流程拆成可复现的步骤你跟着做就能跑通。先说明一下我的运行环境Windows 11Python 3.10没有独立显卡所以Whisper用的是whisper.cpp的base模型。如果你有显卡可以把Whisper换成官方版本速度更快。整个项目我放在一个叫wechat-video-creator的目录里结构如下wechat-video-creator/ ├── input/ │ └── article.txt ├── output/ │ ├── audio.mp3 │ ├── subtitle.srt │ └── video.mp4 ├── assets/ │ └── background.jpg ├── scripts/ │ ├── extract_text.py │ ├── rewrite_script.py │ ├── tts_generate.py │ ├── whisper_align.py │ └── compose_video.py └── config.yaml3.1 文章提取与脚本改写第一步是把公众号文章转成纯文本。如果你有文章链接可以用requests加BeautifulSoup抓取但公众号的页面结构经常变更稳妥的做法是手动复制正文到article.txt。提取文本的脚本很简单import re def clean_text(raw_text): # 去掉多余空行 text re.sub(r\n{3,}, \n\n, raw_text) # 去掉图片标记 text re.sub(r!\[.*?\]\(.*?\), , text) # 去掉链接 text re.sub(r\[.*?\]\(.*?\), , text) return text.strip() with open(input/article.txt, r, encodingutf-8) as f: raw f.read() cleaned clean_text(raw) with open(input/article_cleaned.txt, w, encodingutf-8) as f: f.write(cleaned)接下来是脚本改写。我用的是大语言模型的API提示词是这样设计的你是一个短视频脚本改写助手。请把下面的公众号文章改写成适合口播的短视频脚本要求 1. 保留核心观点删掉冗余案例和重复论述 2. 每句话不超过30个字适合口语表达 3. 开头3秒内抛出钩子吸引观众停留 4. 结尾引导点赞关注 5. 输出格式为纯文本不要加任何标记 文章内容 {article_text}实测下来这个提示词对干货类文章效果最好改写后的脚本长度大约是原文的20%到30%。如果文章是故事类我会把提示词里的“保留核心观点”改成“保留情节转折”其他不变。3.2 语音合成与字幕对齐拿到改写后的脚本用Edge TTS生成语音import edge_tts import asyncio async def generate_audio(text, output_path): communicate edge_tts.Communicate(text, zh-CN-XiaoxiaoNeural) await communicate.save(output_path) asyncio.run(generate_audio(script_text, output/audio.mp3))生成完语音后用Whisper做回译校对。这一步的目的是生成带时间轴的字幕文件同时检查TTS有没有读错多音字。命令如下./whisper.cpp/main -m models/ggml-base.bin -f output/audio.wav -l zh -osrt这个命令会生成audio.wav.srt文件里面是带时间轴的字幕。我一般会打开这个文件快速扫一遍看看有没有明显的错字。比如“重”字在“重要”和“重复”里读音不同TTS有时候会读错Whisper的回译能帮我发现这类问题。如果发现错误就回到脚本里把那个词换成同义词重新生成语音。注意Whisper生成的字幕时间轴有时候会偏移尤其是语速较快的时候。如果偏移超过0.5秒建议手动调整SRT文件里的时间码或者用FFmpeg的-itsoffset参数做整体偏移。3.3 画面合成与最终输出画面部分我走的是极简路线一张纯色背景图加文字动画。背景图用PIL生成尺寸1920x1080颜色选深灰或深蓝文字用白色字号72。生成背景图的代码from PIL import Image, ImageDraw, ImageFont def create_background(text, output_path): img Image.new(RGB, (1920, 1080), color(30, 30, 40)) draw ImageDraw.Draw(img) font ImageFont.truetype(C:/Windows/Fonts/msyh.ttc, 72) # 文字居中 bbox draw.textbbox((0, 0), text, fontfont) text_width bbox[2] - bbox[0] text_height bbox[3] - bbox[1] x (1920 - text_width) / 2 y (1080 - text_height) / 2 draw.text((x, y), text, fontfont, fill(255, 255, 255)) img.save(output_path) create_background(公众号文章自动生成视频, assets/background.jpg)最后用FFmpeg合成ffmpeg -loop 1 -i assets/background.jpg -i output/audio.mp3 -vf subtitlesoutput/audio.wav.srt:force_styleFontSize28,PrimaryColourHFFFFFF,OutlineColourH000000,Outline2 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest output/video.mp4这条命令做了三件事把背景图循环成视频流把字幕烧录到画面上把音频和视频合并。-shortest参数确保视频长度和音频一致不会出现黑屏尾巴。整个流程跑下来一条三分钟的视频大概占用50MB空间生成时间在两到三分钟之间。4. 常见问题与排查技巧实录这套方案我跑了上百条视频遇到的问题五花八门这里挑几个高频的说说。4.1 TTS语音断句不自然的解决思路Edge TTS的断句逻辑是基于标点符号的如果脚本里全是逗号它会读得很平。我的做法是在改写脚本时故意在长句中间插入句号把一句话拆成两到三个短句。比如“我们今天要讲的是如何用智能体把公众号文章自动生成视频号短视频”这句话改成“今天讲一个实用技巧。用智能体把公众号文章自动生成视频号短视频。”这样TTS读起来就有节奏感了。另外可以在文本里加break time500ms/这样的SSML标记强制停顿但Edge TTS对SSML的支持不完整实测只有break标签生效。4.2 FFmpeg合成报错的排查清单FFmpeg的报错信息有时候很模糊我整理了一个速查表报错信息可能原因解决方法No such filter: subtitles编译时未启用libass换用官网静态编译包Invalid argument参数顺序错误检查-i是否在输出文件之前Codec not found缺少编码器安装libx264和aacPermission denied输出文件被占用关闭播放器或编辑器Moov atom not found输入文件损坏用ffmpeg -i input.mp4 -c copy output.mp4修复最常见的是subtitles滤镜报错这是因为有些FFmpeg版本没有编译libass。解决办法很简单去官网下载ffmpeg-release-full.7z解压后用里面的ffmpeg.exe别用essentials版本。4.3 Whisper识别多音字错误的修正方法Whisper在中文多音字上的表现时好时坏。我遇到过的典型错误包括“银行”读成“xing”“音乐”读成“le”“长大”读成“chang”。修正方法有两个一是把脚本里的多音字换成同义词比如“银行”改成“金融机构”二是在Whisper的提示词里加一个热词表但whisper.cpp对提示词的支持有限所以我一般用第一种方法。另外如果视频里出现了人名或专业术语建议在脚本里用拼音标注TTS读拼音的准确率比读汉字高。4.4 视频号上传的格式要求与转码建议视频号对上传视频的格式有要求MP4容器H.264编码分辨率建议1080x1920竖屏或1920x1080横屏码率不低于2Mbps音频AAC编码采样率44.1kHz。我生成的视频默认是横屏1920x1080如果要做竖屏把背景图尺寸改成1080x1920FFmpeg命令里的分辨率参数同步改一下就行。转码命令ffmpeg -i output/video.mp4 -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -ar 44100 -vf scale1080:1920:force_original_aspect_ratiodecrease,pad1080:1920:(ow-iw)/2:(oh-ih)/2 output/video_vertical.mp4这条命令会把横屏视频居中放到竖屏画布上上下留黑边。如果你想要全屏竖屏那就得重新生成竖版背景图。5. 智能体调度的工程化实践前面讲的都是单条视频的生成流程但如果你要批量处理几十篇文章手动跑脚本就不现实了。这时候需要一个调度层也就是我所说的“智能体”。这个调度层不复杂核心是一个状态机接收文章链接判断文章类型调用对应的改写策略然后依次执行TTS、Whisper、FFmpeg最后把成品视频放到输出目录。我用的是Python的asyncio加queue并发数控制在3避免同时跑太多任务把CPU吃满。5.1 任务队列与并发控制调度器的核心逻辑import asyncio from queue import Queue task_queue Queue() async def worker(worker_id): while not task_queue.empty(): article task_queue.get() print(fWorker {worker_id} processing {article[title]}) await process_article(article) task_queue.task_done() async def main(): articles load_articles(input/articles.json) for article in articles: task_queue.put(article) workers [asyncio.create_task(worker(i)) for i in range(3)] await asyncio.gather(*workers) asyncio.run(main())这个调度器的好处是如果某条视频生成失败不会影响其他任务。我一般会在process_article里加try-except把失败的任务记录到日志里方便后续重试。5.2 失败重试与日志记录失败重试的策略是第一次失败后等30秒重试第二次失败后等60秒第三次失败就跳过并记录。日志用Python的logging模块输出到文件和控制台。关键日志包括任务开始时间、文章标题、当前步骤、耗时、是否成功。这些日志在排查问题时非常有用比如我发现某篇文章的TTS总是失败查日志才发现是文章里有个特殊符号导致Edge TTS报错把符号删掉就好了。5.3 批量处理的性能优化批量处理时瓶颈通常在Whisper的转写速度上。我的优化方法是先用Edge TTS生成所有音频然后集中跑Whisper这样能减少模型加载的次数。另外FFmpeg合成也可以并行但要注意磁盘IO如果同时写太多大文件硬盘会成为瓶颈。实测下来一台普通笔记本16GB内存无独显跑十条三分钟的视频总耗时大约25分钟平均每条2.5分钟。如果换成有独显的机器Whisper用GPU加速总耗时能压到10分钟以内。6. 内容质量把控与人工干预点自动化生成的内容最大的风险是“看起来像垃圾”。我见过太多用模板批量生成的视频画面是几张图来回切配音是机械的AI音字幕还有错别字发出去不仅没流量还会伤账号权重。所以我在流程里设了三个必须人工干预的点。6.1 脚本改写后的人工审核大语言模型改写的脚本我每次都会通读一遍。重点看三件事开头有没有钩子逻辑有没有断层结尾有没有引导。钩子这件事模型经常写得太泛比如“今天分享一个技巧”这种开头没人会停留。我会手动改成“我花了三个月终于把这件事自动化了”制造悬念。逻辑断层通常出现在模型删减内容的时候前后句接不上读起来很突兀。结尾的引导语模型喜欢写“点赞关注”太生硬我会改成“如果这个方案对你有用点个赞让我知道”。6.2 字幕时间轴的微调技巧Whisper生成的字幕时间轴有时候会偏。我的经验是如果偏移在0.3秒以内不用管观众感知不到如果超过0.5秒就要手动调。调的方法很简单用文本编辑器打开SRT文件把时间码整体加或减一个固定值。比如所有时间码都慢了0.5秒就把00:00:01,000改成00:00:00,500。如果偏移不均匀那就得逐条调比较费时间但这种情况很少见。6.3 背景音乐与音效的添加建议纯口播的视频加一点背景音乐能提升完播率。我一般用FFmpeg的amix滤镜把背景音乐和口播音频混合ffmpeg -i audio.mp3 -i bgm.mp3 -filter_complex [1:a]volume0.1[bgm];[0:a][bgm]amixinputs2:durationfirst output/mixed.mp3volume0.1是把背景音乐音量降到10%避免盖住人声。背景音乐的选择上我推荐用无版权音乐库里的轻音乐节奏舒缓不要有歌词。音效方面转场的时候可以加一个“嗖”的声音但别加太多否则显得廉价。7. 扩展方向与个人经验分享这套方案目前能稳定处理干货类和资讯类文章但故事类文章的效果还不太理想。原因是故事需要情绪起伏而TTS的语调变化有限。我试过用SSML的prosody标签调整语速和音调但Edge TTS对prosody的支持不稳定有时候生效有时候不生效。下一步我打算试试用大语言模型给脚本标注情绪标签然后根据标签切换不同的TTS音色比如平静的段落用Xiaoxiao激动的段落用Yunjian。这个思路还在实验阶段等跑通了再分享。另外画面部分目前是纯色背景加文字比较单调。我试过用FFmpeg的zoompan滤镜给背景图加缓慢缩放效果看起来会生动一些ffmpeg -loop 1 -i background.jpg -filter_complex zoompanzmin(zoom0.001,1.5):d125:s1920x1080 -t 5 output/zoom.mp4这个命令会让背景图在5秒内缓慢放大到1.5倍适合做视频的开场。但注意d参数是帧数如果视频是25帧每秒5秒就是125帧。这个效果对静态图片有效如果背景是纯色缩放看不出来所以建议用有纹理的图片。最后说一个我踩过的坑Edge TTS生成的音频在某些播放器上会有“爆音”尤其是音量突然升高的地方。解决办法是在FFmpeg合成时加一个loudnorm滤镜做响度归一化ffmpeg -i audio.mp3 -af loudnormI-16:TP-1.5:LRA11 output/audio_normalized.mp3I-16是目标响度TP-1.5是最大峰值LRA11是响度范围。这三个参数是视频号平台的推荐值加了这个滤镜之后音频听起来会平稳很多不会忽大忽小。这个细节在官方文档里不会写但实际发布时能明显感觉到差别。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进