在昉星光2(RISC-V)上构建每日短视频自动生成器

前言

作为一个短视频爱好者,我一直希望能有一个"每日自动生成视频"的工具------每天早晨起来,就能看到一条包含当日新闻或正能量的短视频,同时还能练习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随时取用。

相关推荐
程序员老陆2 小时前
FFmpeg libswresample 模块的关键函数swr_convert 到底在干嘛?
ffmpeg·音视频·格式转换·音频重采样
csdnfanguyinheng2 小时前
端到端加密音视频通话系统
音视频
show43314 小时前
2026小程序端视频转文字技术对比:识别引擎精度实测
小程序·音视频
南山电子nscn17 小时前
国巨RT2512系列薄膜精密电阻在音频放大器中的应用及技术优势解析
音视频·薄膜精密电阻
starzy199019 小时前
Soloop 智能视频创作全流程实战指南
数据库·microsoft·音视频
xingyuzhisuan20 小时前
星宇智算 AI 视频工作台・图生视频(首尾帧)・Vidu:双模型可控动态过渡生成应用
人工智能·计算机视觉·音视频
zandy101121 小时前
全价位数字调音台横向解析:覆盖国产与进口机型,按预算、应用场景对照选型指南
音视频·数字调音台
AI服务老曹21 小时前
NVIDIA GPU部署AI视频分析常见问题和排查清单
人工智能·音视频
林澈在路上1 天前
可以用自己声音写歌的软件哪款好用 实测对比
大数据·人工智能·aigc·音视频·音频