metahuman-stream是一款开源的实时交互流式数字人项目, 实时交互流式数字人技术实现了音视频同步对话,并基本达到了商用效果。以下是对该技术的功能、安装指南、使用方法及性能分析的整理。通过本文,你除了可以收获开源的数字人处理技术外,还能收获到常见的音视频处理如声音克隆、视频编排等开源技术。
特色功能
•支持多种数字人模型:ernerf、musetalk、wav2lip。 •支持声音克隆。 •支持在对话中被打断。 •支持全身视频拼接。 •支持RTMP和WebRTC。 •支持视频编排:在数字人不说话时播放自定义视频。
- 安装指南
1.1 安装依赖
在Ubuntu 20.04,Python3.10,Pytorch 1.12和CUDA 11.3上测试。
conda create -n nerfstream python=3.10
conda activate nerfstream
conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch
pip install -r requirements.txt
# 如果只用musetalk或者wav2lip模型,不需要安装下面的库
pip install "git+https://github.com/facebookresearch/pytorch3d.git"
pip install tensorflow-gpu==2.8.0
pip install --upgrade "protobuf<=3.20.1"
安装常见问题可以参考FAQ[1]。Linux CUDA环境搭建可以参考这篇文章:链接[2]。
- 快速开始
默认采用ernerf模型,通过WebRTC推流到SRS。
2.1 运行SRS
export CANDIDATE='<服务器外网IP>'
docker run --rm --env CANDIDATE=$CANDIDATE \
-p 1935:1935 -p 8080:8080 -p 1985:1985 -p 8000:8000/udp \
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 \
objs/srs -c conf/rtc.conf
2.2 启动数字人
python app.py
如果无法访问Huggingface,在运行前执行:
export HF\_ENDPOINT=https://hf-mirror.com
用浏览器打开http://serverip:8010/rtcpushapi.html,在文本框输入任意文字并提交,数字人将播报该段文字。
备注:服务端需要开放端口TCP:8000,8010,1985;UDP:8000。
- 更多用法
3.1 数字人模型选择
支持3种模型:ernerf、musetalk、wav2lip,默认使用ernerf。
3.1.1 ER-Nerf模型
python app.py --model ernerf
可以使用以下参数进行配置:
•音频特征用Hubert:
python app.py --asr\_model facebook/hubert-large-ls960-ft
•设置头部背景图片:
python app.py --bg\_img bc.jpg
•全身视频贴回:
1.切割训练用的视频:
ffmpeg -i fullbody.mp4 -vf crop="400:400:100:5" train.mp4
2.提取全身图片:
ffmpeg -i fullbody.mp4 -vf fps=25 -qmin 1 -q:v 1 -start\_number 0 data/fullbody/img/%d.jpg
3.启动数字人:
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
3.1.2 MuseTalk模型
不支持RTMP推送。
•安装依赖:
conda install ffmpeg
pip install --no-cache-dir -U openmim
mim install mmengine
mim install "mmcv>=2.0.1"
mim install "mmdet>=3.1.0"
mim install "mmpose>=1.1.0"
•下载MuseTalk所需模型,参考链接[3](提取码:qdg2)和数字人模型,参考链接[4](提取码:3mkt),并将文件拷贝到指定目录。 •运行:
python app.py --model musetalk --transport webrtc
浏览器打开http://serverip:8010/webrtcapi.html。
3.1.3 Wav2Lip模型
不支持RTMP推送。
•下载模型,参考百度网盘[5](密码:ltua)。 •运行:
python app.py --transport webrtc --model wav2lip --avatar\_id wav2lip\_avatar1
浏览器打开http://serverip:8010/webrtcapi.html。
3.2 传输模式
支持WebRTC、RTCPush、RTMP,默认使用RTCPush。
3.2.1 WebRTC P2P
无需SRS。
python app.py --transport webrtc
服务器需开放端口TCP:8010;UDP:50000~60000。
浏览器打开http://serverip:8010/webrtcapi.html。
3.2.2 WebRTC推送到SRS
•启动SRS:
export CANDIDATE='<服务器外网IP>'
docker run --rm --env CANDIDATE=$CANDIDATE \
-p 1935:1935 -p 8080:8080 -p 1985:1985 -p 8000:8000/udp \
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 \
objs/srs -c conf/rtc.conf
•运行数字人:
python app.py --transport rtcpush --push\_url 'http://localhost:1985/rtc/v1/whip/?app=live&stream=livestream'
浏览器打开http://serverip:8010/rtcpushapi.html。
3.2.3 RTMP推送到SRS
•安装rtmpstream库,参考GitHub[6]。 •启动SRS:
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
•运行数字人:
python app.py --transport rtmp --push\_url 'rtmp://localhost/live/livestream'
浏览器打开http://serverip:8010/echoapi.html。
3.3 TTS模型
支持edgetts、gpt-sovits、xtts,默认使用edgetts。
3.3.1 GPT-Sovits
服务部署参考gpt-sovits[7]。
python app.py --tts gpt-sovits --TTS\_SERVER http://127.0.0.1:9880 --REF\_FILE data/ref.wav --REF\_TEXT xxx
3.3.2 XTTS
运行XTTS服务,参考GitHub[8]。
docker run --gpus=all -e COQUI\_TOS\_AGREED=1 --rm -p 9000:80 ghcr.io/coqui-ai/xtts-streaming-server:latest
然后运行:
python app.py --tts xtts --REF\_FILE data/ref.wav --TTS\_SERVER http://localhost:9000
3.4 视频编排
•生成素材:
ffmpeg -i xxx.mp4 -s 576x768 -vf fps=25 -qmin 1 -q:v 1 -start_number 0 data/customvideo/image/%08d.png
ffmpeg -i xxx.mp4 -vn -acodec pcm_s16le -ac 1 -ar 16000 data/customvideo
/audio.wav
•编辑data/custom_config.json,指定imgpath和audiopath,设置audiotype。 •运行:
python app.py --transport webrtc --customvideo\_config data/custom\_config.json
•打开http://:8010/webrtcapi-custom.html,填写custom_config.json中配置的audiotype,点击切换视频。
3.5 使用LLM模型进行数字人对话
支持ChatGPT、Qwen和GeminiPro。需在app.py中填入api_key。
浏览器打开http://serverip:8010/rtcpushchat.html。
3.6 更多功能集成
•语音输入、知识库问答:Fay[9]。 •虚拟主播,字幕抓取:Luna[10]。
- Docker运行
无需前面安装,直接运行:
docker run --gpus all -it --network=host --rm registry.cn-beijing.aliyuncs.com/codewithgpu2/lipku-metahuman-stream:vjo1Y6NJ3N
代码位于/root/metahuman-stream,需先git pull更新代码,然后执行命令同第2、3步。
提供autodl镜像:CodeWithGPU[11],参考autodl教程[12]。
- ER-Nerf数字人模型文件
可以替换成自己训练的模型,参考GitHub[13]。
- 性能分析
1.帧率
在Tesla T4显卡上测试,整体fps约为18;去掉音视频编码推流后,帧率约为20;用4090显卡可达40+ fps。
优化:新开一个线程运行音视频编码推流。
2.延时
整体延时约为3秒:
(1)TTS延时约1.7秒,当前使用edgetts,需将每句话转完后一次性输入,可通过改为流式输入优化。
(2)Wav2Vec延时约0.4秒,需缓存18帧音频进行计算。
(3)SRS转发延时,建议通过设置SRS服务器减少缓冲延时,具体配置参考链接[14]。
- 待办事项
• 添加ChatGPT实现数字人对话。 • 声音克隆。 • 数字人静音时用视频替代。 • MuseTalk。 • Wav2Lip。 • TalkingGaussian。
本文由山行整理自https://github.com/lipku/metahuman-stream,如果对您有帮助,请帮忙点赞、关注、收藏,谢谢~
References
[1]
FAQ: https://github.com/lipku/metahuman-stream/blob/main/assets/faq.md
[2]
链接: https://zhuanlan.zhihu.com/p/674972886
[3]
链接: https://caiyun.139.com/m/i?2eAjs2nXXnRgr
[4]
链接: https://caiyun.139.com/m/i?2eAjs8optksop
[5]
百度网盘: https://pan.baidu.com/s/1yOsQ06-RIDTJd3HFCw4wtA
[6]
GitHub: https://github.com/lipku/python\_rtmpstream
[7]
gpt-sovits: https://github.com/lipku/metahuman-stream/blob/main/tts/README.md
[8]
GitHub: https://github.com/coqui-ai/xtts-streaming-server
[9]
Fay: https://github.com/xszyou/Fay
[10]
Luna: https://github.com/Ikaros-521/AI-Vtuber
[11]
CodeWithGPU: https://www.codewithgpu.com/i/lipku/metahuman-stream/base
[12]
autodl教程: https://github.com/lipku/metahuman-stream/blob/main/autodl/README.md
[13]
GitHub: https://github.com/Fictionarry/ER-NeRF
[14]
链接: https://ossrs.net/lts/zh-cn/docs/v5/doc/low-latency