LiveTalking icon indicating copy to clipboard operation
LiveTalking copied to clipboard

请教下,如何同时启动多个不同的数字人,然后每个数字人都对应的是单独的音色,并且都有独立的语音交互。

Open weijia128 opened this issue 5 months ago • 16 comments

weijia128 avatar Jul 25 '25 02:07 weijia128

用不同的端口启呗

byronv5 avatar Aug 11 '25 03:08 byronv5

可以实现,要对里面的offer做出修改, 并替换增加opt的配置,然后预热

zhengyiwei1987 avatar Aug 11 '25 17:08 zhengyiwei1987

只要你的内存足够大,多线程启动对应的数字人,然后自己写对应页面切换就行了

heyyyyou avatar Aug 12 '25 07:08 heyyyyou

可以实现,要对里面的offer做出修改, 并替换增加opt的配置,然后预热

比如我想只用一个前端页面,加载多个数字人模型在前端呈现,每个数字人都有自己的一套语音问答逻辑,点击某一个就是现在单独的效果。这种可以吗

weijia128 avatar Aug 13 '25 05:08 weijia128

改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。

byronv5 avatar Aug 13 '25 06:08 byronv5

改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。

请教一下,作者提到支持多并发是否可以实现呢
我创建了多个推流地址作为数字人房间,但当多个房间请求时,公用的wav2lip推理模型就会存在排队情况 请问你有实现多并发吗

huajin2002 avatar Aug 25 '25 07:08 huajin2002

改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。 请教一下,作者提到支持多并发是否可以实现呢 我创建了多个推流地址作为数字人房间,但当多个房间请求时,公用的wav2lip推理模型就会存在排队情况 请问你有实现多并发吗

我理解您这个情况还不是多角色的场景,而是单个角色实例下的多路请求。这个我没实现过,但用max_session设置>1测试过,用的musetalk不是wav2lip,4090好像顶多2路的并发,再多就卡顿了。

byronv5 avatar Aug 25 '25 08:08 byronv5

改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。

您可以尝试下修改batch_size的值来降低单个数字人占用的显存 单实例仅一个推流地址时,batch_size为1时,700MB左右 --------------(设置64时为8322MiB)

Image

但batch_size设置的越小,调用推理模型也会越频繁(我目前没有发现其他副作用)。

huajin2002 avatar Aug 26 '25 08:08 huajin2002

改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。

您可以尝试下修改batch_size的值来降低单个数字人占用的显存 单实例仅一个推流地址时,batch_size为1时,700MB左右 --------------(设置64时为8322MiB)

Image 但batch_size设置的越小,调用推理模型也会越频繁(我目前没有发现其他副作用)。

batch_size在哪里设置?

wewaa avatar Sep 08 '25 03:09 wewaa

batch_size在哪里设置?

源代码app.py文件里 可以修改默认值(default=16),或者你在启动时配置--batch_size 1 333行 parser.add_argument('--batch_size', type=int, default=16, help="infer batch")

huajin2002 avatar Sep 08 '25 04:09 huajin2002

Hi, have you found a way to do multiprocessing? Regards.

jesulo avatar Oct 04 '25 15:10 jesulo

Hi, have you found a way to do multiprocessing? Regards.

同时启动多个数字人的瓶颈在于GPU算力上,这个开源项目并不能实现高并发 但可以尝试新的编码来提升效率(数字人仅讲话时访问服务器,降低服务器压力) 这种做法与该开源项目几乎无关,仅使用了相同的推理模型

前端:

  1. 循环播放一段的头尾帧一致的静默视频
  2. 向后端发起请求时指定数字人形象、音色、播报的文本

后端:

  1. 项目启动时要加载所有的数字人形象、不同的音色配置到内存中
  2. 接收到请求时根据文本音色生成语音、读取对应数字人形象推理嘴巴并合成全身的视频
  3. 将视频以流的方式返回给前端(可以在推理过程中异步处理,当推理多少帧后再合成视频并yield一次)

在此基础上还可以有以下优化:

  1. 若是长文本,后端生成语音的时间较长,前端可断句多次调用(需要前后端传递下句话的起始帧)
  2. 后端合成的全身视频可以优化为仅脸部视频(前端使用坐标自行覆盖)
  3. 多个workshop(生成语音、合成视频等),多个modelWorker(仅推理,workshop共享此modelWorker)

测试NVIDIA RTX A6000仅支持大约7个数字人同时推理而不出现卡顿情况(若数字人说话时间错开,可以支持更多数字人)

huajin2002 avatar Oct 17 '25 04:10 huajin2002

Hi, have you found a way to do multiprocessing? Regards.

同时启动多个数字人的瓶颈在于GPU算力上,这个开源项目并不能实现高并发 但可以尝试新的编码来提升效率(数字人仅讲话时访问服务器,降低服务器压力) 这种做法与该开源项目几乎无关,仅使用了相同的推理模型

前端:

  1. 循环播放一段的头尾帧一致的静默视频
  2. 向后端发起请求时指定数字人形象、音色、播报的文本

后端:

  1. 项目启动时要加载所有的数字人形象、不同的音色配置到内存中
  2. 接收到请求时根据文本音色生成语音、读取对应数字人形象推理嘴巴并合成全身的视频
  3. 将视频以流的方式返回给前端(可以在推理过程中异步处理,当推理多少帧后再合成视频并yield一次)

在此基础上还可以有以下优化:

  1. 若是长文本,后端生成语音的时间较长,前端可断句多次调用(需要前后端传递下句话的起始帧)
  2. 后端合成的全身视频可以优化为仅脸部视频(前端使用坐标自行覆盖)
  3. 多个workshop(生成语音、合成视频等),多个modelWorker(仅推理,workshop共享此modelWorker)

测试NVIDIA RTX A6000仅支持大约7个数字人同时推理而不出现卡顿情况(若数字人说话时间错开,可以支持更多数字人)

你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的

xlc-github avatar Oct 17 '25 06:10 xlc-github

你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的

你后端有测试完整视频是否有杂音吗?

前后端同步做法:

给图片标记帧序号,提供前端坐标文件的下载地址。 python代码示例: test.txt

""" 将图片的像素第一行设置为白色,将这条白线均分为十份 使用十位二进制法表示图片序号 黑色表示1白色表示0 """

多并发思路

我并没有使用webrtc哦,webrtc更适合直播,而不适合我现在要做的一对一的对话。 实现的多并发主要依赖之前提到的第三点优化,一张4060大约能启动四个model,如果每个处理请求的workshop独占一个model显然是浪费的。 我测试四个独占model,有四个并发的情况下,model推理在整个工作流程中的耗时约占1/3(一次请求需要文本转语音、获取数字人形象、推理前处理素材、model推理、合成视频),所以让一个model为不同的workshop工作提升还是不错的,不让model有一点的空闲。

huajin2002 avatar Oct 17 '25 07:10 huajin2002

你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的

你后端有测试完整视频是否有杂音吗?

前后端同步做法:

给图片标记帧序号,提供前端坐标文件的下载地址。 python代码示例: test.txt

""" 将图片的像素第一行设置为白色,将这条白线均分为十份 使用十位二进制法表示图片序号 黑色表示1白色表示0 """

多并发思路

我并没有使用webrtc哦,webrtc更适合直播,而不适合我现在要做的一对一的对话。 实现的多并发主要依赖之前提到的第三点优化,一张4060大约能启动四个model,如果每个处理请求的workshop独占一个model显然是浪费的。 我测试四个独占model,有四个并发的情况下,model推理在整个工作流程中的耗时约占1/3(一次请求需要文本转语音、获取数字人形象、推理前处理素材、model推理、合成视频),所以让一个model为不同的workshop工作提升还是不错的,不让model有一点的空闲。

多谢提供思路,目前后端测试的音频是不带杂音的,传到前端的音频块,由于同步问题导致音频块拼接问题,出现噪音等;

不过这里没怎么理解 #提供前端坐标文件的下载地址#

xlc-github avatar Oct 17 '25 07:10 xlc-github

多谢提供思路,目前后端测试的音频是不带杂音的,传到前端的音频块,由于同步问题导致音频块拼接问题,出现噪音等;

不过这里没怎么理解 #提供前端坐标文件的下载地址# 我是将所有坐标有序保存在json文件中:[[73,213,333,433],[74,214,332,432],[75,215,332,432]......] 第一张图片的帧序号为0,则取坐标数组的[0]数据

这个json文件是存储在服务器上的,服务端维护不同数字人的不同素材(全身图,脸部图,坐标等信息),所以需要给前端提供对应数字人素材的下载地址

哦对了,脸部图合成视频的话,就需要保证所有图片大小一致的,这时记录下每张脸部图的坐标即可

huajin2002 avatar Oct 17 '25 07:10 huajin2002