2D数字人交互SDK-iOS版
一、产品介绍
提供端渲染交互SDK-2D小样本数字人,可以通过文本或PCM音频数据完成对虚拟人实时驱动。
1.1、适用场景特点
部署成本低:支持移动端 APP 快速集成,人像渲染及唇形推理本地化完成,无需依赖云端持续算力支持;
网络依赖小:适配移动网络(4G/5G)与 WiFi 环境,可落地于金融 APP 客服、政务移动端咨询、教育类 APP 伴学等场景;
1.2、核心功能
公共形象租赁:提供半身、全身的2D小样本数字人形象,覆盖多种场景,支持客户快速集成使用;
专属形象定制:支持定制专属的2D小样本数字人形象;
实时播报渲染:支持数字人实时播报,适配移动端对话问答交互场景;
1.3、SDK下载链接
1.4、SDK的详细使用
1.4.1、在初始化页面:
第一次进入demo之后,请填写appKey、seceretKey和时长包,如需文本驱动请填写ttsId和ttsKey,然后先点击确认使用按钮(注意:时长包的确认使用,如果已经续期成功就不用点击了),再点击初始化SDK按钮,最后点击SDK授权+启动数字人,其他按钮请不要点击了。
1.4.2、进入数字人页面:
有两种播报模式,一种是普通播报,一种是流式播报,可点击右上角进行切换(流式播报切换到普通播报之前,需要先关闭流式播报)。
1.4.2.1、普通播报
(1)播报功能的使用:需要使用文本播报或音频播报能力,其中文本驱动是播放文本信息,播放PCM播放的是本地PCM文件。 普通播报一次只可播报一条数据(在语音播报期间不可以点击文本播放或音频播放),可以插入播报,插入播报有插入音频播报和插入文本播报(注意:如未播报语音,插入播报会失败的),插入的播报会立即在当前播报中插入播报。
(2)切换形象:如需切换其他形象必须要有一个定制的形象包《具体可参考本文档9.1、定制人像包替换本地数字人像包》(注意:在播报中不可切换形象)。
(3)暂停/继续播报:暂停播报可使正在播报的内容暂停,继续播报可使已经暂停的内容恢复播报。
(4)打断播报:打断播报可使所有的普通播报(包括插入的所有播报)停止,且不可恢复。
(5)能力释放:可释放资源并且退出数字人页面。
1.4.2.2、流式播报
流式播报就是可持续的播报,可把新的播报追加到当前播报后边。
(1)播报功能的使用:首先点击打开流式播报按钮打开流式播报,流式播报需要点击文本播报或音频播报,其中文本播报就是文本驱动,音频播报播放的是本地PCM文件。(在播报期间点击文本播报或音频播报就是把新的播报数据追加在当前播报的数据后边进行播报)。
在播报期间可以插入播报,插入播报的时候需要点击开始流式插播按钮,这时进入插播模式(插播期间不支持点击文本播报和音频播报按钮,请勿在插播期间进行持续播报),当前播报就暂停了,插入播报有插入音频播报和插入文本播报,插入的播报会立即播报出来,当不需要插播的时候,点击停止流式插播按钮,退出插播模式,进入正常播报流程。
(2)切换形象:如需切换其他形象必须要有一个定制的形象包《具体可参考本文档9.1、定制人像包替换本地数字人像包》(注意:在播报中不可切换形象)。
(3)暂停/继续播报:暂停播报可使正在播报的内容暂停,继续播报可使已经暂停的内容恢复播报。
(4)打断播报:打断播报可使所有的流式播报(包括插入的所有播报)停止,不可恢复。
(5)能力释放:可释放资源并且退出数字人页面。
二、SDK接入和集成
1、支持的系统和硬件版本
| 系统 | 支持 iOS 12 以上 |
|---|---|
| CPU架构 | arm64-v8a |
| 网络 | 支持WIF及移动网络。如果使用云端TTS(以文本方式驱动数字人),设备带宽(用于数字人的实际带宽)期望10mbps及以上。 |
| 开发IDE | Xcode 15.2以上 |
| 内存要求 | SDK可用于数字人的内存 >= 600MB |
2、SDK集成
2.1、将下载得到的framework文件和a文件在framework,librarties,and embedded content中进行导入


2.2、添加以下系统库

2.3、在工程中配置如下参数
2.3.1、库引用地址

2.3.2、授权相关
license需要额外申请, 提供Bundle Identifier 给到百度方,该信息用于创建授权项目使用,获取方式参考以下截图

三、SDK调用及API说明
1、初始化相关
1.1、初始化SDK
初始化是指数字人资源以及形象资源初始化, 调用方式参考接口相关文档
appKey、seceretKey为一台设备独有,一个设备要使用数字人必须要有一对appKey、seceretKey,使用这两个参数就可以使用音频驱动了。
如需文本驱动,就必须要有一对ttsId、ttsKey,ttsId和ttsKey为组件平台创建的tts合成应用的appId和appKey,tts音色参考:https://cloud.baidu.com/doc/AI_DH/s/plyy6xhi0。
1-(void)initSdk:(VirtualInitParam *) param;
参数说明:
| 参数名 | 取值 | 说明 |
|---|---|---|
| virtualInitParam | VirtualInitParam | 非空 |
VirtualInitParam参数说明
| 参数名 | 取值 | 说明 |
|---|---|---|
| isProjectAuth | YES / NO | 是否为项目授权, YES: 项目授权 NO: 设备授权 |
| appKey / secretKey | appKey / projectAK | 非空,这两个值,由百度提供,请向百度申请。 |
| secretKey / projectSK | ||
| ttsId / ttsKey | ttsId | 如需文本驱动,就必须要有一对ttsId、ttsKey。请在组件平台创建tts合成应用, 获取方式请参考文档:https://cloud.baidu.com/doc/AI_DH/s/plyy6xhi0 |
| ttsKey | ||
| envType | VIETUAL_RELEASE | 线上环境 |
| VIETUAL_DEVELOP | 开发环境 | |
| VIETUAL_PRE_RELEASE | 预发布环境 |
调用示例
1VirtualInitParam *initParam = [[VirtualInitParam alloc] init];
2 initParam.envType = VIETUAL_DEVELOP;
3 initParam.isProjectAuth = _authType == AUTH_PROJECT ? YES : NO;
4 initParam.appKey = appKey;
5 initParam.seceretKey = seceretKey;
6 initParam.ttsId = ttsId;
7 initParam.ttsKey = ttsKey;
8 _engine = [[VirtualEngine alloc] init];
9 _engine.delegate = self;
10 [_engine initSdk:initParam];
1.2、人像导入
1、将获取到的.tar.gz 压缩包解压,2、修改文件夹名称,名称要求为全数字, 3、将文件夹重新压缩为.zip并上传至云存储中 4、获取该压缩包的下载地址
用于将人像下载并存到非内置目录下
1-(void)downloadFigure:(int)visualize figurePath:(NSString *)figurePath figureBlok:(FigureBlok)figureBlok
| 参数名 | 取值 | 说明 |
|---|---|---|
| visualize | 人像文件名称 | 必须为全数字 |
| figurePath | 人像下载地址 | 地址的源文件格式为.zip |
| figureBlok | 回调值 | 下载人像的进度以及状态 |
FigureBlok
| code | 说明 |
|---|---|
| FIGURE_DOWNLOAD_START | 开始下载人像 |
| FIGURE_DOWNLOAD_PROGRESS | 人像下载中 |
| FIGURE_DOWNLOAD_FINISH | 人像下载完成 |
| FIGURE_DOWNLOAD_ERROR | 人像下载失败 |
| FIGURE_DOWNLOAD_CHECK | 人像效验失败 |
| FIGURE_DOWNLOAD_UNPACKING_FAIL | 人像解压失败 |
| FIGURE_DOWNLOAD_OK | 流程结束,状态OK |
调用示例
1[_virtualEngine downloadFigure:visualize figurePath:figurePath figureBlok:^(FigureEvent event, id _Nullable responseObject) {
2 NSLog(@"event: %ld data: %@", event, responseObject);
3 }];
1.3、更新ttsId和ttsKey参数
ttsId和ttsKey为组件平台创建的tts合成应用的appId和appKey,获取方式请参考文档:https://cloud.baidu.com/doc/AI_DH/s/plyy6xhi0。
1-(BOOL)updateTtsParam:(NSString *)ttsId ttsKey:(NSString *)ttsKey
参数说明:
| 参数名 | 取值 | 说明 |
|---|---|---|
| ttsId | 平台APPID |
如果需要合成语音,就必须要有一对ttsId、ttsKey。请在组件平台创建tts合成应用 获取方式请参考文档: https://cloud.baidu.com/doc/AI_DH/s/plyy6xhi0 |
| ttsKey | 平台APPKey |
调用示例
1BOOL upTts = [_virtualEngine updateTtsParam:@"open appID" ttsKey:@"open appkey"];
2、SDK授权
授权是针对数字人功能能力授权,如果不授权或者授权不通过将无法使用数字人功能,授权方式可参考文档
2.1、获取SDK授权状态
1-(void)getOauthStat;
调用示例
1self.virtualAuth = [[VirtualAuth alloc ] init];
2 self.virtualAuth.delegate = self;
3- (void)getAuthStatusButtonTapped {
4 if (self.virtualAuth) {
5 [self.virtualAuth getOauthStat];
6 }
7}
2.2、使用时长码
当使用新的 appKey,seceretKey 时必须进行激活,激活方式为使用时长码激活,时长码会随着appKey,seceretKey 提供,使用项目授权方式时不需要时长码激活。
1-(void)renewExpirationDate:(NSString *)activateCode;
参数定义:
| 参数名 | 取值 | 说明 |
|---|---|---|
| activateCode | 非空 | 有效的激活码 |
调用示例
1if (self.virtualAuth) {
2 [self.virtualAuth renewExpirationDate:activateCode];
3 }
2.3、SDK授权初始化
数字人能力授权, 成功后可执行数字人相关逻辑
1-(void)initLicenseBacth;
调用示例
1if (self.virtualAuth) {
2 [self.virtualAuth initLicenseBacth];
3 }
2.4、换绑授权码设备
当一个授权码还存在有效期,但是设备坏了的情况下,可以使用这个接口进行授权设备的换绑,使用项目授权方式时不可进行换绑。
换绑接口有次数限制,非特殊情况不宜调用
1-(void)changeDeviceBind;
调用示例
1if (self.virtualAuth) {
2 [self.virtualAuth changeDeviceBind];
3 }
3、数字人形象
数字人是通过Player 对象进行管理, 每次初始化要求为一个Player对象,用于调用数字人相关操作接口,具体接口参考接口文档,数字人显示部分可参考demo CloudController 示例代码
3.1、数字人形象初始化
3.1.1、初始化Player
请注意:初始化Player后,请先设置数字人形象《具体可参考本文档3.1.5、设置数字人形象》。
1- (instancetype)initWithFrame:(UIView *)view;
| 参数名 | 取值 |
|---|---|
| view | 用于显示数字人的view |
| 返回值 | 用于Player 相关接口后续调用 |
调用示例
1self.player = [[VirtualPlayer alloc] initWithFrame:backView];
2 self.player.delegate = self;
3.1.2、设置背景图
如果需要背景为透明状态则无需调用此接口设置背景
图片必须使用.png 格式图片,操作方式: 1、将图片放到.bundle根目录下; 2、获取bundle 内的地址,详情请参考 示例demo CloudController.m viewDidLoad 函数部分
1-(void)setCustomBackground:(NSString *)backgroundPath;
| 参数名 | 取值 |
|---|---|
| backgroundPath | 图片地址 |
调用示例
1[_player setCustomBackground:_backgroundPath];
3.1.3、设置数字人形象
1-(void)setVirtualModel:(Model *)model displayMode:(DisplayMode)displayMode;
| 参数名 | 类型 | 取值 |
|---|---|---|
| model | Model | visualize:形象ID,visualize值默认是10002,如加载定制人像包,visualize值则要大于0且不等于20,也不能等于10001-11000中的数,还不能重复,visualize值为数字人像包中的文件夹名字《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 figureId: 人像资源ID,定制人像资源必须传非null值,只有默认人像(目前是10002)可以传null,该值是调用生成人像的API接口返回的,figureId就是下载的人像包文件夹内的sdk.info文件里的figure值《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 |
| displayMode | DisplayMode | RENDER_ONLY: 普通模式, 默认 |
调用示例
1[_player setVirtualModel:[[Model alloc] initWithParam:10002 figureId:@"675baaad80c94cddd1d89dc1"] displayMode:RENDER_ONLY];
3.1.4、形象模型MD5 校验
非必需函数, 如果校验模型完整性时调用
1-(void)checkvirtualModel:(Model *)model;
| 参数名 | 取值 |
|---|---|
| model | visualize:形象ID,visualize值默认是10002,如加载定制人像包,visualize值则要大于0且不等于20,也不能等于10001-11000中的数,还不能重复,visualize值为数字人像包中的文件夹名字《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 figureId: 人像资源ID,定制人像资源必须传非null值,只有默认人像(目前是10002)可以传null,该值是调用生成人像的API接口返回的,figureId就是下载的人像包文件夹内的sdk.info文件里的figure值《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 |
调用示例
1[_player checkvirtualModel:[[Model alloc] initWithParam:10002 figureId:@"675baaad80c94cddd1d89dc1"]];
3.2、形象展示
1- (void)onResume;
调用示例
1[_player onResume];
3.3、数字人形象暂停
1- (void)onPause;
调用示例
1[_player onPause];
3.4、数字人形象切换
1-(void)changeVirtualModel:(Model *)model;
| 参数名 | 取值 |
|---|---|
| model | visualize:形象ID,visualize值默认是10002,如加载定制人像包,visualize值则要大于0且不等于20,也不能等于10001-11000中的数,还不能重复,visualize值为数字人像包中的文件夹名字《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 figureId: 人像资源ID,定制人像资源必须传非null值,只有默认人像(目前是10002)可以传null,该值是调用生成人像的API接口返回的,figureId就是下载的人像包文件夹内的sdk.info文件里的figure值《具体可参考本文档9.1、定制数字人像包替换本地数字人像包》 |
调用示例
1[_player changeVirtualModel:_virtualModels[_changeCount]];
3.5、数字人形象释放
1- (void)destroy;
调用示例
1[_player destroy];
4、普通模式驱动数字人
普通模式下播报数据,与流式模式下不同的是流式模式可持续播报而普通模式单次只可播报一条数据,具体调用参考接口文档
4.1、PCM播报
注意pcm的格式(单声道,16k,16bit)。播放buffer最大只支持10分钟,插播最大3分钟的数据;NSData长度需大于16000,小于16000 x (16 / 8) x 60 x 10
1-(BOOL)speakWithPcm:(RenderModel *)renderModel;
| 参数名 | 取值 |
|---|---|
| renderModel | renderModel.data |
| 返回值 | true: pcm数据设置成功 false: pcm 数据设置失败 |
RenderModel
| 参数 | 说明 |
|---|---|
| data | pcm数据, 格式要求:16000hz,单声道,16位 |
调用示例
1NSString *pcmPath = [self.bundlePath stringByAppendingPathComponent:@"/asr_0501-iPhone13Promax-lijiaqi_kongtiao_mic_01.pcm"];
2 RenderModel *renderModel = [[RenderModel alloc] init];
3 renderModel.data = [[NSData alloc] initWithContentsOfFile:pcmPath];
4 [self.player speakWithPcm:renderModel];
4.2、文本播报
需要注意的是,当SDK启动后,第一次speak一段文本时,需要请求网络,请保证设备的网络正常。在sdk不重启的情况,如果一段文字请求过,则会缓存在内存中,不再请求网络,这样会占用一部分内存。
默认txt最大为520个字,对于需要超过这个长度文本,请和百度方沟通。
1-(BOOL)speakWithTxt:(NSString *)text speakerConf:(SpeakerConf *)speakerConf;
| 参数名 | 取值 |
|---|---|
| text | 播报文本信息 |
| conf | 参考 7.2 SpeakerConf 参数 |
| 返回值 | YES: 数据设置成功 NO: 数据设置失败 |
调用示例
1SpeakerConf *conf = [[SpeakerConf alloc] init];
2 conf.person = 5116;
3 NSString *str = @"欢迎来到直播间的朋友,我们主要这款直播设备,您是否对此有所了解呢?直播在近几年越来越流行,进入2.0时代";
4 [self.player speakWithTxt:str speakerConf:conf];
4.3、PCM 插播
1-(BOOL)speakInsertOnFlowPcm:(RenderModel *)renderModel;
| 参数名 | 取值 |
|---|---|
| renderModel | renderModel.data |
| 返回值 | true: 插播pcm数据设置成功 false:插播pcm 数据设置失败 |
调用示例
1NSString *pcmPath = [self.bundlePath stringByAppendingPathComponent:@"/asr_0501-iPhone13Promax-lijiaqi_kongtiao_mic_01.pcm"];
2 RenderModel *renderModel = [[RenderModel alloc] init];
3 renderModel.data = [[NSData alloc] initWithContentsOfFile:pcmPath];
4 [_player speakInsertOnFlowPcm:renderModel];
4.4、文本插播
第一次插播一段文本时,需要请求网络,请保证设备的网络正常。在sdk不重启的情况,如果一段文字请求过,则会缓存在内存中,不再请求网络,这样会占用一部分内存
默认txt最大为156个字
1-(BOOL)speakInsertOnTxt:(NSString *)text speakerConf:(SpeakerConf *)speakerConf;
| 参数名 | 取值 |
|---|---|
| text | 插播的文本 |
| conf | 参考 7.2 SpeakerConf 参数 |
调用示例
1SpeakerConf *conf = [[SpeakerConf alloc] init];
2 conf.person = 5116;
3 [self.player speakInsertOnTxt:@"今天天气怎么样" speakerConf:conf];
4.5、暂停播报
1- (void)pausePlay;
调用示例
1[_player pausePlay];
4.6、继续播报
1- (void)resumePlay;
调用示例
1[_player resumePlay];
4.7、打断播报
打断当前正在进行播报包含插播数据, 打断后不可恢复
1- (void)interrupt;
调用示例
1[_player interrupt];
4.8、是否正在播放中
用于播放状态判断
1- (BOOL)isPlaying;
| 参数名 | 取值 |
|---|---|
| 返回值 | true: 正在播放中 false:停止播放 |
调用示例
1[_player isPlaying]
4.9、是否在暂停状态
用于播放状态判断
1- (BOOL)isPause;
| 参数名 | 取值 |
|---|---|
| 返回值 | true: 暂停状态 false:非暂停状态 |
调用示例
1[_player isPause]
5、流式模式驱动数字人
开启流式播报后可以持续播报数据,与普通模式下不同的是普通模式只能单条播报而流式可持续播报,具体调用参考接口文档
需要注意pcm的格式(单声道,16k,16bit);播放buffer最大只支持10分钟。
5.1、开启流式播报
1-(BOOL)speakFlowStart;
| 参数名 | 取值 |
|---|---|
| 返回值 | true: 开启成功 false:开启失败 |
调用示例
1[_player speakFlowStart];
5.2、关闭流式播报
1-(BOOL)speakFlowFinish;
| 参数名 | 取值 |
|---|---|
| 返回值 | true: 暂停状态 false:非暂停状态 |
调用示例
1[_player speakFlowFinish];
5.3、流式PCM播报
1-(BOOL)speakFlowOnPcm:(RenderModel *)renderModel;
| 参数名 | 取值 |
|---|---|
| renderModel | renderModel.data |
| 返回值 | true:PCM 数据设置成功 false: PCM 数据设置失败 |
调用示例
1NSString *pcmPath = [self.bundlePath stringByAppendingPathComponent:@"/asr_0501-iPhone13Promax-lijiaqi_kongtiao_mic_01.pcm"];
2 RenderModel *renderModel = [[RenderModel alloc] init];
3 renderModel.data = [[NSData alloc] initWithContentsOfFile:pcmPath];
4 renderModel.dataPath = pcmPath;
5 [self.player speakFlowOnPcm:renderModel];
5.4、流式TXT播报
1-(BOOL)speakFlowOnSegTxt:(NSString *)text speakerConf:(SpeakerConf *)speakerConf;
| 参数名 | 取值 |
|---|---|
| text | 文本数据 |
| conf | 参考 7.2 SpeakerConf 参数 |
调用示例
1SpeakerConf *conf = [[SpeakerConf alloc] init];
2 conf.person = 5116;
3 NSString *str = @"欢迎来到直播间的朋友,我们主要这款直播设备,您是否对此有所了解呢?直播在近几年越来越流行,进入2.0时代";
4 [self.player speakFlowOnSegTxt:str speakerConf:conf];
5.5、开始流式插播
开启插播后进入插播模式,需要调用关闭插播接口进行退出插播模式
1-(BOOL)speakInsertFlowPcmStart;
| 参数名 | 取值 |
|---|---|
| 返回值 | true: 开启插播正常 false:开启插播异常, 可能未处于流式播报模式 |
调用示例
1[_player speakInsertFlowPcmStart];
5.6、关闭流式插播
1-(BOOL)speakInsertFlowPcmFinish:(BOOL)isFnishInsertPcm;
| 参数名 | 取值 |
|---|---|
| isFnishInsertPcm | YES: 播放完之前已经插入的数据 NO: 直接停止,回到插播前的内容上 (默认) |
调用示例
1[_player speakInsertFlowPcmFinish:YES];
5.7、流式PCM插播
1、如果未开启插播模式,可以支持插播,插播完毕后继续播放正文;如果开启插播则处于插播模式当中,需要调用关闭插播接口,退出插播模式后继续播报正文
2、需要注意pcm的格式(单声道16k; 16bit)。插播最大3分钟的数据。
3、文本插播和PCM 插播共用一份buffer 空间
1-(BOOL)speakInsertOnFlowPcm:(RenderModel *)renderModel;
| 参数名 | 取值 |
|---|---|
| renderModel | renderModel.data |
调用示例
1NSString *pcmPath = [self.bundlePath stringByAppendingPathComponent:@"/asr_0501-iPhone13Promax-lijiaqi_kongtiao_mic_01.pcm"];
2 RenderModel *renderModel = [[RenderModel alloc] init];
3 renderModel.data = [[NSData alloc] initWithContentsOfFile:pcmPath];
4 [_player speakInsertOnFlowPcm:renderModel];
5.8、流式TXT插播
1、如果未开启插播模式,可以支持插播,插播完毕后继续播放正文;如果开启插播则处于插播模式当中,需要调用关闭插播接口,退出插播模式后继续播报正文,最大支持插播3分钟,文本插播和PCM 插播共用一份buffer 空间
1-(BOOL)speakInsertOnTxt:(NSString *)text speakerConf:(SpeakerConf *)speakerConf;
| 参数名 | 取值 |
|---|---|
| text | 需要插播的文本数据 |
| conf | 设置音库, 具体参数请参考 7.2 SpeakerConf 参数 |
| 返回值 | 该文本的唯一标识和执行结果 |
调用示例
1SpeakerConf *conf = [[SpeakerConf alloc] init];
2 conf.person = 5116;
3 [self.player speakInsertOnTxt:@"今天天气怎么样" speakerConf:conf];
6、文本处理
player获取方式参考 3.1、数字人形象初始化
6.1、预加载文本的pcm数据
1-(void)preLoadTxtPcm:(NSString *)text speakerConf:(SpeakerConf *)speakerConf;
| 参数名 | 取值 |
|---|---|
| text | 文本信息 |
| conf | 设置音库, 详情参数请参考 7.2、SpeakerConf 参数 |
调用示例
1SpeakerConf *conf = [[SpeakerConf alloc] init];
2 conf.person = 5116;
3 NSString *str = @"欢迎来到直播间的朋友,我们主要这款直播设备,您是否对此有所了解呢?直播在近几年越来越流行,进入2.0时代";
4 [_player preLoadTxtPcm:str speakerConf:conf];
7、工具类
7.1、枚举相关
7.1.1、日志相关(VirtualLogLevelType)
| 参数名 | 说明 |
|---|---|
| DH_LEVEL_OFF | 关闭 |
| DH_LEVEL_DEBUG | 打印debug 日志 |
| DH_LEVEL_INFO | 打印info日志 |
| DH_LEVEL_WARN | 打印警告日志 |
| DH_LEVEL_ERROR | 打印错误日志 |
| DH_LEVEL_TRACE | 打印全量日志 |
7.1.2、环境设置相关 (VirtualEnvType)
| 参数名 | 说明 |
|---|---|
| VIETUAL_RELEASE | 线上环境 |
| VIETUAL_DEVELOP | 测试环境 |
| VIETUAL_PRE_RELEASE | 预发布环境 |
7.1.3、授权模式(AuthMethodType)
| 参数名 | 说明 |
|---|---|
| AUTH_DEVICE | 设备授权 |
| AUTH_PROJECT | 项目授权 |
7.1.4、初始化相关(InitEvent)
| 参数名 | 说明 |
|---|---|
| INIT_SUCCESS | 初始化成功 |
| INIT_FAIL | 初始化失败 |
7.1.5、授权相关(VirtualAuthEvent)
| 参数名 | 说明 |
|---|---|
| AUTH_EVENT | 授权 |
| AUTH_GET_STATUS | 获取授权状态 |
| AUTH_CHANGE_DEVICE_STATUS | 换绑新设备 |
| AUTH_RENEW_STATUS | 续期 |
7.1.6、播报相关(VirtualPlayerEvent)
| 参数名 | 说明 |
|---|---|
| PLAYER_START | 播报开始 |
| PLAYER_FINISH | 播报结束 |
| PLAYER_DATA | 播报数据 |
| PLAYER_PAUSE | 暂停播报 |
| PLAYER_ERROR | 播报错误 |
| PLAYER_PCM_VOLUME_ERROR | 增幅放大错误 |
| REMAIN_BUFFER | 剩余待播报字节数 |
7.1.7、渲染模式(DisplayMode)
| 参数 | 说明 |
|---|---|
| RENDER_ONLY | render渲染 |
| FRAME_ONLY | 图片帧渲染(待开放) |
7.2、SpeakerConf 参数
需要注意的是,需要和百度方确认,per取值的范围
| 参数名 | 类型 | 取值 | 说明 |
|---|---|---|---|
| speed | int | 语速,取值0-15,默认为5中语速 | 语速 |
| pitch | int | 音调,取值0-15,默认为5中语调, 克隆音色暂不生效 | 音调 |
| volume | int | 音量,取值0-15,默认为5中音量 | 音量 |
| aue | int | 6:wav(内容同pcm-16k)默认 | 音频格式 |
| person | string | 默认:度小希=5116 更多音色请参考:https://cloud.baidu.com/doc/AI_DH/s/Slywt3fxy |
音色 |
8、代理回调以及状态码
8.1、初始化
1- (void)onInitEventUpdate:(InitEvent)event obj:(id __nullable)data;
| 参数 | 说明 |
|---|---|
| event | 回调类型,详情参考InitEvent 参数说明 |
| data | json, 具体信息参考返回值说明 |
返回值说明
| code | subCode | 说明 |
|---|---|---|
| 0 | 0 | 初始化成功 |
| -1001 | -1001 | 设备授权; appkey 为空 |
| -1002 | 设备授权; secret key 为空 | |
| -1003 | 设备授权; appkey 长度不符 | |
| -1004 | 设备授权; secret key 长度不符 | |
| -1005 | 设备模型文件路径错误 | |
| -1006 | engine 状态错误 | |
| -1007 | 项目授权;appkey 为空 | |
| -1008 | 项目授权;secret key 为空 | |
| -1009 | 项目授权;appkey 长度不符 | |
| -1010 | 项目授权;secret key 长度不符 | |
| -1011 | 入参 param 参数为空 | |
| -1012 | tts 相关;ttsID 为空 | |
| -1013 | tts 相关;tts Key 为空 |
8.2、授权
1- (void)onVirtualAuthEventUpdate:(VirtualAuthEvent)event obj:(id __nullable)data;
| 参数 | 说明 |
|---|---|
| event | 回调类型,详情参考VirtualAuthEvent 参数说明 |
| data | json, 具体信息参考返回值说明 |
VirtualAuthEvent 说明
| event | 字段值 | 说明 |
|---|---|---|
| AUTH_EVENT | 0 | 授权 |
| AUTH_GET_STATUS | 1 | 获取授权状态 |
| AUTH_CHANGE_DEVICE_STATUS | 2 | 设备换绑 |
| AUTH_RENEW_STATUS | 3 | 授权码激活/续期 |
data 状态码说明
| event | code | subCode | 说明 |
|---|---|---|---|
| AUTH_EVENT AUTH_GET_STATUS |
0 | 0 | 初始化成功 |
| -1001 | 0 | 授权状态错误/ 获取授权异常 | |
| -1002 | 0 | 服务端返回空 | |
| -1003 | 服务端错误码 | 服务端授权失败 | |
| -1004 | 服务端错误码 | 授权错误 | |
| -1005 | 0 | 项目授权;授权信息返回空 | |
| -1006 | 服务端错误码 | 项目授权;授权信息失败 | |
| -1007 | 0 | 项目授权;授权信息异常 | |
| -1008 | 0 | 授权错误 | |
| -1009 | 引擎错误码 | 引擎授权失败 | |
| AUTH_CHANGE_DEVICE_STATUS | 0 | 0 | 设备换绑成功 |
| -1000 | 0 | 项目不支持/ 换绑异常 | |
| -1001 | 0 | sdk 状态异常 | |
| -1002 | 0 | 后台返回为空 | |
| -1003 | 服务端错误码 | 后台状态异常 | |
| AUTH_RENEW_STATUS | 0 | 0 | 续期成功 |
| -1000 | 0 | 项目不支持/ 续期异常 | |
| -1001 | 0 | sdk 状态异常 | |
| -1002 | 0 | 后台返回为空 | |
| -1003 | 服务端错误码 | 后台状态异常 |
8.3、数字人加载
1- (void)onVirtualEventUpdate:(VirtualEvent)event obj:(id __nullable)data;
| 参数 | 说明 |
|---|---|
| event | 回调类型,详情参考InitEvent 参数说明 |
| data | json, 具体信息参考返回值说明 |
VirtualAuthEvent 说明
| event | 字段值 | 说明 |
|---|---|---|
| CHANGE_VIRTUAL_MODEL | 0 | 模型设置 & 模型切换 |
| CHECK_VIRTUAL_MODEL | 1 | 模型效验 |
返回值说明
| event | code | subCode | 说明 |
|---|---|---|---|
| CHANGE_VIRTUAL_MODEL | 0 | 0 | 初始化成功 |
| -1000 | -2000 | 参数错误 | |
| -1001 | -2001 | 调用顺序异常 | |
| -1003 | 参考模型效验错误码 | 模型效验错误 | |
| -1004 | -2004 | 切换人像频繁 | |
| -1005 | -2010 | 引擎初始化失败 | |
| CHECK_VIRTUAL_MODEL | -1006 | 参考模型效验错误码 | 模型完整性校验 |
8.4、数字人播报
1- (void)onVirtualPlayerEventUpdate:(VirtualPlayerEvent)event obj:(id __nullable)data;
| 参数 | 说明 |
|---|---|
| event | 回调类型,详情参考InitEvent 参数说明 |
| data | json, 具体信息参考返回值说明 |
VirtualPlayerEvent 说明
| event | 字段值 | 说明 |
|---|---|---|
| PLAYER_START | 0 | 开始播报 |
| PLAYER_FINISH | 1 | 播报结束 |
| PLAYER_DATA | 2 | 音频& 视频数据(预留) |
| PLAYER_PAUSE | 3 | 暂停播报 |
| PLAYER_ERROR | 4 | 播报错误 |
| PLAYER_PCM_VOLUME_ERROR | 5 | 设置音效错误 |
| REMAIN_BUFFER | 6 | 未播报数据,字节长度 |
8.5、文本处理
1- (void)onTtsPcmData:(NSDictionary *)msg obj:(id __nullable)data;
| 参数 | 说明 |
|---|---|
| msg | json 信息 |
| data | NSData 数据, |
NSDictionary 数据
1@{
2 @"code":@(code),
3 @"subCode":@(subCode),
4 @"msg":msg
5 };
| code | subCode | 说明 |
|---|---|---|
| 0 | 0 | 文本转换成功 |
| -1000 | -1000 | 参数异常 |
| 服务端错误码 | 获取pcm 数据异常 |
9、常见问题
9.1、定制人像包替换本地数字人像包
SDK支持定制人像包替换
- 命名定制人像包:
如使用定制人像包,则在初始化SDK之前需要下载对应的定制人像包压缩文件,定制人像包压缩文件解压后就是一个人像包文件夹,人像包文件夹需要改名字,用数字来命名(数字大于0且不等于20,也不能等于10001-11000中的数,还不能重复)。
- 将修改后的人像包压缩为xxx.zip 包, 并将压缩包上传至可下载平台下
- 按照本文档 《1.2、人像导入》执行:
- 使用方式:参考本文档 《3.4、数字人形象切换》
