Lazywang's Tech Blog
Lazywang's Tech Blog

用 AI 给《小小世界》配上赵忠祥的声音

起因

Apple TV+ 出品的《小小世界》(Tiny World)是一部极度精美的微观自然纪录片,4K 画质令人叹为观止。视频自带简体中文字幕,对我来说看字幕完全没问题——但孩子还不识字,没有配音就没法看。

官方无中文配音,于是我决定自己动手:用 AI 把字幕读出来,配上中国人最熟悉的纪录片声音——赵忠祥。

整体架构

系统以视频文件和字幕文件为输入,输出一个含中文配音音轨的新 MKV,全程本地运行,无需联网。

输入
原始视频 (MKV 4K) + SRT 字幕
Step 0
ffmpeg 提取英文音轨
Step 1
Demucs 人声分离 → 保留纯背景音效
Step 2
SRT 字幕解析 → 时间戳 + 文本序列
Step 3
Qwen3-TTS 逐条生成配音 clip
Step 3b
Qwen3-ASR 逐条验证配音质量
Step 4
clip 有效性检测
Step 5
按时间戳拼装完整配音音轨
Step 6 — 输出
背景音 + 配音混音 → 封装回 MKV

每个步骤独立成脚本,中间产物落盘,可以从任意步骤重跑。

关键模块设计

🎙️ 音色克隆

Qwen3-TTS-1.7B ICL 模式:提供 16 秒赵忠祥参考音频 + 精确转录,模型即可用该音色合成任意文本。

⏱️ 语速控制

游标推后策略:TTS 以自然语速生成,字幕间停顿自动消化累积偏移,保持从容旁白感。

🎧 背景音增益

动态 RMS 匹配:实测两路信号 RMS,自动计算增益,混音结果配音略高于背景。

✅ ASR 验证

闭环自检:Qwen3-ASR 转写回文字做字符匹配,匹配率 < 0.5 自动重新生成。

音色克隆细节

TTS 引擎选用阿里巴巴开源的 Qwen3-TTS-1.7B-Base,通过 ICL(In-Context Learning) 模式实现声音克隆:向模型提供一段约 16 秒的参考音频和对应的精确转录文本,模型即可用该音色合成任意文本。

参考音频来自赵忠祥先生的《人与自然·鳄鱼最后的晚宴》片段,经 Demucs 去除背景音乐后截取。TTS 服务以 OpenAI 兼容 API 形式运行在本地(port 8880),由主程序在流水线开始时自动启动、结束后自动关闭。

游标推后策略

字幕的显示时间窗口(平均 2.8 秒)往往比 TTS 自然语速所需时间短。传统做法是用变速(atempo)把音频压进窗口,但这会导致语速异常快,失去旁白该有的从容感。

本项目采用游标推后策略:TTS 以自然语速生成,若某条音频超出对应字幕窗口,后续字幕的音频统一顺延,字幕间的较长停顿则自动消化累积偏移,使音画整体保持对齐:

时间 → 0s 3s 5s 8s 25s 32s │ │ │ │ │ │ 字幕窗口: [█E01█] [█E02█] [███E03████] 3s 3s ← 17s 无字幕 → 7s TTS 生成: [██E01███] [██E02███] [█E03█] 4.5s 4.5s 3s ↑ 超出窗口 1.5s 拼装结果: [██E01███][██E02███] [█E03█] ↑ ↑ E02 紧跟 E01 播完 17s 间隙吸收了 3s 偏移 (推后 1.5s) E03 归位(仅剩 0s 偏移)

动态 RMS 匹配

Demucs 分离出的背景音轨振幅比原始音频低 40–70%,直接混音会让背景音显得很弱。系统在混音前实测两路信号的 RMS,动态计算增益系数:

目标:背景 RMS = 配音 RMS × 0.9 增益 = 目标背景 RMS / 实测背景 RMS

这样无论背景音的原始电平如何,混音结果总能保持配音略高于背景的层次感。

ASR 闭环自检

每条 TTS 生成后,用 Qwen3-ASR-0.6B 转写回文字,与原字幕做字符集匹配。匹配率低于 0.5 或检测到静音,则标记为失败,可用 --retry 参数自动删除并重新生成。这形成了一个生成→验证→修复的闭环。

批量并行处理

单视频处理完成后,把全季都处理了是自然而然的需求。系统支持批量模式:

uv run main.py --batch input/s1/

执行逻辑:

  • nvidia-smi 自动检测 GPU 数量 N
  • 启动 N 个 TTS 服务实例(各占一个端口:8880、8881…)
  • 视频按 GPU 轮转分配,ProcessPoolExecutor 并行处理
  • 每个视频用独立子目录隔离中间产物,互不干扰

GPU 绑定通过 CUDA_VISIBLE_DEVICES 环境变量实现,每个子进程只能看到分配给它的一张卡,Demucs、TTS、ASR 全部在该卡上运行。

RTX 4080 SUPER
6 集
第一季完整
14 min
全流程耗时

性能数据

单集(30 分钟,~185 条字幕)处理耗时:

步骤耗时速度
Demucs 人声分离20 秒90× 实时
TTS 生成3.5 分钟RTF ≈ 0.41
ASR 验证43 秒
拼装 + 混音 + 封包< 10 秒
合计~5.5 分钟

输出 4K 原画质 MKV(~1.5GB),可选用全 GPU 流水线(NVDEC + scale_cuda + NVENC)压缩至 1080p(11.4× 实时,~2.5 分钟)。

技术栈

组件选型
TTS 引擎Qwen3-TTS-1.7B-Base(阿里开源)
TTS 服务faster-qwen3-tts(OpenAI 兼容 API)
声音克隆ICL 模式 + 赵忠祥《人与自然》参考音频
人声分离Demucs htdemucs(Meta 开源)
ASR 验证Qwen3-ASR-0.6B(阿里开源)
视频处理ffmpeg(NVDEC + NVENC 全 GPU 流水线)
包管理uv
并行调度ProcessPoolExecutor + CUDA_VISIBLE_DEVICES

一个延伸思考

有人会问:有了 AI,为什么还需要字幕?直接把英文音频翻译成中文不就好了?

这里有一个被低估的问题:视觉信息对语音内容有消歧作用

  • 同音词:bear(熊)vs bare(裸露)——画面一眼明确,纯音频无法区分
  • 多义词:"The pride moves across the plain"pride = 狮群 or 骄傲,plain = 平原 or 朴素——看到画面是狮子,答案立刻清晰

对于纪录片里大量的物种名、地名,ASR 转写后可能已经面目全非,翻译也跟着错。解决这个问题需要引入多模态 LLM(视频帧 + 音频转写同时输入),成本远高于直接使用人工字幕。

人工字幕是目前最优解——字幕本身已完成了视觉辅助消歧这一步,信息最完整、质量最高。

注:参考音频为赵忠祥先生的真实配音片段,仅用于个人学习研究目的。

Lazywang's Tech Blog

用 AI 给《小小世界》配上赵忠祥的声音
起因 Apple TV+ 出品的《小小世界》(Tiny World)是一部极度精美的微观自然纪录片,4K 画质令人叹为观止。视频自带简体中文字幕,对我来说看字幕完全没问题——但孩子还不识字,没有配音就…
扫描二维码继续阅读
2026-05-23