前言
作为一个短视频爱好者,我一直希望能有一个"每日自动生成视频"的工具------每天早晨起来,就能看到一条包含当日新闻或正能量的短视频,同时还能练习RISC-V平台的应用开发。经过几天的折腾,我终于在昉星光2上实现了这一目标。
本教程将完整记录我走过的每一步,包括踩过的坑和解决方案。无论你是RISC-V爱好者,还是想尝试DIY短视频自动化的朋友,这篇文章都能让你少走弯路。
硬件与环境准备
1. 硬件清单
-
昉星光2 (VisionFive 2),建议4GB以上内存版本
-
高速MicroSD卡(至少16GB,建议Class 10以上)
-
电源适配器(USB-C,5V/3A)
-
网络连接(有线或无线均可)
2. 软件需求
-
Python 3.11+
-
FFmpeg(视频处理)
-
Edge TTS(语音合成,可选百度TTS备用)
-
Requests(网络请求)
📦 第一步:基础环境配置
1. 更新系统并安装基础工具
sudo apt update
sudo apt upgrade -y
sudo apt install -y ffmpeg python3-pip python3-venv curl wget
2. 创建Python虚拟环境(推荐,避免依赖冲突)
cd ~
mkdir -p agent_system
cd agent_system
python3 -m venv venv
source venv/bin/activate
以后每次操作前,记得激活虚拟环境:
source ~/agent_system/venv/bin/activate
3. 安装Python依赖包
pip install edge-tts requests pillow
说明 :
edge-tts是微软免费的TTS库,支持多种中文语音,且无需API密钥。requests用于调用新闻API,pillow仅用于文本绘制(本教程最终方案中未使用,但保留以备后续扩展)。
第二步:生成第一个纯静态视频(测试环境)
我们先制作一个最简单的视频:显示当前日期,时长5秒,用于验证FFmpeg和基础Python环境。
创建脚本 ~/make_simple_video.py:
import datetime
import subprocess
import os
today = datetime.datetime.now().strftime("%Y年%m月%d日")
text = f"Hello 昉星光!\n今日日期:{today}"
# 用ffmpeg的drawtext滤镜生成带文字的视频(无需PIL)
# 这里我们直接生成一个蓝色背景的视频,文字居中
output_path = os.path.expanduser("~/videos/simple_video.mp4")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
cmd = [
"ffmpeg", "-y",
"-f", "lavfi",
"-i", "color=c=blue:s=1280x720:d=5",
"-vf", f"drawtext=text='{text}':fontcolor=white:fontsize=80:x=(w-text_w)/2:y=(h-text_h)/2",
"-c:v", "libx264",
"-pix_fmt", "yuv420p",
output_path
]
subprocess.run(cmd, check=True)
print(f"视频生成成功:{output_path}")
运行:
python ~/make_simple_video.py
生成后,用WinSCP(后面会讲)将视频下载到电脑播放,检查是否正常。
第三步:使用WinSCP管理文件
由于昉星光2通常无图形界面,我们通过SSH操作,但查看视频文件需要文件传输工具。推荐 WinSCP(Windows)
常见问题:为什么WinSCP看不到文件?
-
原因 :WinSCP默认打开的目录可能是
/root,而我们的文件在/home/user下。 -
解决 :在WinSCP地址栏直接输入
/home/user/videos并回车,然后按F5刷新。
如果仍然看不到,可能是权限问题,执行:
chmod 777 /home/user/videos -R
(学习环境下可以使用,生产环境建议更严格权限)
第四步:加入语音合成(TTS)
接下来,我们让视频带上语音播报。使用 edge-tts,将文案转为MP3音频。
创建一个新脚本 ~/make_audio_video.py,包含语音生成和背景视频合成:
import os
import sys
import datetime
import subprocess
import asyncio
# 注意:edge-tts需要异步调用,我们在子进程中处理
def generate_speech(text, output_mp3="/tmp/speech.mp3"):
script = f'''
import asyncio
import edge_tts
async def main():
await edge_tts.Communicate("{text}", "zh-CN-XiaoxiaoNeural").save("{output_mp3}")
asyncio.run(main())
'''
with open("/tmp/tts_temp.py", "w") as f:
f.write(script)
subprocess.run([sys.executable, "/tmp/tts_temp.py"], check=True)
return output_mp3
# 文案
today = datetime.datetime.now().strftime("%Y年%m月%d日")
text_main = f"大家好,今天是{today},欢迎收看今日快讯。"
# 生成语音
audio_file = generate_speech(text_main)
# 获取语音时长
dur_cmd = ["ffprobe", "-i", audio_file, "-show_entries", "format=duration", "-v", "quiet", "-of", "csv=p=0"]
dur = float(subprocess.check_output(dur_cmd).decode().strip())
print(f"语音时长:{dur:.2f} 秒")
# 生成动态背景(色相缓慢变化)
bg_video = "/tmp/background.mp4"
cmd_bg = [
"ffmpeg", "-y",
"-f", "lavfi",
"-i", f"color=c=blue:s=1280x720:r=25:d={dur}",
"-vf", f"hue=H=0.5*PI*t/{dur}:s=1",
"-c:v", "libx264",
"-pix_fmt", "yuv420p",
bg_video
]
subprocess.run(cmd_bg, check=True)
# 合并音视频
output_path = os.path.expanduser("~/videos/audio_video.mp4")
cmd_merge = [
"ffmpeg", "-y",
"-i", bg_video,
"-i", audio_file,
"-c:v", "copy",
"-c:a", "aac",
"-shortest",
output_path
]
subprocess.run(cmd_merge, check=True)
# 清理
os.remove(audio_file)
os.remove(bg_video)
os.remove("/tmp/tts_temp.py")
print(f"✅ 带语音视频生成成功:{output_path}")
运行:
bash
python ~/make_audio_video.py
你会得到一个约10秒的视频(取决于文案长度),包含语音播报和动态背景。
第五步:接入新闻API,生成每日新闻播报
现在我们让文案不再是固定的,而是从网络获取当天的新闻简报。这里使用 60s API(无需注册,免费),它返回15条左右的简讯。
1. 获取新闻并格式化
修改前面的脚本,增加 get_news() 函数:
import requests
def get_news():
url = "https://60s.viki.moe/v2/60s?encoding=text"
try:
resp = requests.get(url, timeout=10)
if resp.status_code == 200:
lines = resp.text.strip().split('\n')
# 过滤掉标题行(以【开头)和空行
news = [line for line in lines if line.strip() and not line.startswith('【')]
if news:
top3 = news[:3] # 取前3条
today = datetime.datetime.now().strftime("%Y年%m月%d日")
prefix = f"各位听众,今天是{today},下面是今日新闻简报。"
body = "。".join([f"第{i+1}条,{item}" for i, item in enumerate(top3)])
return prefix + body
except Exception as e:
print(f"获取新闻失败:{e}")
# 备用文案
return "今天是美好的一天,愿您心情愉快,万事顺意。"
2. 完整脚本 ~/make_news_video.py
将上面的 get_news() 与之前的语音生成、背景合成整合在一起,并加入错误处理。
运行后,即可生成包含当日新闻的播报视频,时长约30~40秒。
第六步:设置定时任务,实现每日自动生成
使用 cron 实现每天早上7点自动运行脚本。
bash
crontab -e
添加一行(注意替换为实际路径):
text
0 7 * * * cd /home/user/agent_system && source venv/bin/activate && python /home/user/make_news_video.py >> /tmp/news_video.log 2>&1
这样每天7点会自动生成视频,文件保存在 ~/videos/daily_news_YYYYMMDD.mp4。你可以通过WinSCP随时取用。