应用场景与解决方案

AI 自动生成带货短视频:用 ffmpeg 把商品图片、AI 配音和字幕合成 9:16 竖屏视频

6 个步骤 10 分钟阅读 15 次阅读 0
本文目录

商品短视频在 TikTok Shop、Shopee Video、Instagram Reels 和 YouTube Shorts 上都能带货,但每个商品都手工剪一条视频,商品一多就做不过来。本文在你的服务器上用一个小巧的 Python 脚本和 ffmpeg,把一个装有商品图片和简短配音文案的文件夹做成带 AI 配音、烧录字幕和可选背景音乐的 9:16 竖屏成品视频,然后一次批量生成数百个商品的视频。

只使用你拥有使用权的图片、音乐和字体。请按各平台的规定标注 AI 生成的配音;TikTok、YouTube 等平台都要求披露逼真的合成内容。

步骤 1:准备服务器

本文以用 Kokoro 生成 AI 配音为基础:请先按该教程配置好 /opt/tts 和 tts.py。然后安装中文和日文字幕所需的字体:

apt install -y ffmpeg fonts-noto-cjk
fc-list | grep -i "Noto Sans CJK" | head -3

步骤 2:每个商品准备一个文件夹

/data/videos/LS-01/
├── 01.jpg          # photos, shown in name order
├── 02.jpg
├── 03.jpg
├── script.txt      # narration, one subtitle line per line
└── music.mp3       # optional background music

步骤 3:创建视频脚本

cat > /opt/tts/makevideo.py <<'EOF2'
import os, subprocess, sys
import soundfile as sf

W, H, FPS = 1080, 1920, 30
FONT = os.environ.get("SUB_FONT", "Noto Sans CJK SC")
os.chdir(sys.argv[1])
images = sorted(f for f in os.listdir(".") if f.lower().endswith((".jpg", ".jpeg", ".png", ".webp")))
if not images:
    sys.exit("No photos found in " + os.getcwd())
per = sf.info("script.wav").duration / len(images)       # each photo stays on screen for an equal share

def ffmpeg(*args):
    subprocess.run(["ffmpeg", "-y", "-loglevel", "error", *args], check=True)

with open("clips.txt", "w") as lst:
    for i, img in enumerate(images):
        clip = f"clip{i:03d}.mp4"                           # photo centred on a blurred copy of itself, 9:16
        ffmpeg("-loop", "1", "-t", f"{per:.3f}", "-i", img, "-filter_complex",
               f"[0:v]split[a][b];[a]scale={W}:{H}:force_original_aspect_ratio=increase,crop={W}:{H},boxblur=20[bg];"
               f"[b]scale={W}:{H}:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2,format=yuv420p",
               "-r", str(FPS), "-c:v", "libx264", "-preset", "veryfast", "-crf", "20", clip)
        lst.write(f"file '{clip}'\n")

style = f"FontName={FONT},FontSize=11,Bold=1,Outline=2,Shadow=0,Alignment=2,MarginV=50"
inputs = ["-f", "concat", "-safe", "0", "-i", "clips.txt", "-i", "script.wav"]
if os.path.exists("music.mp3"):                             # optional background music, quietly under the voice
    inputs += ["-stream_loop", "-1", "-i", "music.mp3"]
    audio = "[2:a]volume=0.15[m];[1:a][m]amix=inputs=2:duration=first,loudnorm=I=-14:TP=-1.5[a]"
else:
    audio = "[1:a]loudnorm=I=-14:TP=-1.5[a]"
ffmpeg(*inputs, "-filter_complex", f"[0:v]subtitles=script.srt:force_style='{style}'[v];{audio}",
       "-map", "[v]", "-map", "[a]", "-c:v", "libx264", "-preset", "veryfast", "-crf", "20",
       "-pix_fmt", "yuv420p", "-c:a", "aac", "-b:a", "160k", "-ar", "48000", "-ac", "2", "-shortest", "-movflags", "+faststart", "video.mp4")
for f in ["clips.txt"] + [f"clip{i:03d}.mp4" for i in range(len(images))]:
    os.remove(f)
print("done:", os.path.abspath("video.mp4"))
EOF2

每张图片在画面中停留的时长相同,平分整段配音。图片居中叠放在它自身经过模糊处理的全屏副本上,因此横图和竖图都能铺满竖屏画面。随后脚本会拼接各个片段,加入配音和(如果有的话)低音量的背景音乐,烧录字幕,把响度标准化到约 -14 LUFS,最后输出 video.mp4。

步骤 4:生成第一条视频

cd /data/videos/LS-01
TTS_LANG=z TTS_VOICE=zf_xiaobei /opt/tts/bin/python /opt/tts/tts.py script.txt
/opt/tts/bin/python /opt/tts/makevideo.py /data/videos/LS-01

生成的是 1080x1920、30 fps 的 H.264 视频,音频为 AAC,各大短视频平台都支持这种格式。字幕位于画面底部稍上方,避开了大多数平台的按钮区域。如需日文字幕,请在运行第二条命令时加上 SUB_FONT="Noto Sans CJK JP"。要调整字幕大小或位置,请修改脚本中 style 这一行的 FontSize 和 MarginV。

步骤 5:批量生成整个商品目录

for d in /data/videos/*/; do
  [ -f "$d/video.mp4" ] && continue                    # skip products that are already done
  TTS_LANG=z TTS_VOICE=zf_xiaobei /opt/tts/bin/python /opt/tts/tts.py "$d/script.txt" &&
  /opt/tts/bin/python /opt/tts/makevideo.py "$d" || echo "FAILED: $d"
done

耗时较长的批量任务请用 nohup 或在 screen 中运行,这样退出登录后任务也会继续执行。在我们的测试中,一条 16 秒的视频渲染耗时约 5 秒;大部分时间花在视频编码上,因此多核 CPU 会有明显帮助。

步骤 6:发布前检查

  1. 每条视频都完整看一遍:读音错误、字幕错别字和裁切不当的图片都很容易发现。
  2. 检查背景音乐是否盖过了配音;如有需要,调低脚本中的 volume=0.15。
  3. 上传前确认各平台对视频时长、字幕和 AI 内容标注的最新要求。

常见问题

可以用短视频素材代替图片吗?

可以,但视频素材需要按同样的方式裁剪时长和缩放,这需要修改脚本。更简单的做法是按配音教程生成配音和 SRT 字幕,再在视频剪辑软件中与你的视频素材合成。

如何把同一条视频做成其他语言版本?

翻译 script.txt,然后换用该语言的音色运行这两条命令。对于已有的视频,请参阅用 AI 将视频翻译配音成其他语言。

中文字幕显示为空白方框

这是缺少字体导致的。请按步骤 1 安装 fonts-noto-cjk,并确认 fc-list 的输出中有“Noto Sans CJK SC”。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上服务器 IP、系统版本、文件夹结构和完整报错信息,方便工程师快速定位。

这篇文章有帮助吗?

相关教程