图片
作者 | 薄志浩

导读:本文介绍了在数字人AI技术发展迅猛,整体AI数字人市场呈现高速增长的趋势下,与强调高实时性互动的直播业务场景的结合与应用,通过数字人渲染技术、强大的AI全栈能力、算力为虚拟主播赋能,在面部表情、肢体动作、问答对话以及情绪反馈等交互效果上都达到了十分生动拟人的效果,同时结合智能剧本的驱动技术,更是在电商代班场景下实现了7x24小时虚拟主播不间断带货直播的能力,产生了真人主播无法达成的价值和效果。

全文8740字,预计阅读时间22分钟。

01 背景

2022年开年以来,数字人几乎成为AI第一热门赛道,在诸多应用场景大放光彩。IDC 发布《中国 AI 数字人市场现状与机会分析,2022》报告。报告显示:中国 AI 数字人市场规模呈现高速增长趋势,到2026年中国AI数字人市场规模将达到102.4亿元人民币。目前市场上数字人种类繁多,有泛娱乐型数字人/企业级服务数字人,如浦发银行的智能数字人客服,以及百度智能云曦灵打造的 AI 手语主播,已经为2700万听障用户提供直播及赛事的手语服务;还有中之人/真人驱动的演艺型数字人,如其中几个突出的是百度云的希加加,快手的关小芳等等,数字人在一些领域已经发挥出明显的商业价值,尤其是音视频的实时直播场景,在这个背景下,基于目前的直播带货平台,应用数字人技术将会创造更多的产品和商业价值。

图片

图片

02 业务

百度电商直播平台是继承主播开播、带货、商品讲解、直播分发、下单购买的综合平台,依托百度流量池,基于众多百家号创作者和UGC主播通过线上直播丰富的内容形式,给用户提供更个性化、更生动、更高效的消费体验。与数字人的结合主要是基于代班主播的产品形态,提供虚拟数字人主播直播带货的能力:

图片
△高精数字人:BoBo

在直播层面,同真人主播相比,数字人可实现24小时全程直播,且可控性强、形象稳定,能有效避免人设“塌房”,可以作为品牌先行试水元宇宙的切入口和纽带。

7月19日,百度APP AI探索官度晓晓携手龚俊数字人举行了一场:数字人脱口秀直播,并将带货内容拓展至元宇宙。百度此次用数字人脱口秀打开直播带货,就是Web3时代下探索数字人可能性的创意尝试,为直播带货带来了新鲜感。直播平台还内置了丰富精美直播间场景,从演播厅到舞台,可按需匹配,一键解决搭建直播场景投入大、质感不高的难题;不仅如此,便捷的开播平台编辑器可预设直播模版,任意组合脚本、商品、才艺,降低直播的准备门槛。对于商家而言,拥有一个稳定、高效、可控的数字人主播,和不受时间空间限制的直播间,大幅降低企业运营成本,是性价比之选。

03 整体架构

3.1 功能模块结构

图片

整体功能模块分为三层:

数字人资产:主要包括数字人形象的生成、资产管理、个性化捏脸能力;数字人声音系统(包括语音合成(多音色支持)语调语速等能力配置,以及唇动服务);数字人动作系统(指令触发的各种身体、手势、面部的动作);

直播互动:支持数字人直播间内的功能和音视频等互动能力,支持B端的剧本编排,直播间内玩法功能互动,主播AI智能对话问答,以及中之人、真人接管能力;

流媒体控制:将渲染的音视频数据进行编码推流,以及通过导播台对音视频做一些插入修改等丰富的功能,如混画合流、字幕插入等能力。

3.2 概要流程设计

图片

剧本系统

剧本系统支持B端主播配置自己的代班主播剧本,即直播间内一系列有序的任务编排和互动效果配置;数字人驱动服务为剧本编排服务提供了队列配置和运行调度的能力支撑,剧本编排服务通过该能力能够灵活组织数字人直播间需要执行的内容。

基于此,剧本系统服务支持了素材库配置:

1、商品:挂接商品、商品转场等;

2、营销活动:抽奖、优惠券、红包雨等;

3、互动邀请:邀请用户点赞、关注、分享等;

4、为说话、动作、表情、切换背景、插入图片视频、位移、缩放等。

另外编排上可以支持:

1、创建编辑剧本基本信息;

2、编排剧本:可以通过选取素材库中的各种素材,组合生成剧本。

实时交互:除了既定剧本顺序执行以外,数字人主播还会对用户进行实时的交互,以达到更真实拟人的效果;实时交互的处理分为以下两类:

  1. 用户行为反馈:支持对用户的点赞、分享、关注、加粉丝团等等用户行为做出反馈,使数字人主播能够与用户行为能够形成互动,提升直播间体验;
  2. 智能问答:支持根据一定的策略回复直播间内观众的消息,该问答功能通过接入百度大脑,提供强大的智能问答能力,使数字人主播更懂用户;
  3. 结合AI能力,主播还会有一些情景的交互插入,如直播间长时间冷清,主播会不高兴等等。

并且任务编排系统可以智能的根据数字人实时的渲染状态,选择最合适的打断实际插入对应的互动,且不影响后续剧本进行,达到和真实主播最接近的效果。

数字人音频服务会整合众多AI能力,其中包括通过TTS语音合成,生成支持多种可定制的音色的音频数据;通过VTA服务,生成与对应模型适配的唇动渲染数据;基于百度unit进行对话配置以及意图模型训练,支持和主播提问,闲聊等智能问答功能

驱动服务根据剧本任务下发动作渲染指令和直播间信号指令,以及数字人音频服务下发的每一帧音频和唇动数据,整合下发到云渲染服务的会话中心;会话中心负责与上游(直播业务)、下游(渲染引擎)、其他模块(导播台)等建连,维持心跳,收敛会话服务;收集包装驱动数据下发给云渲染服务:

云渲染服务通过接受会话中心的数据,包括各种动作指令,各种部位骨骼bs驱动数据来实时渲染数字人模型(渲染引擎包括自研、UE4、unity3D等),同步生成视频流数据,返回到BRTC服务模块进行编码推流到LSS,LSS云导播台依托百度智能云的音视频直播、媒体、AI等技术,支持强大的直播实时编辑能力,如数字人直播的一些视频混画,背景合成,字幕插入等功能;编辑之后进而推流通过CDN的边缘节点,最终到直播源站。

图片

△直播间内画面多层混合

04 技术实现详述

4.1 服务端架构

图片

渲染引擎运行环境

  1. DKE是一个快速、灵活、按需定制的Kubernetes部署引擎,基于DKE部署的K8S之上,运行着天牛平台以及数字人渲染引擎系统;
  2. 天牛平台是为私有化交付所打造的容器管理平台,目前ACG交付业务使用的数字人渲染引擎系统就是通过天牛进行私有化交付使用的;
  3. 显卡:人像渲染服务依赖于显卡。

渲染引擎服务依赖

  1. 基础软件:MySQL、ZK等,可以使用天牛数字人安装包内自带的,也可通过配置使用自定义的服务;
  2. AI能力:1)虚拟形象生成技术:支持低成本,照片快速生成形象(PTA),支持捏脸系统,多维度自定义编辑形象。2)面部及动作捕捉技术:通过捕捉脸部表情与肢体动作,让真人实时驱动虚拟形象。3)语音技术:如语音识别(ASR)、智能问答对话(百度UNIT)、语音合成(TTS)等,帮助搭建智能语音对话系统,支持用户与虚拟形象轻松对话。

数字人渲染引擎

基于ACG-云渲染方案

  1. 提供websocket服务接口,用于接收数字人驱动服务发送过来的指令,通过调用AI能力进行语音理解、对话生成、合成语音等,调用基于渲染引擎的人像渲染服务生成人像视频,最终通过流媒体服务进行推流。
  2. 支持真人托管,使用真人托管平台能够通过使用摄像头或动作捕捉设备进行人像动作采集并转化生成数字人音视频画面。
  3. 提供业务配置平台和相关api进行数字人人像管理。

基于AR-端云一体渲染方案

  1. 全自研渲染引擎支持数字人渲染所需的多项高性能渲染算法,包括仿真光线次表面散射属性的皮肤渲染材质、仿真各向异性特性的头发渲染材质以及眼睛渲染材质。
  2. 支持终端+云端部署运行,在终端最低占用5M客户端包体积,性能对比商业引擎更加优秀;在云端对接流媒体服务进行推流,可以满足直播、视频生产业务需求,支持在网页端或者超低端设备运行。全方面覆盖终端设备,少量参数同步即可对齐端云渲染需求。

数字人驱动服务

用于驱动数字人渲染引擎执行相应的指令,对业务屏蔽了和数字人渲染引擎交互的复杂逻辑,提供http接口给业务方接入,方便业务快速接入数字人直播能力。本服务由架构组server团队开发维护,具体在“数字人驱动服务设计”中介绍。

剧本系统

主要功能包括:

  1. 素材库:支持配置挂接商品及讲解文案、营销活动即讲解文案(抽奖、红包雨、优惠券)、场景话术素材(邀请分享、邀请点赞、邀请关注、剧本转场);
  2. 剧本编排:支持使用素材库中的素材来组合生成剧本;
  3. 实时互动:能够根据业务策略在剧本中的可打断位置插入主播发言等行为,比如感谢关注点赞等等;
  4. 同步数字人驱动服务:将编排好的剧本以及实时互动队列通过接口同步给数字人驱动服务。

第三方业务服务

目前这一层只有直播电商,未来根据需要也可以接入咨询,媒体、演艺秀场等其他业务。

4.2 数字人驱动服务

图片

各模块概述

apiserver

对外提供http接口,处理业务方的剧本配置(人像选择、背景设置、重复执行次数)、需要数字人执行的行为指令队列(包括:剧本队列、实时交互队列),数字人直播间状态控制等请求,在本架构也属于队列生产者。

队列

驱动服务维护两个先进先出队列,分别为:剧本队列、实时交互队列。

1、剧本队列

开播前预先编排好的队列,数字人直播间启动后,主节点会启动剧本队列消费,然后数字人按照预先编排好的内容执行,例如:开播中需要数字人演示的商品讲解、抽奖、红包雨等,会提前同步到剧本队列中。

2、实时交互队列

开播中需要实时插入原先编排剧本的队列,以支持数字人给用户互动提供反馈,例如:数字人主播感谢送礼关注等,可以通过实时交互队列实现。

worker

1、worker从节点

未当选为主节点的节点,它只负责定时参与选举。

2、worker主节点(master)**

当选为主节点的节点,作为消费者,消费生产者产生的队列,主要支持:

  • 对开播中的直播间和数字人渲染引擎维护长连接会话;
  • 执行数字人直播间开关播调度、剧本调度、剧本队列调度、实时互动队列调度;
  • 将队列指令转化成数字人渲染引擎可执行的DRML指令,并发送给渲染引擎。(DRML是⼀种以SSML为基础的标记语⾔,SSML(Speech Synthesis Markup Language)是语⾳合成系统中的标记语言,它以XML为基础,提供了⼀套标准⽅法来精细调整语⾳输出。DRML涵盖了SSML中对语⾳输出的控制⽅法,另外还定义了对数字⼈的动作控制、动作与语⾳的融合⽅式,以及在屏幕上引⼊其他视觉元素的⽅法。

主从选举

1、初始状态

同一个集群中每个worker实例都有一个取值一致的env环境变量,作为所在集群分布式锁标识。此时还未产生master节点,集群分布式锁还是处于释放状态。

2、进行选举

初始状态下,集群内所有正常运行中的实例会定时通过redis的setnx指令抢占集群分布式锁进行选举。

3、成为主节点

抢到锁的则成为master主节点,当选为主节点后,会定时执行心跳,给抢到的锁进行续期,主节点会维护与数字人渲染引擎的长连接、执行队列消费、直播间自动开关播。

4、成为从节点

未抢到锁的则依旧继续担任worker节点,会定时进行选举,除此之外没有其他操作。

5、主节点异常

主节点异常,则会没有心跳,此时,变成初始状态、进行选举,集群中其他某个worker节点抢到锁之后会成为主节点。

队列消费

整体依靠各层级的调度实现,层级关系如下图,以下各层级的调度均使用golang的channel以生产者消费者模型实现。

图片

直播间调度
  • 存在直播间启动监听器,以协程形式定时自动执行,它会从数据库中加载当前数字人直播间状态为已启动(room\_stauts=1)的直播间,并将加载的直播间通过channel信号的方式发送给直播间消费者管理器;
  • 直播间消费者管理器通过监听channel接收直播间启动监听器发来的直播间,并为每个直播间启动一个Consumer协程;
  • 为避免每个直播间被重复调度,master内部维护了一个直播间消费者注册中心,用于保证一个直播间不会被master重复调度。
剧本调度

一个直播间可以关联多个剧本,多个剧本可以按顺序编排,每个剧本可以执行1次或多次。

1、剧本调度的三种情况

被调度的剧本分以下三种情况:

1.按重复执行次数逐次调度的剧本;

2.按编排顺序逐个调度的剧本;

3.master异常退出消费,恢复后继续执行上次中断的剧本。

2、调度流程

图片

  • consumer查找当前待执行的剧本:
  • 没有待执行的剧本,则准备退出队列消费(等待实时队列消费完);
  • 查找失败则退出consumer,等待下次被直播间调度过程重新调度;
  • 查找到则准备启动队列调度,即进入流程2。
  • 为当前直播间建立与数字人渲染引擎的长连接,并初始化长连接会话;
  • 更新直播间剧本执行偏移量(记录当前直播间进入当前剧本);
  • 启动协程并行执行“剧本队列调度” 流程、以及“交互队列调度”流程;
  • 当前剧本队列调度执行完毕,返回流程1。
剧本队列调度

图片

队列中的指令顺序通过seq_no指定,会被按照从小到大的顺序依次执行,每次调度按照如下流程:

  1. 每次获取队列中的下一个seq_no,并获取该seq_no对应的参数;
  2. 更新当前剧本队列执行点为当前seq_no,并设置执行点状态为已启动
  3. 解析seq_no的指令参数,生成数字人渲染引擎的DRML指令;
  4. 生成ReuqestId(本次请求的唯一标识)通过先前创建的长连接会话,使用渲染引擎的TEXT_RENDER能力往渲染引擎发送DRML指令;
  5. 接收长连接返回该ReuqestId的结果,一次TEXT_RENDER指令长连接会根据渲染过程做多次响应,如图:

图片

其中:如果drml指令渲染失败,3会返回RENDER\_ERROR;

  1. 等待长连接返回结果为渲染完成或失败、等待超时,则结束等待;
  2. 更新队列执行点状态为已执行,表示一个seq\_no行完成,回到流程1;
  3. 若队列内没有未消费条目了,则开始检查交互队列是否有未消费条目,如果还有则继续等待交互队列消费完成,没有则通知交互队列停止调度,并退出自身剧本队列调度。
交互队列调度

图片

交互队列调度和剧本队列调度并行启动执行,执行流程如下:

  • 交互队列调度每隔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、长连接心跳

长连接在初始化的同时,master会启动一个协程,该协程每隔3s向数字人渲染引擎发送心跳。如果数字人渲染引擎如果30s内没有检测到心跳,会自动释放资源。

3、长连接请求
  • 往长连接响应分发协程中注册一个channel,用来准备接收当前请求的RequestId的响应结果;
  • 往长连接写入请求参数。
4、长连接响
  • 长连接响应分发协程,会统一监听和解析长连接返回的结果,将返回的RequestId写入对应的channel中;
  • 通过等待该RequestId的channel信号,达到接收请求的响应结果目的。
5、长连接故障转移

这一点在 “容灾 - 数字人渲染引擎异常” 中描述。

6、多主节点支持

在需要多主节点的场景中,例如:划分预览机和线上,或者需要增加集群处理能力的情况下,可以通过给实例设置不同的env,来达到划分出多集群多主节点的目的,不同集群之间互不影响,原理是:

  • apiserver在注册数字人直播间时,会根据将集群env环境变量写入数字人直播间信息表中;
  • worker从节点会根据env变量来获取主节点锁,多个env变量即可产生出多个master节点;
  • master在进行数字人直播间调度时,会根据当前集群env来筛选取得对应的数字人直播间,即master只调度和自己env标识一致的直播间。

开关播

1、开播

在百家号平台开播数字人需要先创建预约直播间,预约创建完成后,支持以下两种方式启动数字人直播间:

(1)自动开播

master到点自动启动数字人推流并开播,具体如下:

  1. 业务侧通过调用注册数字人直播间接口注册数字人直播间;
  2. master会自动检测即将到达预约开播时间的直播间,将需要开播的数字人直播间状态改为已启动;
  3. master随即开始进行直播间调度等流程,即开始推流;
  4. master调用百家号开播接口开播。
(2)手动开播

数字人驱动服务提供了手动启动数字人直播间的能力,当需要在指定时间之前提前开播,可通过如下方式手动开播:

  1. 调用apiserver的注册数字人直播间接口添加数字人直播间;
  2. 调用启动数字人直播间接口(room/start),数字人直播间状态修改为已启动(room\_status=1);
  3. master即开始直播间调度等流程;
  4. 消费队列开始即推流开始,随后在百家号平台即可开播。
2、关播
(1)自动关播

master在所有队列执行完毕后,会停止数字人直播间推流,具体如下:

  1. master会在每个数字人直播间所有剧本队列消费完成后,等待直至实时队列消费完毕,退出队列消费者;
  2. 调用百家号关播接口;
  3. 并更新数字人直播间状态为已结束(room\_status=-1)。
(2)手动关播

如需要手动停止数字人推流:

  1. 百家号平台先正常关播;
  2. master会轮询当前正在消费中的所有数字人直播间的直播meta最新状态,如果为已关播则修改room\_status为-1
  3. 如果检测到消费中的数字人直播间的room\_status为-1,则会向对应的直播间队列消费者协程发送信号,该直播间消费者协程收到信号就退出消费。

容灾

以下列出了各种异常情况,及其对应的处理策略

1、数字人渲染引擎异常
(1)渲染引擎服务多实例部署

部署多套渲染引擎实例,使用同一套mysql数据库,使得多套渲染引擎的配置保持同步,使同一个appid、appkey,可以在不同实例上均可使用

(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)故障现场恢复

这里的“现场”指的是数字人在执行中的人像位置坐标、人像大小、直播间背景等信息,这些信息数字人驱动服务会在数字人DRML执行过程中进行保存。在数字人驱动服务在遇到异常恢复时,如果不做现场恢复,会造成异常恢复后人像坐标、大小、背景等元素与预期不符的情况,因此,在异常恢复时,数字人驱动服务会先读取保存的现场信息,并通过执行现场信息对应的DRML恢复现场。

05 小结

本文详细的阐述了基于数字人云渲染技术方案在直播业务架构中的应用,以及与众多AI能力的相结合,虚拟主播在今年是热门IP,强互动的直播场景无疑是数字人渲染的重点关注对象,后续渲染技术进一步完善和创新,将数字人直播间更加拟人化、生动、吸引眼球是我们规划的方向,尽可能应用到更大更多的场景里面。

特别感谢:感谢AIG增强现实技术团队与ACG智能云团队为云渲染服务共建提供技术支持。

————————END————————

推荐阅读:

百度工程师教你玩转设计模式(工厂模式)

超大模型工程化实践打磨,百度智能云发布云原生 AI 2.0 方案

前后端数据接口协作提效实践

前端的状态管理与时间旅行:San实践篇

百度App 低端机优化-启动性能优化(概述篇)

面向大规模数据的云端管理,百度沧海存储产品解析

增强分析在百度统计的实践


百度Geek说
246 声望51 粉丝