请教下,如何同时启动多个不同的数字人,然后每个数字人都对应的是单独的音色,并且都有独立的语音交互。
用不同的端口启呗
可以实现,要对里面的offer做出修改, 并替换增加opt的配置,然后预热
只要你的内存足够大,多线程启动对应的数字人,然后自己写对应页面切换就行了
可以实现,要对里面的offer做出修改, 并替换增加opt的配置,然后预热
比如我想只用一个前端页面,加载多个数字人模型在前端呈现,每个数字人都有自己的一套语音问答逻辑,点击某一个就是现在单独的效果。这种可以吗
改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。
改后台代码有点难度而且一张4090最多启2个(1个数字人占用10GB左右的显存)。最简单的就是你启用多个服务,由于一张卡顶多启2个数字人,所以建议分多张卡来部署,比如你部署了3个,那么对应地址就是ip1:8010、ip2:8010、ip3:8010,你前端界面上做个映射,一个下拉框对应一个数字人,切换的时候重新调用start,把ip换掉就可以实现切换了。我的项目已经跑通了(我是在5090上部署了3个,通过端口区分,因为32G比24G刚好多一个数字人的显存占用)。最终效果就是,通过和ai对话,由ai判断使用哪个角色从而实现了自动切换。
请教一下,作者提到支持多并发是否可以实现呢
我创建了多个推流地址作为数字人房间,但当多个房间请求时,公用的wav2lip推理模型就会存在排队情况
请问你有实现多并发吗
改后台代码有点难度而且一张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路的并发,再多就卡顿了。
改后台代码有点难度而且一张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)
但batch_size设置的越小,调用推理模型也会越频繁(我目前没有发现其他副作用)。
改后台代码有点难度而且一张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)
但batch_size设置的越小,调用推理模型也会越频繁(我目前没有发现其他副作用)。
batch_size在哪里设置?
batch_size在哪里设置?
源代码app.py文件里 可以修改默认值(default=16),或者你在启动时配置--batch_size 1
333行 parser.add_argument('--batch_size', type=int, default=16, help="infer batch")
Hi, have you found a way to do multiprocessing? Regards.
Hi, have you found a way to do multiprocessing? Regards.
同时启动多个数字人的瓶颈在于GPU算力上,这个开源项目并不能实现高并发 但可以尝试新的编码来提升效率(数字人仅讲话时访问服务器,降低服务器压力) 这种做法与该开源项目几乎无关,仅使用了相同的推理模型
前端:
- 循环播放一段的头尾帧一致的静默视频
- 向后端发起请求时指定数字人形象、音色、播报的文本
后端:
- 项目启动时要加载所有的数字人形象、不同的音色配置到内存中
- 接收到请求时根据文本音色生成语音、读取对应数字人形象推理嘴巴并合成全身的视频
- 将视频以流的方式返回给前端(可以在推理过程中异步处理,当推理多少帧后再合成视频并yield一次)
在此基础上还可以有以下优化:
- 若是长文本,后端生成语音的时间较长,前端可断句多次调用(需要前后端传递下句话的起始帧)
- 后端合成的全身视频可以优化为仅脸部视频(前端使用坐标自行覆盖)
- 多个workshop(生成语音、合成视频等),多个modelWorker(仅推理,workshop共享此modelWorker)
测试NVIDIA RTX A6000仅支持大约7个数字人同时推理而不出现卡顿情况(若数字人说话时间错开,可以支持更多数字人)
Hi, have you found a way to do multiprocessing? Regards.
同时启动多个数字人的瓶颈在于GPU算力上,这个开源项目并不能实现高并发 但可以尝试新的编码来提升效率(数字人仅讲话时访问服务器,降低服务器压力) 这种做法与该开源项目几乎无关,仅使用了相同的推理模型
前端:
- 循环播放一段的头尾帧一致的静默视频
- 向后端发起请求时指定数字人形象、音色、播报的文本
后端:
- 项目启动时要加载所有的数字人形象、不同的音色配置到内存中
- 接收到请求时根据文本音色生成语音、读取对应数字人形象推理嘴巴并合成全身的视频
- 将视频以流的方式返回给前端(可以在推理过程中异步处理,当推理多少帧后再合成视频并yield一次)
在此基础上还可以有以下优化:
- 若是长文本,后端生成语音的时间较长,前端可断句多次调用(需要前后端传递下句话的起始帧)
- 后端合成的全身视频可以优化为仅脸部视频(前端使用坐标自行覆盖)
- 多个workshop(生成语音、合成视频等),多个modelWorker(仅推理,workshop共享此modelWorker)
测试NVIDIA RTX A6000仅支持大约7个数字人同时推理而不出现卡顿情况(若数字人说话时间错开,可以支持更多数字人)
你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的
你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的
你后端有测试完整视频是否有杂音吗?
前后端同步做法:
给图片标记帧序号,提供前端坐标文件的下载地址。 python代码示例: test.txt
""" 将图片的像素第一行设置为白色,将这条白线均分为十份 使用十位二进制法表示图片序号 黑色表示1白色表示0 """
多并发思路
我并没有使用webrtc哦,webrtc更适合直播,而不适合我现在要做的一对一的对话。 实现的多并发主要依赖之前提到的第三点优化,一张4060大约能启动四个model,如果每个处理请求的workshop独占一个model显然是浪费的。 我测试四个独占model,有四个并发的情况下,model推理在整个工作流程中的耗时约占1/3(一次请求需要文本转语音、获取数字人形象、推理前处理素材、model推理、合成视频),所以让一个model为不同的workshop工作提升还是不错的,不让model有一点的空闲。
你好,我也在测试这个方案,我目前后端传脸部数据(坐标,idx),音频,这两个数据以datachannel的形式(base64)传到前端,由前端进行贴合,以及播放音频,但是目前前端播放的音频出现卡顿,甚至带有噪音,好像这种方式做到同步很难,想请教下你以视频流的形式传到前端,如果传脸部视频的话,那些坐标数据要以哪种形式传输呢,目前的webrtc中的流式传输,和datachannel两种形式做不到很好的同步,你这边是怎么做到多并发的
你后端有测试完整视频是否有杂音吗?
前后端同步做法:
给图片标记帧序号,提供前端坐标文件的下载地址。 python代码示例: test.txt
""" 将图片的像素第一行设置为白色,将这条白线均分为十份 使用十位二进制法表示图片序号 黑色表示1白色表示0 """
多并发思路
我并没有使用webrtc哦,webrtc更适合直播,而不适合我现在要做的一对一的对话。 实现的多并发主要依赖之前提到的第三点优化,一张4060大约能启动四个model,如果每个处理请求的workshop独占一个model显然是浪费的。 我测试四个独占model,有四个并发的情况下,model推理在整个工作流程中的耗时约占1/3(一次请求需要文本转语音、获取数字人形象、推理前处理素材、model推理、合成视频),所以让一个model为不同的workshop工作提升还是不错的,不让model有一点的空闲。
多谢提供思路,目前后端测试的音频是不带杂音的,传到前端的音频块,由于同步问题导致音频块拼接问题,出现噪音等;
不过这里没怎么理解 #提供前端坐标文件的下载地址#
多谢提供思路,目前后端测试的音频是不带杂音的,传到前端的音频块,由于同步问题导致音频块拼接问题,出现噪音等;
不过这里没怎么理解 #提供前端坐标文件的下载地址# 我是将所有坐标有序保存在json文件中:[[73,213,333,433],[74,214,332,432],[75,215,332,432]......] 第一张图片的帧序号为0,则取坐标数组的[0]数据
这个json文件是存储在服务器上的,服务端维护不同数字人的不同素材(全身图,脸部图,坐标等信息),所以需要给前端提供对应数字人素材的下载地址
哦对了,脸部图合成视频的话,就需要保证所有图片大小一致的,这时记录下每张脸部图的坐标即可
但batch_size设置的越小,调用推理模型也会越频繁(我目前没有发现其他副作用)。