虚拟形象iOS开发文档
虚拟形象iOS开发文档
简介
百度虚拟形象sdk是基于图像识别、语音识别与合成、人像建模等人工智能技术,以电子屏、VR等设备为载体,实现人机交互的虚拟人,面向餐饮、金融、广电、教育、营销等行业,提供全新智能对客服务,降低人力成本,提升服务质量和效率。同时基于百度AR技术,塑造卡通形象,打造更有亲和力的虚拟形象。
开发指南
概述
DigitalHuman SDK 以DigitalHuman API的形式提供给开发者,包含JAVA,objc两种语言形式。
功能
DigitalHuman SDK 实现功能包括:
-
播报
输入文本进行语音播报
-
对话
输入文本或录音进行对话聊天
-
模型渲染
初始化完成即可将虚拟形象渲染在页面上
-
切换配饰
切换虚拟形象的配饰,包括但不限于服装和发型
-
动作和表情触发
输入不同参数来触发不同的动作和表情
-
视角变换
切换虚拟形象全身和半身
开发环境
Xcode: 建议12.0及以上
需要用到的权限:Microphone麦克风使用权限、网络
SDK与demo文件
鉴权
使用sdk需要用到dumixar.license文件进行授权,license文件对bundleID和过期时间有鉴权限制。需要加载license文件,DigitalHuman才能正常启动。原始SDK中不包含license。
快速入门
需要集成 libc++.tbd
苹果官方的c++库
初始化
初始化并且启动SDK
//samples.m
@property (nonatomic, strong) BARDigitalHuman *digitHuman;
// 代码
NSString *url = @""; // 语音播报和asr服务用到的websocket连接
NSString *casePath = @""; // AR Case的本地文件地址
<id>BARDigitHumanLogViewProtocol logView; // 实现BARDigitHumanLogViewProtocol协议的一个class,用来输出sdk内部的log和cpu、内存、网络的的使用情况。
self.digitHuman = [[BARDigitalHuman alloc] initWithUrl:url frame:self.view.frame arCasePath:casePath logView:logView];
// 将输出的view添加到app的view层级中
[self.view addSubview:self.digitHuman.arView];
鉴权和启动
// license 文件
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dumixar" ofType:@"license"]];
__weak typeof(self) weakSelf = self;
[self.digitHuman setLicenseData:data localAuthResult:^(BOOL result) {
if () {
// 启动sdk
[weakSelf.digitHuman start];
} else {
NSLog(@"鉴权失败");
}
}];
播报模式
数字人播报输入的文本。
NSString *text = @"你好";
[weakSelf.digitHuman sendReadingMessage:text];
对话模式
- 输入对话语音,数字人对于语音进行回答。
[weakSelf.digitHuman chatStartRecord]; // 启动录音, 启动后sdk会捕获外部环境的声音,直到判断一句话已经结束,会在回调方法里面标识出来。
// 设置录音的回调方法。此方法会返回识别的录音的文本信息,如果判断此段文本语义上已经结束了,会返回第二个参数的completed变量为真值。
[self.digitHuman setChatGetSubTitleBlock:^(NSString *subTitle, BOOL completed) {
if (completed) {
// 结束录音
[weakSelf.digitHuman chatStopRecord];
// 将识别到的文本发送到服务端,会返回数字人的语音对话,然后SDK播放这段对话
[weakSelf.digitHuman sendChatMessage:subTitle];
}
}];
- 输入对话文本,数字人对于文本进行回答。
NSString *text = @"你好";
[weakSelf.digitHuman chatSendMessage:text];
设置对话的UNIT信息
每次发送对话消息,都需要附带unitDict信息
NSDictionary *unitDict = @{
@"access_token": @"24.65247541da47f53752156c27686d8ea3.2592000.1614147995.282335-23178123",
@"log_id": @"UNITTEST_10000",
@"version": @"2.0",
@"service_id": @"S42464",
@"session_id": sessionId, // sessionId为setChatGetSessionIdBlock接口返回的sessionId
@"user_id": @"88888",
@"skill_ids": @"1067861" // 1067861:问候技能 1067825:闲聊技能
};
[weakSelf.digitHuman chatSendMessage:text unitDict:unitDict];
获取对话的UNIT sessionId
[self.digitHuman setChatGetSessionIdBlock:^(NSString *sessionId) {
weakSelf.barContext.chatSessionId = sessionId;
}];
监听回调
设置sdk的播报、对话请求的状态变化的回调。包括,开始请求、播放中、播放完成、播放失败。
请参考下面API列表的『数字人请求的状态』
[self.digitHuman setChangeRequestStatusBlock:^(BARDigitalHumanStatus status) {
NSLog(@"inapp status:%ld", status);
dispatch_async(dispatch_get_main_queue(), ^{
if (status == BARDigitalHumanStatusStart) {
// 开始请求
} else if (status == BARDigitalHumanStatusEnd) {
// 播放完成
} else if (status == BARDigitalHumanStatusFailed) {
// 请求失败
} else {
// 播放中
}
});
}];
切换配饰
以切换发型为例,详细功能请参考Api说明。
// 修改为短发发型
NSMutableDictionary *msg = [[NSMutableDictionary alloc] init];
[msg setObject:@"change_hair_operation" forKey:@"event_name"];
[msg setObject:@{@"node": @"avatar", @"hair": @"short"} forKey:@"event_data"];
[weakSelf.digitHuman changeRenderParameter:msg];
数字人播报的文本回调
[self.digitHuman setOutputSubtitleBlock:^(NSString *subtitle, NSInteger duration) {
// 展示字幕
}];
API列表
initWithUrl:frame:arCasePath:logView
- (instancetype _Nonnull )initWithUrl:(NSString *_Nonnull)url frame:(CGRect)frame arCasePath:(NSString *_Nullable)arCasePath logView:(id<BARDigitHumanLogViewProtocol>_Nullable)logView;
初始化SDK系统环境。初始化成功后,会给arView属性赋值,将这个view放到app的view层级中,用来展示数字人。
参数:
- url : 语音播报和asr服务用到的websocket连接地址
- frame : 输出view的frame
- arCasePath : ar case的本地地址
- logView - id
: sdk内记录log的一个protocol对象
返回:
BARDigitHuman对象
(NSArray *)setLicenseData:(NSData *)licenseData localAuthResult:(void (^)(BOOL result))authResult;
参数
- licenseData : license文件的NSData格式数据
- 鉴权的回调,authResult为YES代表鉴权成功,为NO代表鉴权失败
start
开启数字人,在鉴权回调成功后调用
- (void)start;
参数:
无
返回值:
void
stop
关闭数字人,情况sdk里面的资源
- (void)stop;
参数:
无
返回值:
无
sendReadingMessage:
发送播报文本
sdk会按照文本内容播报
- (void)sendReadingMessage:(NSString *)text;
参数:
- text :要播报的文本
返回值:
void
interruptReading
中止、打断
- (void)interruptReading;
会停止播放语音
changeRenderParameter:
修改发型、服饰
发送消息,可以修改数字人的发型和服饰
- (void)changeRenderParameter:(NSDictionary *)message;
参数:
- msg - NSDictionary :消息字典
消息列表:
含义 | event_name | event_data | 备注 | |
---|---|---|---|---|
换装(裙装/西装) | change_outfit_operation | node | avatar | 节点:预留字段 |
outfit | dress/suit | 服装:裙装/西装 | ||
换发型(短发/马尾辫) | change_hair_operation | node | avatar | 节点:预留字段 |
hair | short/ponytail |
发型:短发/马尾 | ||
动作触发 | animation_operation | node | avatar | 节点:预留字段 |
repeat_count | n(整数) | 动画循环次数:0代表无穷 | ||
chip | idle(聆听态)/right_hand(右伸手)/front_hand(前伸手)/wave(招手)/emphasize(强调) | 动画短名称:聆听态/右伸手/前伸手/招手/强调 | ||
operation | play/stop | 操作:播放/停止 | ||
相机位置切换 | camera_position_operation | position | ArrayList<Float> 数组,数组长度为3 |
全身相机姿态参数:0,8,47半身相机姿态参数:0,10.5,25调用例子中见调用示例,三个Float代表相机位置的三维坐标,其中第二个(y坐标)控制相机高低,第三个(z坐标)控制远近,如果效果不佳,可以根据这个参数意义微调。 |
胸章Logo切换 | change_logo_operation | node | avatar | |
logo | none/baidu/baidu_paw/net/net_icon | 对应胸牌:无胸牌、百度胸牌、百度熊掌、智能云胸牌、智能云图标调用例子中见调用示例 |
返回值:
void
gestureTouchesBegan:touches:scale:
手势开始
- (void)gestureTouchesBegan:(nonnull NSSet<UITouch *> *)touches scale:(CGFloat)scale
参数:
- Touches - NSSet<UITouch *> : 手势的信息
- scale - CGFloat : 放大系数
返回值:
void
chatStartRecord
对话模式,开始录音
会打开microphone,进行录音
- (void)chatStartRecord;
参数:
void
返回值:
void
chatStopRecord
对话模式,结束录音
会关闭microphone
- (void)chatStopRecord;
参数:
void
返回值:
void
chatSendMessage:
对话模式,输入文本
输入对话文本到服务端
- (void)chatSendMessage:(NSString *)text;
参数:
- text : 对话文本
返回值:
void
chatSendMessage:unitDict:
对话模式,输入文本和UNIT服务需要的参数
输入对话文本到服务端
- (void)chatSendMessage:(NSString *)text unitDict:(NSDictionary *)unitDict;
参数:
- text : 对话文本
-
unitDict : UNIT服务需要的参数
- access_token
- log_id
- version
- service_id
- session_id : chatGetSessionIdBlock接口返回sessionId,放到这里
- user_id
- skill_ids : // 1067861:问候技能 1067825:闲聊技能
返回值:
void
属性 Property
arView
输出的数字人view
获取view 可以通过arView
,然后将这个view放到app的view层级中
@property (nonatomic, strong, readonly) UIView * _Nullable arView;
changeRequestStatusBlock
数字人请求的状态
typedef void (^BARDigitHumanChangeRequestStatusBlock)(BARDigitalHumanStatus status);
// 状态改变回调block
@property (nonatomic, copy) BARDigitHumanChangeRequestStatusBlock _Nullable changeRequestStatusBlock;
ARPSampleDemoRequestStatusStart = 1, // 开始请求
ARPSampleDemoRequestStatusRun = 2, // 收到数据,播放中
ARPSampleDemoRequestStatusEnd = 3, // 播放完成
ARPSampleDemoRequestStatusFailed = 4 // 请求失败
engineCaseLoadFinishBlock
AR引擎加载完成的回调
// case加载完成回调block
@property (nonatomic, copy) void(^ _Nullable engineCaseLoadFinishBlock)(void);
outputSubtitleBlock
输出字幕信息
这是语音播报或者对话模式下的字幕信息
@property (nonatomic, copy) void(^ _Nullable outputSubtitleBlock)(NSString * _Nonnull subtitle, NSInteger duration);
chatGetSubTitleBlock
对话模式 - 获取录音文本
回调函数的第一个字段subTitle是语音识别的文本,第二个字段completed代表文本语义上是否结束。如果为YES,应该执行chatStopRecord
接口
@property (nonatomic, copy) void(^ _Nullable chatGetSubTitleBlock)(NSString *subTitle, BOOL completed);
chatGetSessionIdBlock
获取对话模式返回的sessionId,每次对话交互都会回调这个接口。得到的sessionId,在传到chatSendMessage:unitDict:
的第二个参数里面,这样可以保持有session的对话
@property (nonatomic, copy) void(^ _Nullable chatGetSessionIdBlock)(NSString *sessionId);