简介:这是一套面向数字人生成的 Wav2Lip 唇形同步工具包,适用于研究语音驱动虚拟形象、数字人口播等场景的开发者与AI学习者。压缩包内共有23个文件,主体为12个Python脚本,分别负责推理、音频增强、同步判别、配置读取等核心流程;同时附带预训练模型、shell与bat两种运行脚本、环境依赖说明、ini配置文件以及交互式Notebook,可帮助快速搭建环境并完成端到端效果验证。整个压缩包体积仅3.88MB,轻量易部署;版本v8.2意味着经过多轮迭代改进,功能相对成熟。目前已有1140人学习使用。通过阅读源码和运行示例,可以深入理解音频特征到唇部动作的映射原理,也可基于现有接口扩展对话、表情等数字人交互能力,适合作为数字人相关课题的入门实践与二次开发参考,为进一步定制虚拟主播、在线教育助教等应用提供基础。
1. Easy-Wav2Lip 到底是什么:从一句"对口型"到能落地的工具
做视频后期的人十有八九都遇到过这种需求:让视频里的人物按一段新配音重新张嘴。Wav2Lip 就是解决这个问题的开源项目,它用音频驱动人脸区域的唇形生成,不重新渲染整张脸,所以速度不像换脸那样慢到无法接受。Easy-Wav2Lip 是围绕它做的一层封装,v8.2 这个压缩包把模型权重、人脸检测依赖和超分修复工具都集成到了一起,解压之后就能跑,省去了从零编译、下载权重、排查依赖的时间。这篇文章写给想把"对口型"真正用在批量出片、配音预览和虚拟人物制作的人:你会看到它怎么工作、最小能跑的命令长什么样、哪些参数值得动,以及我在实际处理素材时踩过的几个实在的坑。
2. Wav2Lip 的原理与 v8.2 这个版本为什么值得装
Wav2Lip 的生成器是典型的 encoder-decoder 结构,以音频的 mel 频谱特征为主输入,以参考帧的人脸区域为辅助条件,输出目标帧的嘴部区域。这里有一个和普遍认知不一样的地方:模型不是把整张脸重新画出来,它只重建嘴巴那一小块,然后把生成结果贴回原帧。背景、眉毛、眼睛这些区域都保持原始画面,只有嘴巴区域是合成的。这种设计直接决定了它的速度上限——推理量不大,普通显卡跑几百帧只需要几十秒,CPU 也能跑但会慢很多。
在训练阶段,作者放了一个关键设计:两个判别器协同工作。SyncNet 判别器把"音频-视频对"当成二分类,专门判断当前帧的唇形和这一段音频是不是对齐的,这是保证说话节奏正确的核心;另一个视觉质量判别器负责让生成结果在纹理上不违和。生成器要在骗过这两个判别器的过程中,同时学会"让嘴巴按音频动"和"让嘴巴还是嘴巴"。相比再老一代的方案,比如先做音素对齐再选嘴型模板、或者用传统关键帧插值,它的最大优势是泛化:不需要预知说话人、不需要按语言单独训练、也不需要在推理时准备嘴型库。给它一段中文、一段英文甚至一段唱歌音频,它都能直接出结果。
2.1 Wav2Lip 与老式唇形同步方案的差别在哪
老式方案大致分两类。一类是基于音素映射:先把音频转成音素序列,再在预录好的嘴型库里找对应画面,这类方案的问题在于多语言支持差,还要额外引入一个音素对齐工具,工程链特别长。另一类是基于关键帧匹配,先用人脸关键点把嘴部轮廓描述出来,再用某种插值规则补中间帧,这类方案对头部转动非常敏感,头稍微偏一点关键点就跟不上,嘴型就开始漂。
Wav2Lip 把这些问题绕开了。音频侧直接抽 mel 频谱进网络,不关心是什么语言;视频侧只依赖人脸检测框,不依赖精细关键点。也就是说,它在工程上把"语音学"那部分完全黑匣子化。对从业者来说,意义很具体:你不需要懂音素,也不需要准备嘴型素材,只需要给它一个视频文件和一个音频文件。我在某公司帮客户做多语种配音预览时,就是因为这个特性,才能用同一套流程同时处理中文、英文和粤语素材。换成老方案,每加一种语言就要重新调研和测试。
值得说清楚的是,Wav2Lip 也不是万能的。它对正脸效果最好,侧脸超过一定角度会明显崩坏;对遮挡也敏感,口罩、手挡嘴、胡子浓密都会让结果变差。这些不是 bug,是模型训练数据的分布决定的——训练集里绝大多数是正脸说话画面。所以做方案选型时,如果素材里大量是侧脸或遮挡,不要指望调参数能救回来,应该先考虑换技术路线。
2.2 v8.2 在推理链路上的改进点
Easy-Wav2Lip v8.2 不是模型架构的大版本升级,而是"能用"级别的封装。这类压缩包最常见的组成是这样的:预训练权重 wav2lip_gan.pth 是最重要的文件,缺失它一切白搭;face_detection 目录下带着 S3FD 人脸检测器的依赖;修复工具目录下集成了 GFPGAN 和 CodeFormer 两套超分方案的接口;根目录还有批处理入口和管理脚本。这一代打包最大的改进是把推理后的自动修复步骤做进了主流程,纯官方仓库是没有这个的。
这里要提醒一句,不要被版本号迷惑。Easy-Wav2Lip 自己标的 v8.2 只代表打包者的迭代次数,不代表底层的 Wav2Lip 模型换了新结构。底层还是那套生成器加双判别器的设计。所以当你看到 v8.x、v9.x 甚至更高版本号时,要关注的其实是三件事:权重文件是不是 wav2lip_gan.pth、人脸检测是不是 S3FD、修复工具用的是 GFPGAN 还是 CodeFormer。这三件事确定之后,版本号之间的小差异基本不影响你的使用方法。
2.3 选型理由:为什么选择这个打包版本而不是裸模型
我最初在本地搭裸模型的过程可以用"翻车"两个字概括:官方仓库 clone 下来,权重下载链接失效,S3FD 依赖要自己编,torch 版本又不匹配,折腾了一下午还没跑出第一帧。裸模型路线适合两类人:一类是要改网络结构做学术实验的,另一类是打算用自有数据重新训练模型的。如果你只是想把一段配音视频做出来,或者想评估这个方向值不值得投入,打包版本是性价比最高的起点。
它的黑匣子程度恰好合适。权重和依赖被固定,减少了环境漂移问题;但核心推理参数全部暴露,后面讲参数调整的时候你会看到,它没有做过度封装。当你跑通一次之后,实际上你已经掌握了这个领域最重要的工程细节,之后换任何版本都不会迷路。选型上我还有一个习惯:先确认压缩包里的权重文件大小是否在合理范围。wav2lip_gan.pth 通常应该在 400MB 上下,如果只有几十 MB,很可能是残缺文件,后面推理会直接报错。
3. 本地跑通 Easy-Wav2Lip:环境安装与最小推理命令
环境是这台机器的第一个大坑。顺序很重要:先装 torch,再装其他依赖。我看过太多翻车案例是先装了一堆项目依赖,最后发现 torch 版本不匹配又不敢重装,只能把环境删掉从头再来。按照下面的顺序,十分钟内就能把环境料理清楚。
3.1 环境准备:Python 版本、显卡与 torch 三件套
实操建议用 Python 3.10。太新的 3.12 会导致部分老依赖没有预编译的 wheel 包,装的时候才去现场编译,时间成本不划算。显卡建议 N 卡且显存 4GB 以上,跑 480p 的短视频足够。如果你手里的机器只有 CPU,也能跑,但速度会慢到让你怀疑是不是程序卡死了,后面我会讲一个折中的加速方案。
conda create -n wav2lip python=3.10 -y conda activate wav2lip pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118这段命令的作用是创建一个干净的环境并安装 GPU 版 torch。注意--index-url指定的是 PyTorch 官方的 wheel 源,为什么要这样?因为默认 PyPI 上的 torch 是 CUDA 12 版本,而很多老依赖是针对 CUDA 11.8 编译的,混用会出兼容问题。安装完成后用下面这条命令确认 CUDA 可用性,这一步不要跳过。
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"如果输出True,说明显卡驱动和 torch 之间是通的。如果输出False,先看驱动版本,再用nvidia-smi确认显卡状态。驱动正常但 torch 认不出显卡的情况,八成是安装时没有指定cu118索引,重装一次即可。这里多说一句,如果你确实没有 N 卡,也可以先安装 CPU 版 torch 把流程跑通,验证效果后再换机器。
3.2 解压、目录结构与模型文件检查
拿到 Easy-Wav2Lip-v8.2.zip 之后,先解压,不要直接在压缩包里运行。解压之后花两分钟看一下目录结构,这一步能帮你之后在报错时快速定位问题。
unzip Easy-Wav2Lip-v8.2.zip cd Easy-Wav2Lip-v8.2 ls -lh wav2lip_gan.pth这个包的核心文件在根目录下。wav2lip_gan.pth是预训练权重,inference.py是推理入口,face_detection目录放的是 S3FD 检测器,还有GFPGAN或CodeFormer相关目录。我一般会先确认权重文件大小是否在 400MB 左右,如果你的文件只有几十 MB,说明 zip 包下载不完整,趁早重新获取,不要等到推理时报错才发现。
目录结构没问题后,再装项目依赖。大多数打包版本会提供一个requirements.txt,直接安装即可。装的时候留意输出,哪个包编译失败就单独处理。S3FD 那个目录有时候需要单独执行安装脚本,如果pip install -r requirements.txt之后提示缺face_detection模块,就进到face_detection目录下跑一次安装命令。
3.3 最小推理命令
现在到最激动人心的环节:让程序动起来。先准备素材,一个视频文件和一个音频文件。音频最好直接把视频里的原声替换掉,用 ffmpeg 提取即可。
ffmpeg -i input.mp4 -vn -ac 1 -ar 16000 audio.wav这里-ac 1表示转成单声道,-ar 16000表示采样率 16kHz。为什么是 16kHz?因为 Wav2Lip 预处理时会把输入音频重采样到 16kHz 再抽 mel 特征,提前转好能避免在推理链路里出现意外的重采样行为。如果你想换一个全新的配音,直接把外部音频文件转成同样的格式就行。
接着是最小推理命令。这个命令的完整形式是:
python inference.py \ --checkpoint_path wav2lip_gan.pth \ --face input.mp4 \ --audio audio.wav \ --outfile output.mp4--checkpoint_path指定权重文件,--face是输入视频,--audio是输入音频,--outfile是输出文件。第一次跑通你会看到屏幕上刷出一帧帧的进度信息,最后生成的视频和源视频分辨率一致。注意输出视频可能没有声音,Wav2Lip 推理流程只负责画面,不负责把音频合进输出文件。所以跑完之后,需要自己用 ffmpeg 把音频合回去,这是新手最容易犯的"错误",下载后播放发现没声音以为失败了。
3.4 关键参数说明与一个能用的输出模板
最小命令能跑通之后,就要开始看参数了。下表列出我日常用得最多的几个参数,它们也是这个领域里高频出现的调整项。
| 参数 | 作用 | 默认值 | 备注 |
|---|---|---|---|
--pads | 人脸检测框的上下左右扩充像素 | 0 10 0 0 | 嘴部被截断时调大 |
--resize_factor | 倍率缩放输入视频 | 1 | 小于 1 为缩小加速 |
--nosmooth | 关闭检测框时序平滑 | 开启平滑 | 只在检测框漂移时考虑 |
--fps | 指定输入视频帧率 | 自动检测 | 与音画不同步时手动指定 |
--mel_step_size | 音频特征的步长 | 16 | 语速异常时调整 |
--box | 手动指定人脸框坐标 | 无 | 多人场景或检测失败时用 |
--face | 指定某一帧的人脸坐标 | 无 | 与--box配合使用 |
--rotate | 旋转输入视频角度 | 无 | 手机竖拍素材要留意 |
这些参数不要求一次全记住,但有几个我希望你一上来就理解。--pads处理的是检测框贴边的问题,比如说话的人下巴离画面底部很近,检测框截掉了嘴,这时候把--pads的第二个值调大,底部扩充,嘴就回来了。--resize_factor是加速神器,0.5 表示把视频缩小一半再做检测和推理,速度能翻几倍,但分辨率会损失。我给的输出模板会把加速和稳框都考虑到:
python inference.py \ --checkpoint_path wav2lip_gan.pth \ --face input.mp4 \ --audio audio.wav \ --outfile output.mp4 \ --pads 0 10 0 0 \ --resize_factor 1这个模板默认不缩放,保证质量优先。如果你的显卡显存吃紧,把--resize_factor改成 0.75,检测速度立刻上来,视觉损失在 720p 以下肉眼不太分得出来。后面的章节里,我会详细讲怎么根据素材类型调整这些参数。
4. 把效果调好:质量、清晰度与人脸检测的关键参数
从"能跑"到"能看"之间有三道关:检测框稳不稳、嘴巴清不清楚、整帧画面糊不糊。这一章按排查顺序来,先解决检测框,再解决清晰度,最后给出不同场景的参数模板。
4.1 影响唇形的三个核心参数:pads、nosmooth、resize_factor
先说--pads。人脸检测器输出的是一个矩形框,框的范围决定后续模型看到的内容。如果这个框切得太紧,嘴巴下半部分落在框外,生成结果就会缺一块。默认值0 10 0 0的意思是上、右、下、左分别扩充 0、10、0、0 个像素,也就是底部多留 10 像素。如果你的素材里说话人离画面边缘很近,按需调整这四个值。我遇到过一个案例,某视频里人物侧身坐着,右脸贴近画面右边缘,默认参数下生成的嘴型明显偏窄,把--pads调成0 10 0 20之后恢复正常。
再说--nosmooth。这个参数默认是关闭的,也就是说推理时会对相邻帧的人脸检测框做时序平滑,让框的位置不会一帧一帧乱跳。很多人一看到"平滑"就觉得它会拖慢速度、影响精度,上来就加--nosmooth,结果输出视频脸部闪烁更严重。原因是检测框本来就在微幅抖动,平滑机制恰恰是抑制这个抖动的。什么时候才关掉它?当视频里人物快速运动,平滑跟不上导致检测框滞后的时候,关闭平滑反而能更快追上人脸。所以这个参数要按素材类型决定,不要无脑加。
最后说--resize_factor。这个参数把输入视频整体缩放后再送入检测和推理流程,0.5 表示把画面缩小一半。缩小的好处是检测速度快、显存占用低,坏处是人脸区域变小,嘴巴细节打折。我的习惯是:人脸在画面里占比很大时用 0.5 加速,人脸很小时保持 1。如果你处理的是多人同框的广角镜头,人脸太小直接检测不到,这时候不是调这个参数能解决的,得靠后面的手动指定框。
4.2 高清修复:用 GFPGAN 把 96x96 的嘴部质量补回来
Wav2Lip 模型内部的生成分辨率是 96x96,这是训练时定死的。所以无论你的源视频是 1080p 还是 4K,嘴部区域在被贴回原帧之前,本质上只有 96x96 的画质。直接放大回原尺寸,嘴巴会明显比周围皮肤糊。这就是为什么打包版本会集成超分修复工具——它们存在的意义就是把这块模糊补回去。
python inference.py \ --checkpoint_path wav2lip_gan.pth \ --face input.mp4 \ --audio audio.wav \ --outfile output.mp4 \ --restore_face 1 \ --gfpgan_version 1.4 \ --bg_ratio 0.4--restore_face 1表示启用 GFPGAN 修复,--gfpgan_version 1.4指定使用的版本,--bg_ratio控制修复时背景的融合比例。这个参数很有意思:bg_ratio越高,背景参与修复的程度越大;越低,修复越集中在脸部区域。我一般在 0.3 到 0.5 之间取值,太高会把背景纹理也改掉,造成一种不自然的"重绘感"。
还有一个容易忽略的点:修复工具默认也会处理非嘴部的皮肤区域,比如脸颊、额头。如果原视频本身皮肤纹理很好,修复后反而会出现一种"蜡像感",看起来不自然。遇到这种情况,不要一味调低背景比例,直接关掉修复再对比一次。我在第 5 章的避坑记录里会再次提到这个决策,因为它是"提升清晰度"和"破坏真实感"之间最典型的矛盾。
4.3 三段典型场景的参数配置
实际操作时,参数不是孤立的,它们要组合起来用。下面是我处理过并且验证有效的三组配置,直接抄作业问题不大。
| 场景 | pads | resize_factor | 修复 | 说明 |
|---|---|---|---|---|
| 单人正脸说话,1080p 素材 | 0 10 0 0 | 1 | 开,bg_ratio 0.4 | 质量优先,显存够就上 |
| 多人同框,需要指定人脸 | 0 15 0 0 | 1 | 开,bg_ratio 0.3 | 必须配合--face或--box |
| 低清视频通话画面 | 0 10 0 0 | 0.5 | 关 | 原视频本身就糊,修复价值不大 |
第二行的多人场景多说一句。--face参数可以指定某一帧里某个人脸的坐标,格式是四个数字,代表 x、y、宽、高。我的习惯是先用一个预览脚本把视频抽一帧出来,在图上量出目标人脸框的坐标,再把坐标喂给推理命令。这个做法虽然笨,但稳定。你不想每一帧都让检测器去猜该看谁,手动指定之后全程都跟踪这一张脸。
第三行关掉修复的理由也很直接:低清视频本身信息量有限,超分工具在低分辨率输入上往往会脑补出不存在的纹理,结果就是画面看起来很平滑但完全不是原本那个人。与其修复成"假高清",不如保留原始质感。提醒一句,手机录制的竖屏视频记得先检查方向,必要时用--rotate参数把画面转到正常角度再处理。
5. Easy-Wav2Lip 常见问题与避坑记录
这一章是我认为这篇文章里最有价值的部分,全部来自实际处理的报错和返工记录。每条都按现象、原因、解决这个结构来写,方便你直接对号入座。
5.1 现象:成片脸部闪烁厉害
我最早跑出的第一版视频就是这样:嘴巴在动,但整张脸像在抖动,尤其在人物轻微转头的时候特别明显。现象背后的原因是人脸检测框在相邻帧之间不稳定,框的位置上下左右跳,模型每次看到的画面范围就不一样,生成的嘴部贴回原帧后,和周围皮肤的对位出现偏差,视觉上就成了闪烁。
解决思路分两步。先确认是不是--nosmooth导致的问题,如果是,去掉这个参数用默认的平滑机制。如果平滑已经开了还是闪,说明检测器在个别帧上彻底跑偏了,这时候不要再指望自动检测,直接用--box参数手动固定人脸框。我通常的做法是把视频暂停在人物最侧身的一帧,记下框的坐标,然后全程用这个框。这样虽然丢失了检测器的自适应能力,但换来的是稳定性。注意手动固定框只适合人物不怎么大幅移动的场景,如果人物会走出画面,还是得靠检测器。
5.2 现象:嘴型慢半拍或对不上
这个问题的典型表现是:声音已经到了,嘴还没张开;或者嘴张开了,声音已经停了。多数情况下问题不在模型,而在音频和视频的时间基准不一致。一个常见原因是用外部音频替换时,音频时长和画面原始时长不一致,但推理程序默认按视频的帧率去对齐音频,于是错位。
解决方法是先统一时间基准。用 ffmpeg 查看两个文件的时长,确保音频时长和视频时长差在 100ms 以内。如果音频长了,截断;短了,尾部补静音。然后在推理命令里用--fps手动指定视频帧率,防止自动检测到的帧率与实际不符。还有一种低频原因是--mel_step_size过大。默认 16 在大多数素材上没问题,但如果你处理的是语速特别慢的旁白,可以把它调小到 12 或 10,让音频特征更密集,嘴型会更贴合。这个参数属于"玄学"范畴,每换一种素材都要重新试。
5.3 现象:人脸检测框选错,嘴部来自背景
这个现象很吓人:输出的画面里,人物嘴部区域不是被生成的内容,而是背景纹理在那里扭曲。原因基本可以锁定为检测器把背景里某个高对比度区域误判成人脸,后续所有生成都基于这个错误区域。我在某次处理访谈素材时就碰到过,背景墙上挂着一幅人物海报,检测器完美地把海报上的脸当成了目标。
解决方法是手动干预。用--face参数指定一个参考帧中目标人脸的真实坐标,或者用--box直接给出一组固定坐标。注意这两个参数的区别:--face倾向于在后续帧中重新识别这张脸,--box是让所有帧都用这一个框。素材里人物始终居中不动的,用--box最简单。素材里人物有移动的,用--face效果更好。如果两个参数都试了还是不行,就检查一下原始视频分辨率是不是特别低,低分辨率下检测器确实更容易找错目标。
5.4 现象:显存溢出,长视频根本跑不完
这个几乎是长视频处理的必考题。显存一满,程序直接崩,前面跑的帧全白费。原因不用多说,Wav2Lip 是把整段视频的帧序列加载到显存里处理的,视频越长占的显存越大。解决思路有两个方向,一是降低单次处理的数据量,二是把长视频切段。
切段是我最常用的做法。用 ffmpeg 把 10 分钟的视频切成每段 20 秒的小视频,逐段处理,最后再拼接。这个思路笨但可靠,而且分段拼接后结果和整段处理几乎没有差别,因为 Wav2Lip 对帧之间没有长期依赖。
ffmpeg -ss 00:00:00 -t 20 -i input.mp4 seg_0000.mp4 ffmpeg -ss 00:00:20 -t 20 -i input.mp4 seg_0001.mp4切段之后逐段跑推理,跑完再用 ffmpeg 按顺序拼接,然后统一合成音频。要注意拼接时各段的参数必须一致,否则转码参数不同,画面会跳动。另一个降低显存的思路是把--resize_factor调成 0.5,画面缩小一半,单批处理量直接降到原来的四分之一,代价是嘴部细节损失,具体用哪个方案取决于你对画质的底线。
5.5 现象:权重文件缺失或下载返回 404
这个现象在第一次部署时最容易出现,因为打包版本里的权重文件往往不是直接放在压缩包里,而是通过脚本去远程拉取。远程地址一旦失效,程序就报文件不存在。我见过有人在群聊里问为什么跑不起来,结果一看是权重没下载,卡在了第一步。
解决方法是分清权重文件到底放哪、去哪找。先检查压缩包解压后的目录里有没有wav2lip_gan.pth,有的话看文件大小,400MB 左右是正常的。没有的话,看脚本是从哪里下载的,换个网络环境或者换下载方式把文件放回指定位置。还有一种情况是压缩包本身不完整,解压就报错,这时候重新下载压缩包。验证下载完整性有个习惯值得养成:下载后先解压到临时目录确认没问题,再正式部署,别在关键演示前一天发现包是坏的。
6. 进阶用法:一个 batch 脚本把几十条视频一次跑完
当你把单条视频的参数调顺之后,下一个需求自然是批量处理。手动一条条敲命令不是不行,但特别浪费时间,尤其当你要处理几十条素材时,脚本化几乎是必然选择。
6.1 批量处理逻辑与实现
我的批处理脚本循环处理一个目录下的所有视频文件,每个视频自动提取音频、调用推理、最后合成声音。核心逻辑用一个 Python 脚本承载,遍历指定目录下的 mp4 文件,对每个文件按统一参数跑一遍推理,再把音频合回输出文件。
import os import subprocess input_dir = "videos" output_dir = "outputs" os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): if not filename.endswith(".mp4"): continue video_path = os.path.join(input_dir, filename) audio_path = os.path.join(output_dir, filename.replace(".mp4", ".wav")) out_path = os.path.join(output_dir, filename.replace(".mp4", "_out.mp4")) final_path = os.path.join(output_dir, filename.replace(".mp4", "_final.mp4")) subprocess.run([ "ffmpeg", "-i", video_path, "-vn", "-ac", "1", "-ar", "16000", audio_path ], check=True) subprocess.run([ "python", "inference.py", "--checkpoint_path", "wav2lip_gan.pth", "--face", video_path, "--audio", audio_path, "--outfile", out_path, "--pads", "0", "10", "0", "0", "--resize_factor", "1" ], check=True) subprocess.run([ "ffmpeg", "-i", out_path, "-i", audio_path, "-c:v", "copy", "-c:a", "aac", final_path ], check=True) print(f"done: {filename}")这个脚本里三个subprocess.run分别对应提取音频、推理、合成声音三个阶段。第一个命令把视频转成 16kHz 单声道 wav;第二个命令调用推理程序生成无声音的视频;第三个命令把原始音频合回视频,注意用了-c:v copy,视频流不重新编码,速度很快。如果你想让每条视频使用不同的--pads值,把参数改成从配置文件中读取即可,但那就是另一个工程问题了。
6.2 验证方法与一个收尾建议
批量跑之前,我强烈建议你先挑一条素材单跑,确认效果能接受,再放进批量目录。批量过程中如果某一条出错,脚本会在check=True处抛异常,不会影响其他文件。跑完之后抽看三五条成片,重点看嘴唇是否对齐、有没有明显闪烁,不需要逐条检查,但抽样比例不要低于一成。
我自己现在的习惯是:每个批量的素材先做一个秒级的预览版本,把--resize_factor调到 0.5 快速跑一遍,确认大致效果,之后再全量跑高质量版本。这个习惯帮我避免过好几次"批量跑了一整夜,早上起来发现参数不对"的灾难。自动修复工具有时候会把脸部处理得像陶瓷一样光滑,预览阶段就能发现,不用等全量完成。
希望这篇关于 Easy-Wav2Lip 的实战笔记对你有帮助,至少让你少踩几个我踩过的坑。
本文还有配套的精品资源,点击获取