0


metahuman-stream - 数字人实时交互

文章目录


一、关于 metahuman-stream

metahuman-stream 是实时交互流式数字人库,实现音视频同步对话。基本可以达到商用效果。


功能

  1. 支持多种数字人模型: ernerf、musetalk、wav2lip
  2. 支持声音克隆
  3. 支持数字人说话被打断
  4. 支持全身视频拼接
  5. 支持rtmp和webrtc
  6. 支持视频编排:不说话时播放自定义视频

TODO

  • 添加chatgpt实现数字人对话
  • 声音克隆
  • 数字人静音时用一段视频代替
  • MuseTalk
  • Wav2Lip
  • SyncTalk

如果本项目对你有帮助,帮忙点个star。也欢迎感兴趣的朋友一起来完善该项目。
知识星球: https://t.zsxq.com/7NMyO 沉淀高质量常见问题、最佳实践经验、问题解答
微信公众号:数字人技术


二、安装

测试于: Ubuntu 20.04, Python3.10, Pytorch 1.12 和 CUDA 11.3

conda create -n nerfstream python=3.10
conda activate nerfstream
conda installpytorch==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"


三、快速使用

默认采用ernerf模型,webrtc推流到srs


2.1 运行srs

exportCANDIDATE='<服务器外网ip>'docker run --rm--envCANDIDATE=$CANDIDATE\-p1935:1935 -p8080:8080 -p1985:1985 -p8000:8000/udp \
  registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 \
  objs/srs -c conf/rtc.conf

2.2 启动数字人:

python app.py

如果访问不了huggingface,在运行前

exportHF_ENDPOINT=https://hf-mirror.com

用浏览器打开http://serverip:8010/rtcpushapi.html, 在文本框输入任意文字,提交。数字人播报该段文字
备注:服务端需要开放端口 tcp:8000,8010,1985; udp:8000


四、更多用法


3.1 使用LLM模型进行数字人对话

目前借鉴数字人对话系统LinlyTalker的方式,LLM模型支持Chatgpt,Qwen和GeminiPro。需要在app.py中填入自己的api_key。

用浏览器打开 http://serverip:8010/rtcpushchat.html


2、声音克隆

可以任意选用下面两种服务,推荐用

gpt-sovits

2.1 gpt-sovits

服务部署参照 gpt-sovits
运行

python app.py --tts gpt-sovits --TTS_SERVER http://127.0.0.1:9880 --REF_FILE data/ref.wav --REF_TEXT xxx

REF_TEXT为REF_FILE中语音内容,时长不宜过长


2.2 xtts

运行xtts服务,参照 https://github.com/coqui-ai/xtts-streaming-server

docker run --gpus=all -eCOQUI_TOS_AGREED=1--rm-p9000:80 ghcr.io/coqui-ai/xtts-streaming-server:latest

然后运行,其中ref.wav为需要克隆的声音文件

python app.py --tts xtts --REF_FILE data/ref.wav --TTS_SERVER http://localhost:9000

3、音频特征用hubert

如果训练模型时用的hubert提取音频特征,用如下命令启动数字人

python app.py --asr_model facebook/hubert-large-ls960-ft 

4、设置背景图片

python app.py --bg_img bc.jpg 

5、全身视频拼接


5.1 切割训练用的视频
ffmpeg -i fullbody.mp4 -vfcrop="400:400:100:5" train.mp4 

train.mp4

训练模型


5.2 提取全身图片
ffmpeg -i fullbody.mp4 -vffps=25-qmin1-q:v1-start_number0 data/fullbody/img/%d.jpg

5.3 启动数字人
python app.py --fullbody--fullbody_img data/fullbody/img --fullbody_offset_x100--fullbody_offset_y5--fullbody_width580--fullbody_height1080--W400--H400

  • --fullbody_width--fullbody_height 全身视频的宽、高
  • --W--H 训练视频的宽、高
  • ernerf 训练第三步 torso 如果训练的不好,在拼接处会有接缝。 可以在上面的命令加上 --torso_imgs data/xxx/torso_imgs,torso 不用模型推理,直接用训练数据集里的torso图片。 这种方式可能头颈处会有些人工痕迹。

6、不说话时用自定义视频替代

  • 提取自定义视频图片
ffmpeg -i silence.mp4 -vffps=25-qmin1-q:v1-start_number0 data/customvideo/img/%d.png

  • 运行数字人
python app.py --customvideo--customvideo_img data/customvideo/img --customvideo_imgnum100

7、webrtc p2p

此种模式不需要srs

python app.py --transport webrtc

服务端需要开放端口

tcp:8010

;

udp:50000~60000

用浏览器打开 http://serverip:8010/webrtcapi.html


8、rtmp推送到srs

docker run --rm-it-p1935:1935 -p1985:1985 -p8080: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


9、模型用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"

python app.py --model musetalk --transport webrtc

用浏览器打开 http://serverip:8010/webrtcapi.html
可以设置

--batch_size

提高显卡利用率,设置

--avatar_id

运行不同的数字人


替换成自己的数字人
git clone https://github.com/TMElyralab/MuseTalk.git
cd MuseTalk
修改configs/inference/realtime.yaml,将preparation改为True
python -m scripts.realtime_inference --inference_config configs/inference/realtime.yaml

运行后将

results/avatars

下文件拷到本项目的

data/avatars


方法二
执行

cd musetalk 
python simple_musetalk.py --avatar_id4--file D:\\ok\\test.mp4

支持视频和图片生成 会自动生成到 data 的 avatars 目录下


10、模型用wav2lip

暂不支持rtmp推送

  • 下载模型 下载wav2lip运行需要的模型,链接: https://pan.baidu.com/s/1yOsQ06-RIDTJd3HFCw4wtA 密码: ltuas3fd.pth 拷到本项目 wav2lip/face_detection/detection/sfd/s3fd.pth, 将 wav2lip.pth 拷到本项目的 models 下 数字人模型文件 wav2lip_avatar1.tar.gz, 解压后将整个文件夹拷到本项目的 data/avatars
  • 运行
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip_avatar1

用浏览器打开 http://serverip:8010/webrtcapi.html
可以设置

--batch_size

提高显卡利用率,设置

--avatar_id

运行不同的数字人


替换成自己的数字人
cd wav2lip
python genavatar.py --video_path xxx.mp4

运行后将

results/avatars

下文件拷到本项目的

data/avatars


五、Docker Run

不需要前面的安装,直接运行。

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镜像: https://www.codewithgpu.com/i/lipku/metahuman-stream/base

autodl教程 : https://github.com/lipku/metahuman-stream/blob/main/autodl/README.md


六、数字人模型文件

可以替换成自己训练的模型(https://github.com/Fictionarry/ER-NeRF)

.
├── data
│   ├── data_kf.json
│   ├── au.csv            
│   ├── pretrained
│   └── └── ngp_kf.pth

七、性能分析

  1. 帧率 在Tesla T4显卡上测试整体fps为18左右,如果去掉音视频编码推流,帧率在20左右。用4090显卡可以达到40多帧/秒。 优化:新开一个线程运行音视频编码推流
  2. 延时 整体延时3s左右 (1)tts延时1.7s左右,目前用的edgetts,需要将每句话转完后一次性输入,可以优化tts改成流式输入 (2)wav2vec延时0.4s,需要缓存18帧音频做计算 (3)srs转发延时,设置srs服务器减少缓冲延时。具体配置可看 https://ossrs.net/lts/zh-cn/docs/v5/doc/low-latency

2024-08-03(六)
早上好

(^_^)/

本文转载自: https://blog.csdn.net/lovechris00/article/details/140882735
版权归原作者 AI工程化 所有, 如有侵权,请联系我们删除。

“metahuman-stream - 数字人实时交互”的评论:

还没有评论