- name
- video-dubbing
- description
- 视频多语言配音工具链。将英文视频/音频转换为中文字幕并完成AI语音克隆配音。
当用户提到"视频配音"、"配音clone"、"中文配音"、"语音克隆"、"video dubbing"、"多语言配音"时触发此skill。
适用于视频国际化、多语言内容发布、播客配音等场景。
- tags
- ["video","dubbing","voice-clone","subtitle","translation","ai-voice","i18n"]
# 视频多语言配音工具链
将英文视频/音频自动转换为中文字幕并完成AI语音克隆配音的完整工作流。
## 何时使用
- 用户要求将英文视频转为中文字幕
- 需要为视频生成中文配音(语音克隆)
- 多语言视频内容制作
- 播客/课程/教程的国际配音
- 已有音频文件需要转录+翻译+配音
## 前置条件
确保以下CLI工具已全局安装:
```bash
# 1. 字幕提取(火山引擎语音识别)
pip install volcengine # 或全局安装 volc-srt
# 2. 音频切片
cd cutaudio && npm install -g
# 3. AI语音克隆(VoxCPM2)
cd voxclone && npm install -g
# 4. 视频下载(YouTube)→ 使用 youtube-downloader skill
# 见步骤1,自动通过 CDP + PoToken 绕过反爬
# 5. 音频提取
# getaudio依赖ffmpeg
# 6. 视频处理工具(removeaudio, align-video, subburn)
# 这些工具依赖ffmpeg,请确保ffmpeg已安装并加入PATH
```
**系统要求**:
- Python 3.10+
- ffmpeg(音频处理)
- youtube-downloader skill(YouTube 视频下载,替代直接 yt-dlp)
- CUDA GPU(推荐,用于语音克隆)
- 火山引擎API Key(语音识别)
## 工作流程
### 概览
```
YouTube URL → [youtube-downloader skill] → 视频文件
↓
[getaudio] → 音频文件
↓
英文音频 → [volc-srt] → 英文字幕(带说话人)
↓
[翻译+合句] → 配音优化版字幕(时间轴已合并)
↓ ↓
[cutaudio] ← ─────────┘ 按合并时间轴切片
↓
[voxclone] → 中文配音克隆(完整句子+数字转文字)
↓
[removeaudio] → 无声视频
↓
[align-video] → 配音视频(fade + 24kHz)
↓
[getaudio] → 对齐后音频
↓
[volc-srt] → 最终字幕
↓
[subburn] → 字幕视频
```
### 步骤 1:下载 YouTube 视频
使用 **youtube-downloader skill** 下载视频。该 skill 自动处理认证问题
(通过 Chrome CDP 提取 cookies + bgutil PoToken 绕过反爬):
```bash
# youtube-downloader skill 自动执行:
# 1. 启动 bgutil PoToken 服务(端口 4416)
# 2. 启动 Chrome CDP 从预登录 profile 提取 cookies
# 3. 用 yt-dlp + cookies + PoToken 下载视频
```
**示例**:
对用户来说,只需提供 YouTube URL,skill 自动处理整个下载链:
```
为这个视频配音:https://www.youtube.com/watch?v=WIrDQYGpIbg
```
**输出**:视频文件保存为 `video.mp4`
**工作原理**:youtube-downloader skill 会:
1. 确保 `bgutil-start` 服务在 4416 端口运行
2. 启动 Chrome(使用 `G:\chrome_data\remote_debug` 预登录 profile)开启 CDP
3. 通过 CDP `Network.getCookies` 提取 YouTube 认证 cookies
4. 转换为 Netscape 格式供 yt-dlp 使用
5. 执行 `yt-dlp URL --cookies cookies.txt` 下载视频
> ⚠️ 不再直接使用 `yt-dlp URL` 命令。
> 当 yt-dlp 提示 "Sign in to confirm you're not a bot" 或 DPAPI 错误时,
> youtube-downloader skill 自动处理认证问题。
---
### 步骤 2:提取音频(含人声/背景音分离)
使用 `getaudio` 从视频中提取音频,推荐开启人声分离:
```bash
getaudio <视频文件路径> [-o <输出音频路径>] [--separate]
```
**示例**:
```bash
# 推荐:提取并分离人声/背景音
getaudio test/video.mp4 -o test/video.mp3 --separate
# 输出三个文件:
# video.mp3 — 全频音频
# video_vocals.mp3 — 纯净人声(给 volc-srt 和 cutaudio 用)
# video_bgm.mp3 — 背景音乐(最终混音用)
```
**参数说明**:
- `input`: 输入视频文件路径(位置参数,不需要 `-i`)
- `-o, --output`: 输出音频文件路径
- `--separate`: 启用 Demucs 人声/背景音分离(默认关闭,配音推荐开启)
- `--model <name>`: Demucs 模型(默认 htdemucs_ft)
---
### 步骤 3:提取英文字幕
使用 `volc-srt` 将音频转为SRT字幕文件:
```bash
volc-srt <音频文件路径> -o <输出字幕路径> -f srt
```
**示例**:
```bash
# 使用纯净人声(video_vocals.mp3),而非全频音频,提升识别准确度
volc-srt test/video_vocals.mp3 -o test/video_en.srt --max-chars 100
```
**参数说明**:
- `audio`: 音频文件路径(mp3/wav/flac等)
- `-o, --output`: 输出字幕路径(默认与音频同名)
- `-f, --format`: 输出格式(srt/vtt/txt,默认srt)
- `--speaker`: 说话人分离(默认开启,自动识别多人对话,10人以内效果好)
- `--no-speaker`: 禁用说话人分离(单说话人场景可用,略快)
- `--no-punc`: 禁用自动标点(不建议)
**环境变量**(可选):
```bash
set VOLC_API_KEY=your_api_key # 优先使用环境变量配置API Key
```
**预期输出**:
- 有效SRT文件,包含连续序号、时间轴和文本
- 时间格式:`HH:MM:SS,mmm --> HH:MM:SS,mmm`
- 常见时长:10分钟音频约100-150条字幕
**常见问题**:
- API超时:增加 `--timeout 300` 参数
- 识别质量差:检查音频是否清晰,避免背景音乐过大
---
### 步骤 4:翻译为中文字幕
使用 **srt-translator skill** 进行翻译:
```bash
# 自动触发skill模式
/srt-translator test/video_en.srt --target-lang zh
```
**或手动执行**:
1. 读取SRT文件并解析
2. 提取专业术语,生成术语表
3. 用 merge_srt.py 预处理:计算合并组 + 数字批量转换
4. 分批次翻译合并后的条目(每批40-60条,可并行)
5. 输出最终配音优化版 `video_zh_dub.srt`
**翻译要求**:
- 保持时间轴格式完全不变
- 口语化、自然流畅
- 单行不超过40个中文字符
- 技术术语统一(参考术语表)
- ⚠️ 数字必须转文字(2%→百分之二,防止TTS念错)
- ⚠️ 语义不截断(半截句子合并)
- ⚠️ 同人不截断(间隙<300ms的连续语句合并)
**预期输出**:
- `video_zh_dub.srt`: 配音优化版(已合句+数字转文字,供 voxclone 使用)
- `video_glossary_zh.md`: 术语对照表
> ⚠️ 不在此步输出原版字幕,因为后续 align-video 会导致时间戳漂移。
> 烧字幕用的字幕在步骤11由 volc-srt 重新生成。
---
### 步骤 5:音频切片(获取参考音频)
使用 `cutaudio` 按**配音优化版字幕**(已合句)的时间轴将原音频切片:
> ⚠️ 不能按原版英文字幕切!翻译时会合并字幕条目(460→186),时间轴已变化。
> 必须用合并后的时间轴切,保证切片数量和顺序与 voxclone 字幕一一对应。
```bash
cutaudio -s <配音优化版字幕文件> -a <原音频文件> -o <输出目录> [--no-separate]
```
**示例**:
```bash
# 用配音优化版字幕(已合句)的时间轴来切,使用纯净人声作为参考音频
# cutaudio 会自动给每个切片加 80ms 前/160ms 后 padding,给 VoxCPM2 更多上下文
cutaudio -s test/video_zh_dub.srt -a test/video_vocals.mp3 -o test/audio_clips --no-separate
```
**参数说明**:
- `-s, --srt`: 配音优化版字幕路径(`video_zh_dub.srt`,不要用 `video_en.srt`)
- `-a, --audio`: 音频文件路径(mp3/wav/flac,必需)
- `-o, --out`: 输出目录(默认:`./output`)
- `--no-separate`: 跳过人声分离(如果音频已是纯净人声)
**重要提示**:
- 切片数量应与 `video_zh_dub.srt` 条目数一致
- **默认输出格式为 .mp3**,但 `voxclone` 要求 **.wav 格式**
**预期输出**:
```
audio_clips/
├── 0001.mp3
├── 0002.mp3
├── ...
└── 0321.mp3
```
---
### 步骤 6:格式转换(MP3 → WAV)
**关键步骤**:voxclone 只接受 `.wav` 格式参考音频
使用 ffmpeg 批量转换:
```bash
# Windows PowerShell
$clips = Get-ChildItem audio_clips/*.mp3
foreach ($clip in $clips) {
$wavPath = $clip.FullName -replace '\.mp3$', '.wav'
ffmpeg -i $clip.FullName -ar 16000 -ac 1 $wavPath -y 2>$null
}
# Linux/macOS
for f in audio_clips/*.mp3; do
ffmpeg -i "$f" -ar 16000 -ac 1 "${f%.mp3}.wav" -y
done
```
**参数说明**:
- `-ar 16000`: 采样率16kHz(VoxCPM2推荐)
- `-ac 1`: 单声道
- `-y`: 覆盖已存在文件
**验证**:确保 `.wav` 文件数量与字幕条数完全一致。
---
### 步骤 7:中文配音克隆
使用 `voxclone` 生成中文配音(注意使用配音优化版字幕):
```bash
voxclone dub -s <配音优化版字幕文件> [-a <参考音频目录>] -o <输出目录> [options]
```
**示例**:
```bash
# 语音克隆模式(提供参考音频)
voxclone dub -s test/video_zh_dub.srt -a test/audio_clips -o test/dubbed_output --device cuda --steps 10
# Voice Design 模式(无参考音频,纯文本合成)
voxclone dub -s test/video_zh_dub.srt -o test/dubbed_output --voice-style "沉稳男性声音"
```
**参数说明**:
- `-s, --subtitles`: 配音优化版字幕路径(`video_zh_dub.srt`)
- `-a, --audio-dir`: 参考音频切片目录(包含 `.wav` 文件,语音克隆模式需要)
- `--voice-style`: Voice Design 风格描述(与 `-a` 互斥,如 "沉稳男声")
- `-o, --output`: 输出目录(默认:`output_dubbed`)
- `--device`: 计算设备(`cuda`/`cpu`,默认cuda)
- `--steps`: 推理步数(默认10,越高越好但越慢)
- `--guidance-scale`: 引导强度(默认2.0)
- `--python-env`: Python 解释器路径(默认自动检测,VoxCPM2 需要特定环境)
- `--model`: VoxCPM2 模型 ID(默认 `openbmb/VoxCPM2`)
- `--denoise`: 对参考音频降噪
- `--normalize`: 文本归一化
**Voice Design 模式**(无需参考音频):
```bash
voxclone dub -s test/video_zh_dub.srt -o test/dubbed_output --voice-style "沉稳男性声音" --steps 10
```
**重要提示**:
- 必须使用 `video_zh_dub.srt`(配音优化版),不要用原版
- VoxCPM2 输出 48kHz 高品质音频,内置 fade + RMS 归一化
- VoxCPM2 比 OmniVoice 音质更好,tokenizer-free 连续表示
**预期输出**:
```
dubbed_output/
├── 0001.wav
├── 0002.wav
├── ...
└── 0321.wav
```
---
### 步骤 7:去除原视频音频
使用 `removeaudio` 获取无声视频:
```bash
removeaudio <视频文件路径> [-o <输出视频路径>]
```
**示例**:
```bash
removeaudio test/video.mp4 -o test/video_no_audio.mp4
```
**参数说明**:
- `input`: 输入视频文件路径(位置参数,不需要 `-i`)
- `-o, --output`: 输出无声视频文件路径(默认:`input_no_audio.<ext>`)
- `-y`: 覆盖已存在文件
---
### 步骤 8:对齐音频和视频
使用 `align-video` 将配音后的音频与无声视频对齐:
```bash
align-video <中文字幕路径> <视频路径> <配音音频目录> <输出视频路径>
```
**示例**:
```bash
# 两级变速对齐默认开启(全局+局部双调,防止极端变速导致音质劣化)
# 如需关闭:--no-adaptive-speed
align-video test/video_zh_dub.srt test/video_no_audio.mp4 test/dubbed_output test/aligned.mp4
```
**参数说明**(位置参数):
1. `srt`: 配音优化版字幕(`video_zh_dub.srt`)
2. `video`: 无声视频路径
3. `dubbed_dir`: 配音音频切片目录
4. `output`: 输出对齐后的视频路径
**可选参数**:
- `--workers`: 并发线程数(默认4)
- `--resume`: 断点续传
- `--rife`: 使用 RIFE GPU 插帧
- `--adaptive-speed`: 启用两级变速对齐(默认关闭)
- `--audio-stretch`: 旧版音频拉伸模式
- `--scene-snap`: 智能场景边界对齐
**可选参数**:
- `--workers`: 并发处理线程数(默认4)
- `--resume`: 断点续传(从上次中断处继续)
- `--no-audio-stretch`: 禁用音频拉伸
- `--scene-snap`: 智能场景边界对齐
- `--rife`: 使用 RIFE GPU 插帧(默认关闭)
**重要提示**:
- 确保字幕时间轴与视频画面匹配
- 对齐后的视频会自动匹配原始视频时长
- 处理时间较长,支持断点续传(`--resume`)
---
### 步骤 9:混入背景音乐
将保留的背景音以 30% 音量混入配音视频,掩盖片段衔接痕迹:
```bash
ffmpeg -i test/aligned.mp4 -i test/video_bgm.mp3 \
-filter_complex "[0:a]volume=1.0[a0];[1:a]volume=0.30[a1];[a0][a1]amix=inputs=2:duration=longest:normalize=0[aout]" \
-map 0:v -map "[aout]" -c:v copy -c:a aac -b:a 192k test/aligned_with_bgm.mp4 -y
```
> 背景音来自步骤2的 `--separate` 输出 (`video_bgm.mp3`)。
> 如果步骤2未开启 `--separate`,跳过此步。
---
### 步骤 10:提取对齐后的音频
align-video 处理后配音位置和时间戳已变化,必须重新提取音频:
```bash
getaudio <对齐后的视频路径> -o <输出音频路径>
```
**示例**:
```bash
getaudio test/aligned.mp4 -o test/aligned_dubbed.wav
```
---
### 步骤 10:提取最终字幕
从对齐后的音频重新获取字幕(时间戳已变化):
```bash
# --max-chars 20: 适合字幕显示,避免单行过长
# --no-speaker: 不输出说话人标记(最终字幕是给人看的,不需要 [说话人1])
volc-srt <对齐后的音频路径> -o <输出字幕路径> --max-chars 20 --no-speaker
```
**示例**:
```bash
volc-srt test/aligned_dubbed.wav -o test/final.srt --max-chars 20 --no-speaker
```
> ⚠️ 这里的参数与步骤3不同:
> - `--max-chars 20`(步骤3是100):最终字幕要分行显示,字符数越少越好
> - `--no-speaker`(步骤3是默认开启):最终字幕不需要 [说话人X] 标记
---
### 步骤 11:烧制字幕到视频
使用 `subburn` 将翻译后的字幕烧制到视频上:
```bash
subburn <视频路径> <字幕路径> [输出路径]
```
**示例**:
```bash
subburn test/dubbed_video.mp4 test/video_zh.srt test/final_dubbed_video.mp4
```
**参数说明**(位置参数):
1. `video`: 输入视频文件路径
2. `srt`: 字幕SRT文件路径
3. `output`: 输出带字幕的视频路径(默认自动生成)
---
### 步骤 6(可选):合并配音片段
如果需要合并为完整音频:
```bash
# 使用ffmpeg合并(按文件名排序)
ffmpeg -f concat -safe 0 -i <(for f in dubbed_output/*.wav; do echo "file '$PWD/$f'"; done) -c copy final_dubbed.wav
```
---
## 完整工作流示例
```bash
# 1. 下载YouTube视频(使用 youtube-downloader skill,自动处理认证)
Ver en GitHub