SadTalker 出自西安交通大学、腾讯 AI Lab 与蚂蚁集团,论文《Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation》被 CVPR 2023 收录(arXiv 2211.12194)。它的思路和同期方案不太一样:不直接生成像素,而是先用 ExpNet 从音频回归出 3DMM 表情系数,再用 PoseVAE 单独采样头部姿态,最后经 MappingNet 交给一个 face-vid2vid 血统的 3D 感知渲染器出图。表情和姿态解耦,这就是为什么 SadTalker 的头会自然地转、会眨眼,而不是只有嘴在动——这一点它和只做唇形区域修补的 Wav2Lip、主打实时唇同步的 MuseTalk 是完全不同的路子。
需要坦白讲的是:这个仓库已经冻结了。GitHub 上 OpenTalker/SadTalker 有 1.4 万 star、2,600+ fork、600 多个未关闭的 issue,但主分支最后一次功能提交停在 2023 年 10 月,整个 OpenTalker 组织(video-retalking、StyleHEAT、DPE、ToonTalker)也一并沉寂。官方那个拿了 1,400+ 点赞的 Hugging Face Space 现在是 BUILD_ERROR 状态——连作者自己的演示环境都装不起来了。原因不复杂:requirements.txt 把 numpy 钉在 1.23.4、basicsr 钉在 1.4.2,README 让你用 Python 3.8 配 torch 1.12.1+cu113,而 Python 3.8 早已停止维护,新 CUDA 轮子根本不提供 cp38 包。所以 SadTalker 今天的真实难度不在模型,在于把 2023 年的依赖树重新拼起来。
好消息是,模型本身极轻。全套权重落盘约 3GB,渲染器 SadTalker_V0.0.2_256.safetensors 只有 691MiB,常驻显存的参数量大概 1.4GB。真正的成本是墙上时钟:输出固定 25fps,一分钟成片就是 1,500 帧,而 `--enhancer gfpgan` 是逐帧跑的,整条流水线九成时间都花在这里。换句话说,SadTalker 的选卡问题不是「显存装不装得下」,而是「哪张卡把这 1,500 帧渲完最便宜」。在 NexGPU 上,RTX 3090 24GB 每卡时 $0.193,一条一分钟带增强的口播视频算下来两分多美分;不满意就重开一台,计费按秒停。
01 —
版本、权重与显存实测
SadTalker 没有参数量档位,只有渲染分辨率、增强链路和预处理模式的组合——下面是每种组合的真实体积与占用
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| SadTalker V0.0.2 · 256(默认路径) | 渲染器 691MiB safetensors,全套权重约 3GB | fp32 推理 ~4GB(--batch_size 2) | 256×256 @ 25fps,音频时长不限 | `--size 256` 是默认值,也是最稳的一条路。口型和头部姿态的质量基准线就在这里,先用它跑通再谈画质。 |
| SadTalker V0.0.2 · 512(beta) | SadTalker_V0.0.2_512.safetensors,同为 691MiB | ~6GB(--batch_size 2),提到 8 约 8GB | 512×512 @ 25fps | 2023 年 6 月放出的 beta 渲染器。有意思的是 512 和 256 两个 safetensors 字节数完全一致(725,066,984),网络结构相同、只是训练分辨率不同,所以升到 512 几乎不额外吃权重显存。 |
| 叠加 GFPGAN / RestoreFormer 面部增强 | GFPGANv1.4.pth 约 350MB,另需 facexlib 检测与解析权重 | 在渲染基础上 +2~3GB,512 全链路约 8~10GB | 逐帧后处理,人脸细节可推到 1024 级 | `--enhancer gfpgan` 是画质提升最明显的一步,也是整条流水线最慢的一步。做批量生产时,它决定了你的单条成本。 |
| full / extfull 全身贴回模式 | 复用同一套渲染权重,无额外模型 | 随源图分辨率上升,1080p 半身图约 10~12GB;再开 `--background_enhancer realesrgan` 更高 | 输出尺寸等于原图尺寸 | `--preprocess full --still` 是做半身数字人口播的必选组合:只渲染裁剪出的人脸区域,再贴回原图,同时冻住头部大幅摆动以免贴回时穿帮。 |
| --old_version 旧权重路径 | facevid2vid_00189-model.pth.tar 单文件 1.97GiB | ~5~6GB | 256×256 @ 25fps | V0.0.2 之前的 .pth.tar 权重,比 safetensors 大一个数量级。只在复现旧结果、或 safetensors 加载异常时才需要它,常规部署不用下。 |
| 2024 年后的后继与替代方案 | 架构各异,多为扩散 / DiT 骨干 | 轻量的 LivePortrait、MuseTalk 8~12GB 可跑;Hallo2、EchoMimicV2 这类扩散方案一般 24GB 起 | 更长时长、更高分辨率、更强身份保持 | SadTalker 主分支停更后,社区重心转向了 LivePortrait(快手)、MuseTalk(腾讯 ARC)、EchoMimicV2(蚂蚁)、Hallo 系列(复旦)。它们效果更好但算力需求高一个量级——SadTalker 依然是「一张消费级卡、几分钟出片」这个生态位里最省的选择。 |
02 —
SadTalker 该租哪张卡
选卡看两件事:显存够不够开大 `--batch_size`,以及这张卡的 CUDA 架构能不能跑得动那套老 torch
照着 README 原样复现,预算压到最低
Tesla V100 32GB$0.188/卡·时
全站最便宜的一张卡,还带 32GB 显存;Volta 架构被 README 指定的 torch 1.12.1+cu113 原生支持,是唯一能把官方环境一字不改跑起来的选择。
512 + GFPGAN 批量出片,日常主力
RTX 3090 24GB$0.193/卡·时
Ampere sm_86,cu118 轮子完美覆盖;24GB 足够把 `--batch_size` 从默认 2 拉到 8~16,单位时间渲的帧数最多,每美元产出的成片最划算。
交付时间敏感,单条视频要最快出来
RTX 4090 24GB$0.540/卡·时
Ada sm_89,逐帧 GFPGAN 增强大约能比 3090 快一倍,单条耗时减半。代价是必须升到 torch 2.x + cu118 及以上,跑不了 cu113 那套老环境。
TTS + SadTalker + 后继模型串成一条流水线
RTX A6000 48GB$0.817/卡·时
48GB 可以让 GPT-SoVITS 或 CosyVoice 常驻显存直接喂音频给 SadTalker,同时并行开几个渲染 worker,省掉反复加载权重的开销。
03 —
从空实例到出片,四步
重点全在第二步——把 2023 年的依赖树拉回今天能装的状态
- 01
开实例、选预置镜像、拉代码
在 NexGPU 控制台开一台 Ampere 及以上的卡,镜像直接选 PyTorch 版本,省掉自己装驱动和 CUDA 的功夫。仓库本体只有几十兆,权重才是大头,稍后再下。
git clone https://github.com/OpenTalker/SadTalker.git && cd SadTalker - 02
建环境:Python 3.10 + torch 2.1.2,torchvision 必须钉 0.16.2
README 写的 Python 3.8 今天已经装不出来了。实测可用的组合是 Python 3.10 配 torch 2.1.2+cu118。torchvision 一定要钉在 0.16.2:0.17 删掉了 torchvision.transforms.functional_tensor,而 requirements.txt 里的 basicsr==1.4.2 恰好 import 它,这就是 SadTalker 安装环节出现频率最高的那个 ModuleNotFoundError。如果你因为别的原因必须用更新的 torchvision,就去 basicsr/data/degradations.py 把那行 import 从 functional_tensor 改成 functional。另外 numpy 必须留在 1.x,混进 NumPy 2 会直接 ABI 崩。
conda create -n sadtalker python=3.10 -y && conda activate sadtalker && pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118 && conda install -y ffmpeg && pip install -r requirements.txt - 03
下权重:checkpoints/ 和 gfpgan/weights/ 两组
官方脚本会从 v0.0.2-rc release 拉两个渲染器 safetensors(各 691MiB)和两个 mapping_*.pth.tar(各约 148MiB),再从 GFPGAN 与 facexlib 仓库拉增强权重。此外还要 3DMM 那套资产:epoch_20.pth(275MiB)、BFM_Fitting/01_MorphableModel.mat(230MiB)、s3fd 人脸检测权重等,全部落盘约 3GB。一个坑:音频分支的权重文件上游就叫 auido2exp_00300-model.pth 和 auido2pose_00140-model.pth——audio 拼成了 auido,别顺手「改对」,改了就加载不到。
bash scripts/download_models.sh - 04
跑第一条,再决定要不要起 WebUI
先用仓库自带的中文示例音频验证环境通不通,再换自己的素材。常用旋钮:`--size 512` 提分辨率,`--batch_size` 决定渲染吞吐(24GB 卡上开到 8~16 很舒服),`--expression_scale` 调表情幅度,`--pose_style` 在 0~45 之间换头部动作风格,`--still` 冻住大幅摆头。要图形界面就跑 app_sadtalker.py,但注意它内部是裸的 demo.launch(),只绑 127.0.0.1,远程机器上要么做 SSH 端口转发,要么把那行改成 demo.launch(server_name='0.0.0.0')。真遇到 OOM,官方 FAQ 给的办法是设 PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128。
python inference.py --driven_audio examples/driven_audio/bus_chinese.wav --source_image examples/source_image/full_body_1.png --result_dir ./results --preprocess full --still --enhancer gfpgan --size 512 --batch_size 8
一条口播视频到底多少钱
SadTalker 输出固定 25fps,所以成本可以直接按帧算。一分钟成片 = 60 × 25 = 1,500 帧。在 RTX 3090 24GB($0.193/卡·时)上跑 512 分辨率 + GFPGAN 增强,按每秒约 4 帧估算,渲染需要 1,500 ÷ 4 = 375 秒,加上 3DMM 提取、音频特征和封装大约 45 秒,合计约 420 秒 = 0.1167 小时。0.1167 × $0.193 ≈ $0.0225——一条一分钟的带增强口播视频,约两分三美分。关掉增强只跑 256,帧率能到每秒约 10 帧,1,500 ÷ 10 = 150 秒,加 45 秒共 195 秒 = 0.0542 小时,×$0.193 ≈ $0.0105,约一美分。批量生产 200 条一分钟视频:200 × 0.1167 = 23.34 卡时,× $0.193 = $4.50。换 RTX 4090($0.540/卡·时)单条时间大约减半到 0.0583 小时,×$0.540 ≈ $0.0315,比 3090 贵约四成但交付快一倍——赶稿时值,跑批量时不值。存储另算:权重 3GB + conda 环境约 12GB + 素材成片,按 20GB 计是 20 × $0.414 = $8.28/月,注意实例停机后计算立刻停止计费、存储会一直计到你销毁它为止。200 条成片各按 30MB 下载,6GB × $0.0081 ≈ $0.05 出网费,基本可以忽略。全程按秒计费、无最低消费、无开通费,也不用提配额申请。
04 —
