metahuman-stream——一款开源的实时交互流式数字人

技术
前言

metahuman-stream是一款开源的实时交互流式数字人项目, 实时交互流式数字人技术实现了音视频同步对话,并基本达到了商用效果。以下是对该技术的功能、安装指南、使用方法及性能分析的整理。通过本文,你除了可以收获开源的数字人处理技术外,还能收获到常见的音视频处理如声音克隆、视频编排等开源技术。

特色功能

picture.image

•支持多种数字人模型:ernerf、musetalk、wav2lip。 •支持声音克隆。 •支持在对话中被打断。 •支持全身视频拼接。 •支持RTMP和WebRTC。 •支持视频编排:在数字人不说话时播放自定义视频。

  1. 安装指南

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]。

  1. 快速开始

默认采用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。

  1. 更多用法

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]。

  1. 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]。

  1. ER-Nerf数字人模型文件

可以替换成自己训练的模型,参考GitHub[13]。

  1. 性能分析

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]。

  1. 待办事项

• 添加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

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论