本文记录了我用 WorkBuddy 搭建"全球新闻速报"自动化视频生产线的完整过程。每天早上 8 点自动执行,AI 搜集 7 条全球热点新闻,自动生成 1080×1920 竖屏视频,包含真实配图、逐句字幕和 AI 配音,输出 MP4 直接发布到抖音/头条。
做短视频的同学都知道,新闻资讯类视频是抖音的流量密码——信息密度高、完播率好、容易出爆款。但每天手动找新闻、写文案、配图、配音、剪辑,至少要花 2-3 小时。
我的目标很简单:让 AI 替我干这些脏活。每天自动产出一条 1-2 分钟的全球新闻速报视频,我只需要最后审核一下就能发布。
最终效果:每条视频 7 条新闻,1080×1920 竖屏,真实新闻配图 + 半透明遮罩,逐句字幕跟随 AI 配音,云扬男声 -5% 语速。
组件 | 用途 |
|---|---|
WorkBuddy | AI 对话 + 自动化调度 + 代码生成 |
Python | 核心视频生成脚本 |
Pillow | 逐帧渲染画面(标题、字幕、配图) |
edge-tts | 微软免费 TTS,中文云扬男声 |
FFmpeg | 帧序列合成视频 + 音频拼接 |
环境要求:
整条生产线分为 6 个步骤:
新闻采集 → 选题筛选 → 文案撰写 → 视觉渲染 → AI配音 → 视频合成在 WorkBuddy 中,我通过自动化任务(Automation)设置每天早上 8 点触发。WorkBuddy 会自动:
每条新闻包含以下字段:
NEWS_ITEMS = [
{
"category": "中东局势", # 分类标签
"title": "中东多国宣布战备状态...", # 标题(画面大字)
"bg_file": "Israeli_airstrike_*.png", # 匹配的背景图文件名
"content": "据路透社报道...", # 正文内容(画面滚动显示)
"tts_text": "据路透社报道..." # 配音文案(精简版)
},
# ... 共7条
]关键设计:content 是完整的新闻正文,用于画面显示;tts_text 是精简的配音版本,控制在 15 秒以内。两者分开是因为观众阅读速度和语速不同。
WIDTH, HEIGHT = 1080, 1920 # 竖屏 9:16
FPS = 30
# 配色方案
SUBTITLE_BG = (120, 27, 57) # 深红色字幕背景
TITLE_BG_TOP = (216, 188, 197) # 粉红渐变标题栏
TITLE_BG_BOT = (230, 205, 215)
RED_LABEL_BG = (165, 20, 48) # 分类标签红底
# 布局分区
TITLE_BAR_H = int(HEIGHT * 0.07) # 标题栏高度
CONTENT_H = int(HEIGHT * 0.76) # 内容区高度
SUBTITLE_H = int(HEIGHT * 0.10) # 底部字幕区画面从上到下分为四个区域:粉红渐变标题栏 → 配图+内容区(带半透明黑色遮罩)→ 深红底部装饰条 → 深红字幕条。
这是最容易踩坑的地方。我最初用顺序循环分配背景图,结果中东新闻配了个建筑图,完全对不上。
解决方案:给每条新闻手动指定 bg_file 字段。
# 背景图加载函数:优先使用新闻指定的图片
def load_bg_image(idx, bg_file=""):
# 1. 优先加载指定的背景图
if bg_file:
specified_path = os.path.join(BG_DIR, bg_file)
if os.path.exists(specified_path):
return _process_image(specified_path)
# 2. 兜底:按索引循环
fallback_idx = idx % len(BG_FILES)
return _process_image(BG_FILES[fallback_idx])图片处理流程:居中裁剪 → 缩放到 1080×1920 → 高斯模糊(radius=2,避免文字难以辨认)。
import edge_tts
async def generate_tts(text, output_path, rate="-5%"):
communicate = edge_tts.Communicate(
text,
"zh-CN-YunyangNeural", # 云扬男声
rate=rate # -5% 语速,新闻播报节奏
)
await communicate.save(output_path)踩坑记录:
-5%,太慢观众会划走,太快听不清字幕需要和配音同步变化。实现思路:将配音文案按标点拆分,根据音频时间戳计算当前应该显示哪句话。
def split_subtitle_sentences(text):
"""按标点拆分字幕,和配音内容完全一致"""
parts = re.split(r'[,,。!?;;!?、]', text.strip())
return [p.strip() for p in parts if p.strip()]
def get_subtitle_for_frame(sentences, timestamps, duration, frame_idx):
"""根据当前帧时间计算应显示的字幕"""
current_time = frame_idx / FPS
tts_end = timestamps[-1]["end"] if timestamps else duration
# 按字符比例分配每句的时间区间
total_chars = sum(len(s) for s in sentences)
elapsed = 0
for s in sentences:
char_ratio = len(s) / total_chars
dur = tts_end * char_ratio
end = elapsed + dur
if elapsed - 0.3 <= current_time < end + 0.2:
return s
elapsed = end
return sentences[-1]踩坑记录:最初字幕用的是单独的 subtitle 字段,和配音的 tts_text 内容不一致,导致观众看到字幕和听到的声音对不上。改为直接从 tts_text 拆分后问题解决。
每个新闻片段单独渲染后,用 FFmpeg concat 拼接:
# 1. 帧序列 → 片段视频
ffmpeg -y -framerate 30 -i f%05d.jpg -i audio.mp3 \
-c:v libx264 -preset fast -crf 20 -pix_fmt yuv420p \
-c:a aac -b:a 96k -shortest clip_00.mp4
# 2. 所有片段拼接
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy output.mp4每条新闻的首尾各 15 帧(0.5 秒)做亮度渐变,模拟淡入淡出:
TRANSITION_FRAMES = 15
for f in range(total_frames):
brightness = 1.0
if f < TRANSITION_FRAMES:
brightness = 0.15 + (f / TRANSITION_FRAMES) * 0.85 # 淡入
elif f >= total_frames - TRANSITION_FRAMES:
remaining = total_frames - f
brightness = 0.15 + (remaining / TRANSITION_FRAMES) * 0.85 # 淡出
frame = render_frame(idx, news, subtitle_text, brightness)在 WorkBuddy 中设置定时任务,每天早上 8 点自动执行:
关键点是 WorkBuddy 的对话上下文——它会记住之前的技术决策(比如 v3 视觉标准、配色方案),不需要每次重新指定。
指标 | 数值 |
|---|---|
分辨率 | 1080 × 1920(竖屏) |
帧率 | 30fps |
新闻数量 | 7 条/期 |
视频时长 | 1.5 - 2 分钟 |
文件大小 | 约 7 MB |
配音 | 云扬男声 -5% 语速 |
字幕 | 逐句跟随配音 |
背景 | 主题匹配真实图片 + 半透明遮罩 |
问题 | 原因 | 解决方案 |
|---|---|---|
背景图和新闻不匹配 | 按索引顺序分配图片 | 每条新闻指定 bg_file 字段 |
字幕和配音不同步 | subtitle 和 tts_text 内容不同 | 字幕直接从 tts_text 拆分 |
部分段无声音 | edge-tts 网络不稳定 | 3 次重试 + 静音降级兜底 |
视频文件过大 | JPEG quality=95 | 降到 88,文件减半画质无明显变化 |
字体在不同机器上缺失 | 硬编码字体路径 | 使用 Windows 自带微软雅黑 |
这个项目的核心价值在于:WorkBuddy 不只是一个聊天工具,而是一个可以自主执行复杂任务的 AI 助手。从新闻采集到视频生成,整个流程都是 WorkBuddy 帮我规划和执行的。我只需要在开始时提出需求,中间处理各种技术细节,最后审核成果。
如果你也在做短视频内容,强烈建议试试用 WorkBuddy 自动化那些重复性工作——把时间省下来思考内容创意,而不是把时间花在排版和剪辑上。
本文基于 WorkBuddy 实际项目经验撰写,所有代码均在 Windows 环境实测通过。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。