使用SadTalker制作和语音匹配的说话视频
基础环境
-
硬件:nvidia 3060ti
-
虚拟化:pve8.1 / 基于官方cloud image的纯净ubuntu22.04 / docker 25.0.0
驱动及docker
有了上次折腾stable-diffusion,这次部署基础的nvidia环境就快多了,主要流程如下
- pve中给vm直通显卡
- lspci确定显卡已经识别
apt install ubuntu-drivers-common
- 安装显卡驱动
ubuntu-drivers autoinstall
- 安装nvidia container toolkit
- 验证vm和容器中的nvidia-smi可正常使用
准备测试数据
项目的输入是一张包含人脸的照片,一段wav格式的语音
输出为匹配语音的说话视频
因此需要准备一张含人脸的照片和一段wav语音
项目的huggingface提供了一些测试用例,直接下载一个即可使用
mac下的say命令
# 粤语女声
say --voice=Sinji -o audio.wav --data-format=LEF32@22050 做人呢,最重要的是开心
容器运行
项目的wiki里有提供一个docker镜像,但是看了下仓库,用的代码是比较旧的,一直没有更新。
但是开发测试阶段影响不大,于是先按照wiki试了下
docker pull wawa9000/sadtalker
docker run --rm --gpus "all" -v /root/sadtalker:/data wawa9000/sadtalker \
--driven_audio /data/audio.wav \
--source_image /data/image.jpg \
--result_dir /data/ \
--enhancer gfpgan
经过初步验证,用huggingface自带的样例可以跑,但是换自己的照片后
每次都要联网下载外部模型或数据,会出现EOF错误
从issue里搜索可以找到一些类似的问题,从中看到项目作者回复:老版本联网下载,后续增加了新功能,支持纯离线完成,不再需要联网
宿主机运行
为了解决上述问题,我们用最新的代码直接在linux下跑试试。
下面是完全按照项目文档中的方法配置环境
git clone https://github.com/OpenTalker/SadTalker.git
cd SadTalker
conda create -n sadtalker python=3.8
conda activate sadtalker
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
conda install ffmpeg
pip install -r requirements.txt
# Coqui TTS is optional for gradio demo.
# pip install TTS
pip无限循环问题
在最后一步,虽然TTS模块的安装是可选的,但是处于好奇,准备一起安装下TTS模块,但是遇到了问题:pip会一直循环遍历包,直到达到上限抛了异常。
pip install TTS failure:
...
pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 200000
经过搜索,找到issue,并且使用评论中一个fork后改过的pip,解决了该问题。
pip install git+https://github.com/notatallshaw/pip@prefer-conflicting-causes
命令行
conda activate sadtalker
python inference.py \
--driven_audio data/audio.wav \
--source_image data/image.jpg \
--enhancer gfpgan
测试发现,可以正常合成视频,运行中GPU的使用情况如下
webui
项目里通过gradio自带了web ui,文档里也提到了可以通过bash webui.sh
快速启动。
在启动webui的过程中,同样遇到了一些问题:
-
启动时看到提示Coqui api没有配置,去coqui网站看了下,提示已经shutting down了:sweat_smile:
-
由于webui并不使用命令行用到的conda环境,而是单独在目录下安装了venv,所以依赖全部都得重新下载。且默认会安装TTS,所以也需要替换该venv中的pip,才能正常安装TTS,运行完整的脚本
-
跑起来后可能提示ffmpeg不存在,因为shell环境不一样,需要注意ffmpeg能被主程序执行
-
启动时代码异常:AttributeError: 'Row' object has no attribute 'style' · Issue #693 · OpenTalker/SadTalker (github.com)改gradio版本解决:
pip install gradio==3.41.2
-
默认启动时监听127.0.0.1,如果是在服务器上跑,需要修改
launcher.py
demo.launch(server_name='0.0.0.0')
-
致命问题:一切就绪,从webUI提交任务后,后台抛异常
...... > - Can't parse 'dsize'. Sequence item with index 0 has a wrong type > - Can't parse 'dsize'. Sequence item with index 0 has a wrong type
调了各种参数都解决不了,最后在issue里发现早有人提过,且作者表示后续有时间修复,至今半年多了还未修复。因此webui目前属于不可用阶段
参考
macos say批量将文本转换为语音_mac say -o 音质-CSDN博客
macos - Error on say when output format is wave - Stack Overflow
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。