01
02
△高精数字人:BoBo
03
3.1 功能模块结构
3.2 概要流程设计
1、商品:挂接商品、商品转场等;
2、营销活动:抽奖、优惠券、红包雨等;
3、互动邀请:邀请用户点赞、关注、分享等;
4、为说话、动作、表情、切换背景、插入图片视频、位移、缩放等。
1、创建编辑剧本基本信息;
2、编排剧本:可以通过选取素材库中的各种素材,组合生成剧本。
用户行为反馈:支持对用户的点赞、分享、关注、加粉丝团等等用户行为做出反馈,使数字人主播能够与用户行为能够形成互动,提升直播间体验;
智能问答:支持根据一定的策略回复直播间内观众的消息,该问答功能通过接入百度大脑,提供强大的智能问答能力,使数字人主播更懂用户;
结合AI能力,主播还会有一些情景的交互插入,如直播间长时间冷清,主播会不高兴等等。
△直播间内画面多层混合
04
4.1 服务端架构
渲染引擎运行环境
DKE是一个快速、灵活、按需定制的Kubernetes部署引擎,基于DKE部署的K8S之上,运行着天牛平台以及数字人渲染引擎系统;
天牛平台是为私有化交付所打造的容器管理平台,目前ACG交付业务使用的数字人渲染引擎系统就是通过天牛进行私有化交付使用的;
显卡:人像渲染服务依赖于显卡。
渲染引擎服务依赖
基础软件:MySQL、ZK等,可以使用天牛数字人安装包内自带的,也可通过配置使用自定义的服务;
AI能力:1)虚拟形象生成技术:支持低成本,照片快速生成形象(PTA),支持捏脸系统,多维度自定义编辑形象。2)面部及动作捕捉技术:通过捕捉脸部表情与肢体动作,让真人实时驱动虚拟形象。3)语音技术:如语音识别(ASR)、智能问答对话(百度UNIT)、语音合成(TTS)等,帮助搭建智能语音对话系统,支持用户与虚拟形象轻松对话。
数字人渲染引擎
提供websocket服务接口,用于接收数字人驱动服务发送过来的指令,通过调用AI能力进行语音理解、对话生成、合成语音等,调用基于渲染引擎的人像渲染服务生成人像视频,终通过流媒体服务进行推流。
支持真人托管,使用真人托管平台能够通过使用摄像头或动作捕捉设备进行人像动作采集并转化生成数字人音视频画面。
提供业务配置平台和相关api进行数字人人像管理。
全自研渲染引擎支持数字人渲染所需的多项高性能渲染算法,包括仿真光线次表面散射属性的皮肤渲染材质、仿真各向异性特性的头发渲染材质以及眼睛渲染材质。
支持终端+云端部署运行,在终端低占用5M客户端包体积,性能对比商业引擎更加;在云端对接流媒体服务进行推流,可以满足直播、视频生产业务需求,支持在网页端或者超低端设备运行。全方面覆盖终端设备,少量参数同步即可对齐端云渲染需求。
数字人驱动服务
剧本系统
素材库:支持配置挂接商品及讲解文案、营销活动即讲解文案(抽奖、红包雨、优惠券)、场景话术素材(邀请分享、邀请点赞、邀请关注、剧本转场);
剧本编排:支持使用素材库中的素材来组合生成剧本;
实时互动:能够根据业务策略在剧本中的可打断位置插入主播发言等行为,比如感谢关注点赞等等;
同步数字人驱动服务:将编排好的剧本以及实时互动队列通过接口同步给数字人驱动服务。
第三方业务服务
4.2 数字人驱动服务
各模块概述
apiserver
队列
1、剧本队列
2、实时交互队列
worker
1、worker从节点
2、worker主节点(master)
对开播中的直播间和数字人渲染引擎维护长连接会话;
执行数字人直播间开关播调度、剧本调度、剧本队列调度、实时互动队列调度;
将队列指令转化成数字人渲染引擎可执行的DRML指令,并发送给渲染引擎。(DRML是⼀种以SSML为基础的标记语⾔,SSML(Speech Synthesis Markup Language)是语⾳合成系统中的标记语言,它以XML为基础,提供了⼀套标准⽅法来精细调整语⾳输出。DRML涵盖了SSML中对语⾳输出的控制⽅法,另外还定义了对数字⼈的动作控制、动作与语⾳的融合⽅式,以及在屏幕上引⼊其他视觉元素的⽅法。
主从选举
1、初始状态
2、进行选举
3、成为主节点
4、成为从节点
5、主节点异常
队列消费
直播间调度
存在直播间启动监听器,以协程形式定时自动执行,它会从数据库中加载当前数字人直播间状态为已启动(room_stauts=1)的直播间,并将加载的直播间通过channel信号的方式发送给直播间消费者管理器;
直播间消费者管理器通过监听channel接收直播间启动监听器发来的直播间,并为每个直播间启动一个Consumer协程;
为避免每个直播间被重复调度,master内部维护了一个直播间消费者注册中心,用于保证一个直播间不会被master重复调度。
剧本调度
1、剧本调度的三种情况
1.按重复执行次数逐次调度的剧本;
2.按编排顺序逐个调度的剧本;
3.master异常退出消费,恢复后继续执行上次中断的剧本。
consumer查找当前待执行的剧本:
没有待执行的剧本,则准备退出队列消费(等待实时队列消费完);
查找失败则退出consumer,等待下次被直播间调度过程重新调度;
查找到则准备启动队列调度,即进入流程2。
为当前直播间建立与数字人渲染引擎的长连接,并初始化长连接会话;
更新直播间剧本执行偏移量(记录当前直播间进入当前剧本);
启动协程并行执行“剧本队列调度” 流程、以及“交互队列调度”流程;
当前剧本队列调度执行完毕,返回流程1。
剧本队列调度
每次获取队列中的下一个seq_no,并获取该seq_no对应的参数;
更新当前剧本队列执行点为当前seq_no,并设置执行点状态为已启动
解析seq_no的指令参数,生成数字人渲染引擎的DRML指令;
生成ReuqestId(本次请求的标识)通过先前创建的长连接会话,使用渲染引擎的TEXT_RENDER能力往渲染引擎发送DRML指令;
接收长连接返回该ReuqestId的结果,一次TEXT_RENDER指令长连接会根据渲染过程做多次响应,如图:
等待长连接返回结果为渲染完成或失败、等待超时,则结束等待;
更新队列执行点状态为已执行,表示一个seq_no行完成,回到流程1;
若队列内没有未消费条目了,则开始检查交互队列是否有未消费条目,如果还有则继续等待交互队列消费完成,没有则通知交互队列停止调度,并退出自身剧本队列调度。
交互队列调度
交互队列调度每隔500ms根据当前记录的auto_seq_no(执行偏移量)查询一次数据库内的交互队列是否有下一条待执行的auto_seq_no,如果未找到则重复执行流程1;
更新当前剧本队列执行点为当前auto_seq_no,并设置执行点状态为已启动;
解析生成该auto_seq_no对应的DRML指令;
往数字人渲染引擎长连接会话中发送DRML指令(交互队列调度和剧本调度共享同一个长连接会话,通过即时发送指令到会话,结合剧本队列执行的DRML的可打断点,产生在剧本演示中插入实时交互行为的效果);
接收长连接返回该ReuqestId的结果;
等待长连接返回结果为渲染完成或失败、等待超时,则结束等待;
更新队列执行点状态为已执行,即一个auto_seq_no执行完成,回到流程1
同时交互队列调度器会监听剧本队列调度器发来的退出信号,一旦收到信号,则退出交互队列调度,不再继续轮询。
多直播间长连接维护
1、长连接初始化
连接数字人渲染引擎websocket;
基于websocket创建会话;
以数字人渲染引擎appid为标识,保存长连接句柄到全局map中,以备后续请求ws时使用;
启动心跳协程;
启动长连接响应监听分发协程。
2、长连接心跳
3、长连接请求
往长连接响应分发协程中注册一个channel,用来准备接收当前请求的RequestId的响应结果;
往长连接写入请求参数。
4、长连接响应
长连接响应分发协程,会统一监听和解析长连接返回的结果,将返回的RequestId写入对应的channel中;
通过等待该RequestId的channel信号,达到接收请求的响应结果目的。
5、长连接故障转移
6、多主节点支持
apiserver在注册数字人直播间时,会根据将集群env环境变量写入数字人直播间信息表中;
worker从节点会根据env变量来获取主节点锁,多个env变量即可产生出多个master节点;
master在进行数字人直播间调度时,会根据当前集群env来筛选取得对应的数字人直播间,即master只调度和自己env标识一致的直播间。
开关播
1、开播
(1)自动开播
业务侧通过调用注册数字人直播间接口注册数字人直播间;
master会自动检测即将到达预约开播时间的直播间,将需要开播的数字人直播间状态改为已启动;
master随即开始进行直播间调度等流程,即开始推流;
master调用百家号开播接口开播。
(2)手动开播
调用apiserver的注册数字人直播间接口添加数字人直播间;
调用启动数字人直播间接口(room/start),数字人直播间状态修改为已启动(room_status=1);
master即开始直播间调度等流程;
消费队列开始即推流开始,随后在百家号平台即可开播。
2、关播
(1)自动关播
master会在每个数字人直播间所有剧本队列消费完成后,等待直至实时队列消费完毕,退出队列消费者;
调用百家号关播接口;
并更新数字人直播间状态为已结束(room_status=-1)。
(2)手动关播
百家号平台先正常关播;
master会轮询当前正在消费中的所有数字人直播间的直播meta新状态,如果为已关播则修改room_status为-1
如果检测到消费中的数字人直播间的room_status为-1,则会向对应的直播间队列消费者协程发送信号,该直播间消费者协程收到信号就退出消费。
容灾
1、数字人渲染引擎异常
(1)渲染引擎服务多实例部署
(2)连接渲染引擎故障转移
如果某一个渲染引擎实例长连接无法创建,master内的长连接会话管理器会自动做2次重试以及切换实例重试;
如果某一个渲染引擎实例长连接可以创建,但是由于资源不足等原因无法初始化会话,master会退出当前直播间的队列调度,标记需要尝试使用下一个实例,并等待下一次被调度重试,被重新调度时,master会自动选取预设的列表中的下一个实例。
2、数字人驱动主节点故障转移
主节点宕机或异常时,则主节点无法给自己的任期续期,由此主节点锁会自动释放;
其他worker节点此后抢到锁便自动成为主节点;
新的主节点开始处理主节点相关任务,故障主节点转移到新主节点会在1s完成。
3、数字人驱动主节点故障恢复
(1)剧本调度异常恢复
数字人直播间数据表会存储当前调度的剧本的drama_seq_no(剧本调度序号),在该剧本得到调度的开始,master就会将drama_seq_no记录到表中;
当master从宕机等异常情况中恢复后,会读取drama_seq_no,并继续调度该剧本。
(2)剧本队列调度异常恢复
剧本队列调度在执行到每个队列条目开始时,会记录当前执行到的条目seq_no,并记录该seq_no的执行状态为执行中;
剧本队列调度在执行到每个队列条目结束时,更新该seq_no的执行状态为已执行;
当master从宕机等异常情况中恢复后,会读取seq_no及其执行状态,如果状态为执行中,表示该条目还未执行完master就挂了,需要重新执行该seq_no;如果为已执行,则继续执行下一个seq_no。
(3)实时交互队列调度异常恢复
(4)故障现场恢复
05
END