视频配音+字幕+BGM一条龙。给视频配上AI语音旁白、烧录字幕、添加背景音乐。用户提供视频文件+配音脚本(Markdown),自动完成全流程。触发词:'/voiceover'、'配音'、'给视频配音'、'加字幕'、'加旁白'。
本地 GPU 配音 + FFmpeg 合成的全自动流水线。
| 工具 | 位置 | 用途 |
|---|---|---|
| CosyVoice2-0.5B | D:\AI-Tools\CosyVoice\ | 本地 TTS 配音(RTX 5080 GPU) |
| Python venv | D:\AI-Tools\CosyVoice\venv\Scripts\python.exe | CosyVoice 运行环境 |
| FFmpeg | 系统 PATH | 视频合并、字幕烧录、音频混合 |
| 音色 Key | 参考音频 | 适用场景 |
|---|---|---|
| narrator | asset/ref/zh_male_narrator.wav | 沉稳男声旁白 |
| deep | asset/ref/zh_male_deep.wav | 低沉男声 |
| sweet | asset/ref/zh_female_sweet.wav |
| 甜美女声 |
| angry | asset/ref/zh_female_angry.wav | 激昂女声 |
参考音频的 prompt_text(必须与参考音频内容匹配):
在这个宁静的夜晚,远处的灯火逐渐亮了起来,仿佛在诉说着一个关于希望的故事。唉,你看看这个情况,实在是让人心酸,我真的没有办法了。哎呀,这也太让人失望了吧,本来以为会很好的呢,结果全完了。我真的太生气了,这件事情绝对不能就这么算了,我一定要讨个说法!用户需要提供:
D:\xxx\video.mp4)如果用户没有配音脚本,先用 FFmpeg 获取视频信息,然后帮用户写脚本。
从 Markdown 中提取:
生成 Python 脚本并用 CosyVoice venv 执行:
"""配音生成脚本模板"""
import sys, os, time
sys.path.insert(0, '.')
sys.path.insert(0, 'third_party/Matcha-TTS')
import torch, soundfile as sf
from cosyvoice.cli.cosyvoice import CosyVoice2
model = CosyVoice2('pretrained_models/CosyVoice2-0.5B', load_jit=False, load_trt=False)
# 音色定义
VOICES = {
'narrator': {
'wav': 'asset/ref/zh_male_narrator.wav',
'text': '在这个宁静的夜晚,远处的灯火逐渐亮了起来,仿佛在诉说着一个关于希望的故事。',
},
'deep': {
'wav': 'asset/ref/zh_male_deep.wav',
'text': '唉,你看看这个情况,实在是让人心酸,我真的没有办法了。',
},
'sweet': {
'wav': 'asset/ref/zh_female_sweet.wav',
'text': '哎呀,这也太让人失望了吧,本来以为会很好的呢,结果全完了。',
},
'angry': {
'wav': 'asset/ref/zh_female_angry.wav',
'text': '我真的太生气了,这件事情绝对不能就这么算了,我一定要讨个说法!',
},
}
# SCENES = [(文件名, 台词, 音色key, 语速), ...]
# 根据用户脚本填充
output_dir = '<项目输出目录>/配音'
os.makedirs(output_dir, exist_ok=True)
for idx, (filename, tts_text, voice_key, speed) in enumerate(SCENES, 1):
voice = VOICES[voice_key]
for result in model.inference_zero_shot(
tts_text,
prompt_text=voice['text'],
prompt_wav=voice['wav'],
stream=False,
speed=speed,
):
audio = result['tts_speech'].squeeze().cpu().numpy()
sf.write(f'{output_dir}/{filename}.wav', audio, model.sample_rate)
执行命令:
cd D:/AI-Tools/CosyVoice && D:/AI-Tools/CosyVoice/venv/Scripts/python.exe <脚本路径>
关键注意事项:
venv/ 不是 .venv/cd D:/AI-Tools/CosyVoice 后再执行(模型路径是相对路径)用 FFmpeg adelay + amix 将多段配音按时间轴合并为一条音轨:
ffmpeg -y \
-i clip1.wav -i clip2.wav ... \
-filter_complex \
"[0:a]adelay=1000|1000[a0]; [1:a]adelay=4000|4000[a1]; ... \
[a0][a1]...amix=inputs=N:duration=longest[out]" \
-map "[out]" -ar 48000 merged_voice.wav
两种方式:
合成 BGM 模板见 merge_suzhou.py 中的 generate_bgm() 函数。
生成 SRT 字幕文件,长句拆分为每条 2-3 秒:
1