使用说明

数字人模型、传输模式、TTS、动作编排与并发用法。

3. Usage

分别选择数字人模型、传输方式、tts模型

3.1 数字人模型

支持4种模型:ernerf、musetalk、wav2lip、Ultralight-Digital-Human,默认用wav2lip

3.1.1 模型用wav2lip

  • 下载模型
    下载wav2lip运行需要的模型,链接:https://pan.quark.cn/s/83a750323ef0
    将s3fd.pth拷到本项目wav2lip/face_detection/detection/sfd/s3fd.pth;
    将wav2lip256.pth拷到本项目的models下, 重命名为wav2lip.pth;
    将wav2lip256_avatar1.tar.gz解压后整个文件夹拷到本项目的data/avatars下
  • 运行
    python app.py –transport webrtc –model wav2lip –avatar_id wav2lip256_avatar1
    用浏览器打开http://serverip:8010/webrtcapi.html
    可以设置–batch_size 提高显卡利用率,设置–avatar_id 运行不同的数字人
替换成自己的数字人
python -m avatars.wav2lip.genavatar --video_path xxx.mp4 --img_size 256 --avatar_id wav2lip256_avatar1 #img_size固定为256,与模型相关
#生成文件在本项目data/avatars目录下  
#如果一直卡住不动,可以将--face_det_batch_size改小一些

输入视频需要用闭嘴不说话的视频

3.1.2 模型用musetalk

  • 安装依赖库
    以下库只在生成avatar使用,推理不需要,如果有冲突可以单独建立一个环境安装
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 --transport webrtc --model musetalk --avatar_id musetalk_avatar1  

用浏览器打开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下

或者在livetalking项目中执行

python -m avatars.musetalk.genavatar --avatar_id musetalk_avatar1 --file ~/sun.mp4
#支持视频和图片生成,生成文件在本项目data/avatars目录下

输入视频需要用闭嘴不说话的视频

3.1.3 ER-Nerf

ernerf模型在git分支ernerf-rtmp,git checkout ernerf-rtmp

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

支持如下参数配置

3.1.3.1 音频特征用hubert

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

python app.py --transport webrtc --model ernerf --asr_model facebook/hubert-large-ls960-ft 
3.1.3.2 设置头部背景图片
python app.py --transport webrtc --model ernerf --bg_img bc.jpg 
3.1.3.3 全身视频贴回
  • 1.切割训练用的视频
ffmpeg -i fullbody.mp4 -vf crop="400:400:100:5" train.mp4 

用train.mp4训练模型

  • 2.提取全身图片
ffmpeg -i fullbody.mp4 -vf fps=25 -qmin 1 -q:v 1 -start_number 0 data/fullbody/img/%08d.png
  • 3.启动数字人
python app.py --transport webrtc --model ernerf --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 训练视频的宽、高
  • ernerf训练第三步torso如果训练的不好,在拼接处会有接缝。可以在上面的命令加上–torso_imgs data/xxx/torso_imgs –preload 1,torso不用模型推理,直接用训练数据集里的torso图片。这种方式可能头颈处会有些人工痕迹。
替换成自己的数字人

替换成自己训练的模型https://github.com/Fictionarry/ER-NeRF,训练模型时音频特征要选wav2vec或者hubert

├── data
│   ├── data_kf.json (对应训练数据中的transforms_train.json)
│   ├── au.csv			
│   ├── pretrained
│   └── └── ngp_kf.pth (对应训练后的模型ngp_ep00xx.pth)

3.1.4 模型用Ultralight-Digital-Human

#checkpoint为训练后模型文件路径,目前只支持音频特征为hubert的模型; 
#video_path提供一段训练人物闭嘴不说话的视频
python -m avatars.ultralight.genavatar --video_path xxx.mp4 --avatar_id ultralight_avatar1 --checkpoint xxx.pth  
#生成文件在本项目data/avatars目录下
  • 运行
    python app.py –transport webrtc –model ultralight –avatar_id ultralight_avatar1
    用浏览器打开http://serverip:8010/webrtcapi.html
    可以设置–batch_size 提高显卡利用率,设置–avatar_id 运行不同的数字人

3.2 传输模式

支持webrtc、rtcpush、rtmp,默认用webrtc

3.2.1 webrtc p2p

python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1

服务端需要开放端口 tcp:8010; udp:1-65536 用浏览器打开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' --model wav2lip --avatar_id wav2lip256_avatar1

服务端需要开放端口 tcp:8000,8010,1985; udp:8000
用浏览器打开http://serverip:8010/rtcpushapi.html
如果推送地址不是localhost,需要在rtcpushapi.html中相应修改host地址

3.2.3 rtmp推送

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/rtmpapi.html
如果推送地址不是localhost,需要在rtmpapi.html中相应修改host地址

rtmp也可以通过rtcpush到srs,由srs转成rtmp流

export CANDIDATE='<服务器外网ip>' #如果srs与浏览器访问在同一层级内网,不需要执行这步
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/rtc2rtmp

3.3 TTS模型

支持edgetts、gpt-sovits、fish-speech、xtts、cosyvoice。默认用edgetts,可通过REF_FILE指定音色

3.3.1 gpt-sovits

服务部署参照gpt-sovits
运行

python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts gpt-sovits --TTS_SERVER http://127.0.0.1:9880 --REF_FILE ref.wav --REF_TEXT xxx

REF_TEXT为REF_FILE中语音内容,时长不宜过长。此处wav文件需要放在tts服务端,相对tts服务的路径。

3.3.2 fish-speech

服务部署参照fish-speech
运行

python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts fishtts --TTS_SERVER http://127.0.0.1:8080 --REF_FILE test

–REF_FILE为fish-speech服务端的referenceid

3.3.3 cosyvoice

服务部署参照cosyvoice
运行

python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts cosyvoice --TTS_SERVER http://127.0.0.1:50000 --REF_FILE ref.wav --REF_TEXT xxx

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

3.3.4 腾讯语音服务

运行

export TENCENT_APPID=xxx #appid
export TENCENT_SECRET_KEY=xxx  #seceret_key
export TENCENT_SECRET_ID=xxx #seceret_id
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts tencent  --REF_FILE 101001

REF_FILE为音色ID,可以上https://cloud.tencent.com/document/product/1073/92668查看音色列表,也可以是自己克隆的音色id

3.3.5 豆包语音服务

运行

export DOUBAO_APPID=xxx #appid
export DOUBAO_TOKEN=xxx  #accesss_token
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts doubao --REF_FILE zh_female_roumeinvyou_emo_v2_mars_bigtts

REF_FILE为音色ID,可以上https://www.volcengine.com/docs/6561/1257544查看音色列表,也可以是自己克隆的音色id

3.3.6 阿里千问语音服务

运行

export DASHSCOPE_API_KEY=<your_api_key>
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts qwen  --REF_FILE Cherry

REF_FILE为音色ID,可以上https://help.aliyun.com/zh/model-studio/qwen-tts-realtime?spm=a2c4g.11186623.0.0.2f86cb646t1DwA#bac280ddf5a1u查看音色列表,也可以是自己克隆的音色id

3.3.7 xtts

运行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 --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --tts xtts --REF_FILE data/ref.wav --TTS_SERVER http://localhost:9000

3.4 动作编排

  • 1,生成素材
ffmpeg -i xxx.mp4 -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
  • 2,编辑data/custom_config.json
    指定imgpath和audiopath。
    设置audiotype,说明:0表示推理视频,不用设置;1表示静音视频,如果不设置默认用推理视频代替; 2以上自定义配置
  • 3,运行
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --customvideo_config data/custom_config.json
  • 4,打开http://:8010/webrtcapi-custom.html
    填写custom_config.json中配置的audiotype,点击切换视频。如果是audiotype为1的静音视频会自动切换,不需要手动点击。

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

目前调用千问大模型api实现,与openai接口兼容。支持llm流式输出。如果需要与其他大模型对接,修改llm.py中api调用接口

export DASHSCOPE_API_KEY=<your_api_key>

根据传输模式用浏览器打开http://serverip:8010/rtcpushchat.html或http://serverip:8010/webrtcchat.html

3.6 多并发

python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 --max_session 3 

通过max_session指定最多运行几个会话。然后打开多个webrtcapi.html

3.7 语音输入

  1. 用funasr语音识别
    根据webrtc或rtcpush传输模式分别打开webrtcapi-asr.html或rtcpushapi-asr.html
    先点击最上面的start按钮连接视频;然后点击下面语音采集框的连接、开始按钮;开始语音采集并驱动数字人播报(说完不需要点停止按钮,等数字人说完继续说下一句即可)
    如果浏览器不能采集语音,在浏览器地址框输入edge://flags/#unsafely-treat-insecure-origin-as-secure,将服务端网址输入下面框中并重启浏览器 img.png 如果需要安装自己的asr服务端,请参照https://github.com/modelscope/FunASR/blob/main/runtime/python/websocket/README.md
  2. 用浏览器自带的语音识别
    需要用到llm做对话,后台运行
export DASHSCOPE_API_KEY=<your_api_key>
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1  

然后在浏览器中打开页面dashboard.html,由于需要采集音频,也需要像上一步一样在浏览器中加入白名单

3.8 虚拟摄像头输出

参考https://github.com/letmaik/pyvirtualcam安装虚拟摄像头驱动,然后运行

pip install pyvirtualcam
pip install pyaudio
python app.py --transport virtualcam --model wav2lip --avatar_id wav2lip256_avatar1 

打开obs或者其他直播软件,摄像头输入选择虚拟摄像头,可以看到数字人视频
打开webrtcapi.html,不要点击start,直接输入文字,点击send,在obs能看到数字人说话