4.8 KiB
A streaming digital human based on the Ernerf model, realize audio video synchronous dialogue. It can basically achieve commercial effects.
基于ernerf模型的流式数字人,实现音视频同步对话。基本可以达到商用效果
1. Installation
Tested on Ubuntu 20.04, Python3.10, Pytorch 1.12 and CUDA 11.3
1.1 Install dependency
conda create -n nerfstream python=3.10
conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch
conda activate nerfstream
pip install -r requirements.txt
pip install "git+https://github.com/facebookresearch/pytorch3d.git"
pip install tensorflow-gpu==2.8.0
linux cuda环境搭建可以参考这篇文章 https://zhuanlan.zhihu.com/p/674972886
1.2 安装rtmpstream库
参照 https://github.com/lipku/python_rtmpstream
2. Run
2.1 运行rtmpserver (srs)
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
2.2 启动数字人:
python app.py
如果访问不了huggingface,在运行前
export HF_ENDPOINT=https://hf-mirror.com
运行成功后,用vlc访问rtmp://serverip/live/livestream
2.3 网页端数字人播报输入文字
安装并启动nginx
apt install nginx
nginx
将echo.html和mpegts-1.7.3.min.js拷到/var/www/html下
用浏览器打开http://serverip/echo.html, 在文本框输入任意文字,提交。数字人播报该段文字
3. 更多使用
3.1 使用LLM模型进行数字人对话
目前借鉴数字人对话系统LinlyTalker的方式,LLM模型支持Chatgpt,Qwen和GeminiPro。需要在app.py中填入自己的api_key。
安装并启动nginx,将chat.html和mpegts-1.7.3.min.js拷到/var/www/html下
用浏览器打开http://serverip/chat.html
3.2 使用本地tts服务,支持声音克隆
运行xtts服务,参照 https://github.com/coqui-ai/xtts-streaming-server
docker run --gpus=all -e COQUI_TOS_AGREED=1 --rm -p 9000:80 ghcr.io/coqui-ai/xtts-streaming-server:latest
然后运行,其中ref.wav为需要克隆的声音文件
python app.py --tts xtts --ref_file data/ref.wav
3.3 音频特征用hubert
如果训练模型时用的hubert提取音频特征,用如下命令启动数字人
python app.py --asr_model facebook/hubert-large-ls960-ft
3.4 设置背景图片
python app.py --bg_img bg.jpg
3.5 全身视频拼接
3.5.1 切割训练用的视频
ffmpeg -i fullbody.mp4 -vf crop="400:400:100:5" train.mp4
用train.mp4训练模型
3.5.2 提取全身图片
ffmpeg -i fullbody.mp4 -vf fps=25 -qmin 1 -q:v 1 -start_number 0 data/fullbody/img/%d.jpg
3.5.2 启动数字人
python app.py --fullbody --fullbody_img data/fullbody/img --fullbody_offset_x 100 --fullbody_offset_y 5 --fullbody_width 580 --fullbody_height 1080 --W 400 --H 400
- --fullbody_width、--fullbody_height 全身视频的宽、高
- --W、--H 训练视频的宽、高
4. Docker Run
不需要第1步的安装,直接运行。
docker run --gpus all -it --network=host --rm registry.cn-hangzhou.aliyuncs.com/lipku/nerfstream:v1.3
srs和nginx的运行同2.1和2.3
5. Data flow
6. 数字人模型文件
可以替换成自己训练的模型(https://github.com/Fictionarry/ER-NeRF)
.
├── data
│ ├── data_kf.json
│ ├── au.csv
│ ├── pretrained
│ └── └── ngp_kf.pth
7. 性能分析
- 帧率
在Tesla T4显卡上测试整体fps为18左右,如果去掉音视频编码推流,帧率在20左右。用4090显卡可以达到40多帧/秒。
优化:新开一个线程运行音视频编码推流 - 延时
整体延时5s多
(1)tts延时2s左右,目前用的edgetts,需要将每句话转完后一次性输入,可以优化tts改成流式输入
(2)wav2vec延时1s多,需要缓存50帧音频做计算,可以通过-m设置context_size来减少延时
(3)srs转发延时,设置srs服务器减少缓冲延时。具体配置可看 https://ossrs.net/lts/zh-cn/docs/v5/doc/low-latency, 配置了一个低延时版本
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/lipku/srs:v1.1
8. TODO
- 添加chatgpt实现数字人对话
- 声音克隆
- 数字人静音时用一段视频代替
如果本项目对你有帮助,帮忙点个star。也欢迎感兴趣的朋友一起来完善该项目。
Email: lipku@foxmail.com
微信公众号:数字人技术