iOS-SDK
1. 总体说明
#1.1 简介
#1.2 适用范围
#1.3 开发准备
#1.4 支持平台
#2. 使用说明
#2.1 申请使用
#3. SDK集成
#3.1 集成步骤
1.
AIKit.framework
、XRTCSDK.framework
添加至目标项目中。2.
3.
4.
5.
#4. SDK使用
#4.1 SDK初始化
/**
* SDK初始化函数用以初始化整个SDK
* @param param SDK配置参数
* @return 结果错误码,0=成功
*/
int ret = [ILibrary initSDK:^(AiHelperMaker *maker) { maker.appId(@"appId").apiKey(@"apiKey").apiSecret(@"apiSecret").authInterval(300).logOpen(true).iLogOpen(true).workDir(@"xx/xx/workDir");
}];
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
appId | string | 应用ID | 是 |
apiKey | string | 唯一的应用标识 | 是 |
apiSecret | string | 唯一的应用密钥 | 是 |
authInterval | int | 授权更新间隔,单位为秒 | 否,默认为300秒 |
iLogOpen | bool | 是否开启控制台日志输出 | 否 |
logOpen | bool | 是否开始日志输出文件 | 否 |
workDir | string | sdk工作目录 | 否 |
#4.2 配置虚拟人能力回调、渲染视图
//设置虚拟人能力回调代理
[AiHelper shareInstance].delegate = self;
//设置虚拟人拉流渲染视图
AiHelper.shareInstance.virtualView = self.remoteView;
//result 回调
- (void)aikitOnResult:(NSString*)ability outputData:(NSArray<AIKITDataModel*>*)data usrCtx:(AIKITUserContext*)context;
//event 回调 event:19表示ws已经关闭连接
- (void)aikitOnEvent:(NSString*)ability event:(NSInteger)event eventData:(NSArray<AIKITDataModel*>*)data usrCtx:(AIKITUserContext*)context;
//error 回调
- (void)aikitOnError:(NSString*)ability error:(AIKITError*)error usrCtx:(AIKITUserContext*)context;
#4.3 上传个性化数据
/// 上传个性化数据
/// @param ability 能力标识
/// @param data 数据
+ (AIKITOutput*)loadDataSync:(NSString*)ability data:(AIKITCustomData*)data;
/// 例如:获取上传背景的res_id
- (nullable NSString *)getResidWithUploadData:(NSData *)fileData{
AIKITCustomData *customData = [[AIKITCustomData alloc] init];
NSString *base64Str = [fileData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
[customData addText:base64Str key:@"background_data" index:0];
AIKITOutput *output = [AiHelper loadDataSync:VMS_ABILITY data:customData];
if (output.code != 0) {
NSLog(@"loadData failed code:%ld",(long)output.code);
return nil;
}
if (output.data.count > 0) {
for (AIKITDataModel *model in output.data) {
Byte *bytes = (Byte *)model.value;
if (bytes == NULL) {
continue;
}
NSData *data = [[NSData alloc] initWithBytes:bytes length:model.len];
NSString *value = [NSString stringWithUTF8String:[data bytes]];
if ([model.key isEqualToString:@"result"]) {
NSError *error;
NSDictionary *dic = [VMTools jsonToArrayOrDictionary:value];
if ([dic.allKeys containsObject:@"data"]) {
NSDictionary *resultData = dic[@"data"];
return resultData[@"res_id"];
}
}
}
}
}
#
/// 上传字幕模板数据,注意字幕模板上传后需要进行文本驱动,详细见demo
AIKITCustomData *customData = [[AIKITCustomData alloc] init];
NSString *base64Str = [data base64EncodedStringWithOptions:0];
if (!kStringIsEmpty(base64Str)) {
[customData addText:base64Str key:@"template_data" index:0];
}
_template_id = [self getResidWithUploadCustomData:customData];
#4.4 启动虚拟人服务
/// 启动会话
/// @param ability 能力标识
/// @param param AIKITParameters能力参数
/// @param content 用户自定义标识
+ (AiHandle*)start:(NSString*)ability param:(nullable AIKITParameters*)param ctxContent:(nullable AIKITCtxContent*)content;
AIKITParameters
:参数 | 类型 | 说明 | 必填 |
---|---|---|---|
uid | string | 唯一标识 | 是 |
avatarid | string | 形象ID | 是 |
width | int | 视频分辨率:宽 | 是,默认为1280 |
height | int | 视频分辨率:高 | 否,默认为720 |
scale | double | 主播在背景图像中的大小 (0,1.0] | 否,默认为1 |
maskRegion | bool | 形象截取区域,用于控制形象展示区域,比如可以截取半身等 示例 : [0,0,1080,1920] | 否 |
moveH | int | 主播平移像素距离 [-4096, +4096],控制主播中心位置距离合成图像中心位置水平距离,为负数表示向左平移,为正数表示向右平移 | 否,默认为0 |
moveV | int | 主播垂直移动像素距离 [-4096, +4096],控制主播在展示画面中的上下移动距离,0为默认情况,主播在画面中下贴边位置。该值为负数表示向下移动,为正数表示向上移动 | 否,默认为0 |
res_id | string | 上传背景生成唯一标识 | 否 |
interactive_scene | string | 部分形象需要传值为type=live | 否 |
template_id | string | 后处理模板生成的唯一标识 | 否 |
#4.5 文本驱动
/// 会话模式输入数据
/// @param data AIKITInputData能力数据
/// @param handle 启动服务的handle对象
/// @param param AIKITParameters能力参数
+ (int)write:(nullable AIKITInputData*)data handle:(nonnull AiHandle *)handle param:(nullable AIKITParameters *)param;
AIKITParameters *param = [[AIKITParameters alloc] init];
//发音人
[param addSection:@"tts"];
[param addString:@"vcn" value:vcn];
//文本驱动传rhy有字幕效果,其他可不传入
[param addInt:@"rhy" value:3];
//打断模式:追加、打断
[param addSection:@"vms_dispatch"];
[param addInt:@"interactive_mode" value:interactiveMode];
AIKITInputData *input = [[AIKITInputData alloc] init];
//合成文本
[input addText:text key:@"text" status:DataStatusOnce];
//动作
if (actions.count == 0){
[input addText:@"" key:@"ctrl_w" status:DataStatusOnce];
}else{
NSMutableArray *avatarArray = [NSMutableArray array];
for (NSString *action in actions) {
NSDictionary *dic = @{@"type":@"action",
@"value":action,
@"wb":@2,
@"we":@10,
};
[avatarArray addObject:dic];
}
NSDictionary *avatarDic = @{@"avatar":avatarArray.copy};
NSData *data = [NSJSONSerialization dataWithJSONObject:avatarDic options:NSJSONWritingPrettyPrinted error:nil];
[input addTextData:data key:@"ctrl_w" status:DataStatusOnce];
}
//后处理字幕相关
if (!kStringIsEmpty(_template_id)){
NSString *path = [ConfigManager.sharedInstance getSandBoxDefaultFilePath:ConfigJsonFileTypeWordLevel3];
NSData *templateData = [[NSData alloc] initWithContentsOfFile:path];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:templateData
options:kNilOptions
error:nil];
TemplateModel *model = [TemplateModel yy_modelWithDictionary:json];
if (!kStringIsEmpty(_res_id)){
model.controls.firstObject.elements.firstObject.resource.res = _res_id;
}
NSString *jsonStr = [model yy_modelToJSONString];
if(!kStringIsEmpty(jsonStr)){
[input addText:jsonStr key:@"ctrl_postproc" status:DataStatusOnce];
}
}
//文本、动作附属参数
AIKITParameters *inputParam = [[AIKITParameters alloc] init];
[inputParam addString:@"encoding" value:@"utf8"];
[inputParam addString:@"compress" value:@"raw"];
[inputParam addString:@"format" value:@"plain"];
[input addControl:inputParam key:@"text"];
[input addControl:inputParam key:@"ctrl_w"];
//写入驱动
int ret = [AiHelper write:input handle:self.handle param:param];
if (ret != 0) {
NSLog(@"vms write failed! ret is %ld", (long)ret);
}
param
:参数 | 类型 | 说明 | 必填 |
---|---|---|---|
vcn | string | 合成发言人 | 是 |
rhy | int | 文本驱动传rhy有字幕效果 | 否 |
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
interactive_mode | int | 打断模式 [0,1] (0 追加模式 1 打断模式) | 否,默认为1 |
input
:参数 | 类型 | 说明 | 必填 |
---|---|---|---|
text | string | 合成的文本数据 | 是 |
ctrl_w | data | 字偏移控制指令 | 否 |
ctrl_postproc | string | 后处理控制指令 | 否 |
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
text | object | 含有 encoding、compress、format参数 | 是 |
encoding | string | 文本编码: utf8 | 是 |
compress | string | 文本压缩格式: raw | 是 |
format | string | 文本格式: raw | 是 |
ctrl_w | object | 含有 encoding、compress、format参数,动作相关 | 否 |
ctrl_postproc | object |