Wav2Lip 出自 ACM Multimedia 2020 的论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild》,IIIT Hyderabad 和 University of Bath 合作,仓库在 github.com/Rudrabha/Wav2Lip,13.2k star、2.8k fork,master 分支一共 113 次提交。它的思路在当年很反直觉:不去设计更花哨的生成器,而是先在 LRS2 上训一个只会判断「音画对不对得上」的 SyncNet 专家判别器,把它冻住,然后拿它去逼生成器。hparams.py 里 syncnet_wt=0.0 就是这个训练策略的开关——先让生成器学会画脸,等重建 loss 降下来再把同步权重打开。条件窗口也很小:采样率 16000、80 维 mel、hop_size=200,等于每秒 80 帧 mel,而 inference.py 里 mel_step_size=16,正好是 0.2 秒,对上 25fps 视频的 5 帧画面。
但 2026 年你去 clone 它,第一个撞的墙一定不是显存,是依赖。requirements.txt 里写死的是 torch==1.1.0、torchvision==0.3.0、librosa==0.7.0、numpy==1.17.1、numba==0.48,README 写的是 Python 3.6。这套东西在今天的任何一个 CUDA 镜像里都装不上:numba 0.48 编译不过 Python 3.10;换成新版 librosa 之后 audio.py 里的 librosa.filters.mel(sr, n_fft, ...) 会因为参数改成 keyword-only 直接抛 TypeError;numpy 1.24 删掉了 np.float,人脸检测那一路会 AttributeError;torch 2.6 把 torch.load 的 weights_only 默认值翻成 True,加载 wav2lip_gan.pth 时又要再报一次。好消息是模型代码本身没问题,改完这三四处,在 torch 2.x 上跑得比 1.1.0 还快。懒得改的话,社区已经有现成的:Easy-Wav2Lip 锁 Python 3.10.11 + CUDA 12.2,mowshon/lipsync 直接 pip install lipsync 就能 LipSync(model='wav2lip', img_size=96, device='cuda'),instant-high 的 wav2lip-onnx-HQ 把整条链路搬到了 ONNX 并挂上四种人脸增强器,作者标注在 RTX 3060 6GB 上跑通。
还有一件必须先说清楚的事:这个仓库的授权只覆盖 personal / research / non-commercial,README 里写的是任何形式的商业使用都被严格禁止,商用要去联系 Sync Labs([email protected]、[email protected])。所以如果你在做产品而不是做实验,真正该评估的是继任者——字节的 LatentSync 是 Apache-2.0,1.6 版本直接训到 512×512,官方标注推理需要 18GB 显存(1.5 的 256×256 版本只要 8GB);TMElyralab 的 MuseTalk 1.5 是 MIT,模型权重明确允许商用,256×256 人脸区域,在 Tesla V100 上实时推理能跑到 30fps 以上。Wav2Lip 在这两者面前依然有一个不可替代的位置:它最轻、最快、对烂素材最宽容,96×96 的代价换来的是几乎可以忽略的显存占用。而这些账在 NexGPU 上都是按秒结的——从 $0.193/卡·时的 RTX 3090 到 $0.824/卡·时的 A100 PCIE 80GB,跑通一条链路再决定要不要升级,成本是分钟级的。
01 —
Wav2Lip 到底该用哪一份权重
官方只放了两个 checkpoint,真正的选择发生在社区分支和继任模型之间
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| wav2lip.pth(官方原版) | 卷积编解码 GAN,音频分支吃 80 维 mel,人脸分支吃 5 帧窗口 | 推理 <4GB;峰值由 S3FD 的 face_det_batch_size=16 决定,不是模型 | 生成 96×96 人脸;mel_step_size=16 ↔ 25fps 下 0.2 秒 / 5 帧 | README 的描述是 highly accurate lip-sync。同步是这一档最准的,代价是嘴部偏糊。做口型评测、做数据标注、做同步指标基线用它。 |
| wav2lip_gan.pth(官方视觉增强版) | 同一套生成器,额外接了视觉质量判别器(hparams 里 disc_wt=0.07) | 与原版一致,推理 <4GB | 同样是 96×96 输出 | README 的描述是同步略逊、画面更好。绝大多数做成片的人该用这个。两个权重都要自己从 Google Drive 拉,别忘了 face_detection/detection/sfd/s3fd.pth 也得单独放。 |
| Easy-Wav2Lip(anothermartz 分支) | 原版权重 + 羽化遮罩 + 可选 GFPGAN | Fast 模式与原版持平;Enhanced 模式显存和耗时由 GFPGAN 决定 | Fast / Improved / Enhanced 三档质量 | 环境锁 Python 3.10.11 与 CUDA 12.2,省掉整套依赖考古。官方给的对照:Colab T4 上 9 秒 720p60 素材,原版 6 分 53 秒,它 56 秒,同一条视频复跑(人脸追踪缓存命中)25 秒。 |
| wav2lip-onnx-HQ(instant-high 分支) | 整条链路转 ONNX,内置四种人脸增强器 | 作者标注在 RTX 3060 6GB 上跑通,也支持纯 CPU | 96×96 主干 + 增强器负责放大回原分辨率 | 想把 Wav2Lip 塞进一台小卡、或者塞进没有 PyTorch 的推理服务时的首选。ONNX 化之后启动快、依赖少,代价是改模型不方便。 |
| LatentSync 1.6(ByteDance,Apache-2.0) | 音频条件的 latent diffusion,不走中间运动表示 | 推理 18GB(1.5 的 256×256 版本 8GB);训练 stage1 23GB、stage2 30GB(省显存模式 20GB) | 512×512 输出;512 训练 stage1 30GB、stage2 55GB | 官方承认借用了 Wav2Lip 的代码,但路线完全不同。清晰度和 1.5 相比明显提升,1.5 那一版还专门优化过中文视频。要商用、要高清,从这里开始看。 |
| MuseTalk 1.5(TMElyralab,MIT) | 实时口型驱动,权重明确允许商用 | fp16 下在 4GB 的 RTX 3050 Ti 上能跑(8 秒视频约 5 分钟);训练 stage1 约 74GB/卡、stage2 约 85GB | 256×256 人脸区域;Tesla V100 上实时推理 30fps+ | 要做直播数字人、要低延迟交互,这是 Wav2Lip 之外的另一条主线。想更高清就在后面串 GFPGAN。 |
02 —
跑 Wav2Lip 该租哪张卡
先想清楚你是在跑 96×96 的主干,还是在跑后面那个真正吃卡的超分
跑通原版 96×96 推理,批量产几十条口播验证效果
RTX 3090 24GB$0.193/卡·时
Wav2Lip 主干几乎不占显存,24GB 的余量全留给 S3FD 在 1080p 帧上按默认 face_det_batch_size=16 跑,不用被迫加 --resize_factor 降画质。
Wav2Lip + GFPGAN / CodeFormer 超分,出交付级成片
RTX 4090 24GB$0.540/卡·时
超分是逐帧跑的,才是耗时大头;4090 的 fp16 吞吐把 Easy-Wav2Lip 的 Enhanced 模式从「等一晚上」压回「等一杯咖啡」。
自己重训 SyncNet 专家判别器和 Wav2Lip 生成器
RTX A6000 48GB$0.817/卡·时
hparams 里 syncnet_batch_size=64 比生成器的 batch_size=16 重得多,48GB 让你不改超参就能按原配置开满,长跑也不用担心被挤。
改用 LatentSync 1.6 出 512×512 高清,或做二阶段训练
A100 PCIE 80GB$0.824/卡·时
官方标注 1.6 推理要 18GB、512 分辨率的 stage2 训练要 55GB,一张 80GB 卡把推理和训练两件事一起覆盖,还比 A100 SXM4 便宜。
03 —
在 NexGPU 上把 Wav2Lip 跑起来
四步,其中第二步是所有人都会卡住的地方
- 01
开一台 PyTorch 镜像的实例,拉仓库和权重
在 console.nexgpu.net 选任意一张 24GB 卡,用 2,000+ 预置镜像里的 PyTorch 那一个直接起。仓库本身不带权重:wav2lip.pth 和 wav2lip_gan.pth 要从 README 给的 Google Drive 拉,人脸检测的 s3fd.pth 必须放到 face_detection/detection/sfd/ 下,路径错一个字符就是 FileNotFoundError。
git clone https://github.com/Rudrabha/Wav2Lip && mkdir -p Wav2Lip/face_detection/detection/sfd - 02
别照着 requirements.txt 装,改四处代码
requirements.txt 锁的是 torch==1.1.0 / librosa==0.7.0 / numba==0.48 / numpy==1.17.1,在现代 Python 上必然失败。正确做法是装新版依赖,然后改这四处:audio.py 里 librosa.filters.mel 的参数全改成关键字形式(sr=、n_fft=、n_mels=);把代码里残留的 np.float 换成 float;torch.load 加 weights_only=False;librosa 新版没有 .output,写 wav 改用 soundfile。改完之后模型在 torch 2.x 上是完全可用的,而且比 1.1.0 快。
pip install torch torchvision librosa soundfile opencv-python numpy tqdm ffmpeg-python - 03
跑第一条推理,先把 --pads 和 --resize_factor 调对
默认 pads=[0,10,0,0] 经常切掉下巴,口播素材普遍要把下边距加到 20 左右。1080p 素材如果 S3FD 显存不够,脚本会自己对半砍 face_det_batch_size 并打印 Recovering from OOM error;砍到 1 还不行就会抛 Image too big to run face detection on GPU,那时候才需要 --resize_factor 2。README 也明说了:模型在低分辨率人脸上表现更好,720p 的成品常常比 1080p 更自然。看到嘴部错位就加 --nosmooth。
python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face input.mp4 --audio speech.wav --pads 0 20 0 0 --nosmooth - 04
接超分,把 96×96 的方块补回去
原版把 96×96 的嘴直接贴回原帧,1080p 上一定能看见接缝和糊块。两条路:用 Easy-Wav2Lip 的 Improved 模式(羽化遮罩,只替换嘴、其余保持原分辨率),或者 Enhanced 模式再叠一层 GFPGAN 逐帧修复。这一步跑完把成片下载走就可以停机——NexGPU 的算力计费在实例停止时立刻中止,只有存储会继续算到你销毁为止。
python Easy-Wav2Lip.py # 在 config.ini 里把 quality 设成 Improved 或 Enhanced
算一笔真账:100 条 30 秒口播要花多少钱
拿 Easy-Wav2Lip 官方公布的基准做锚:Colab T4 上,9 秒 720p60 素材首跑 56 秒。30 秒素材大约是它的 3.3 倍,T4 上按 3 分钟一条估;换成 RTX 4090 24GB($0.540/卡·时),保守按 3 倍速算,约 1 分钟一条。100 条就是 100 分钟 ≈ 1.67 小时,1.67 × $0.540 ≈ $0.90。再加装环境、拉权重、调 --pads 的 20 分钟,0.33 × $0.540 ≈ $0.18。算力合计约 $1.08。如果只做原版无超分,换 RTX 3090 24GB($0.193/卡·时)同样时长只要 1.67 × $0.193 ≈ $0.32。存储另算:20GB 素材按 $0.414/GB·月的中位价,放一整月是 $8.28,放一天约 $0.28;100 条成片约 2GB 下行,2 × $0.0081 ≈ $0.02。也就是说,跑完这一批的一次性算力开销在一美元出头,前提是你记得停机——NexGPU 按秒计量、按小时定价,没有起租时长、没有开通费、没有配额申请。
04 —
