# AIKit语音唤醒 iOS SDK 文档
# 1. 离线唤醒能力简介
该能力可满足无网络环境下在连续语音流中实时检测出关键词片段。SDK轻巧方便,无需网络流量,实时响应,可运行于Android、Linux等平台Android或嵌入式设备。可用于智能终端、智能家居、家电、车机系统等服务场景。
支持多实例并发:否
协议类型:异步流式
# 2. 授权说明
授权方式支持【设备授权】和【应用授权】2种。
-设备授权: 按照设备数和有效期授权,激活设备数达到授权量上限后,新设备将无法继续激活使用。SDK采集多个设备标识按照权重算法生成设备指纹精准标识设备,计量准确。支持所有平台。
-应用授权: 对指定应用授权,仅可在授权的应用上使用,无数量限制,可限制有效期。需提供应用唯一标识,授权能力后,应用级授权支持Android、iOS平台应用。
在能力首次使用时,需要先激活后方可使用。激活时会获取授权license缓存到设备内部存储中。
**在线激活**: 在首次使用时,需要将设备联网,SDK初始化时获取授权license激活。设备激活后,即可在无网环境下使用。如果有恢复出厂设置或清空应用缓存等操作,将license清除后,能力将无法正常使用,将设备联网重启应用即可恢复。适用于设备可联网场景,激活过程简单。
# 3. 兼容性说明
类别 | 兼容范围 |
---|---|
系统 | 支持iOS 9.0以上版本 |
机型 | iOS 9.0以上设备 |
网络 | 设备具备联网条件,可使用在线激活方式,首次使用需要连接网络。 |
开发环境 | 建议使用 xcode 进行开发 |
# 4. SDK包组成
DEMO 中已经集成了SDK, 您可以参考DEMO,集成SDK。集成前,请先测通DEMO,了解调用原理。如果您自己代码过于复杂,可以使用一个helloworld项目了解集成过程。
将SDK zip包解压缩,得到如下文件:
- Demo //能力SDK Demo、SDK使用说明readme.txt,示例能力调用
- SDK //能力SDK,导入SDK库时使用
- AEEResource.boundle //能力对应模型资源,多能力组合时,resource文件夹中包含多个子文件夹
- 测试报告 //SDK 测试报告
- ReleaseNotes.txt //SDK版本日志
# 5. 接口调用流程
# 6. 快速集成指南
# 6.1 导入SDK库
AIKit iOS SDK 核心代码库由AIKIT.framework 和能力引擎framework 组成。
AIKIT.framework 、引擎framework 均是动态库。
在引入工程中时,在工程的General的frameworks,Libraries,and Embedded Content 中使用Embedded & sign。
示例如下
# 6.2 资源导入
使用 AIKit iOS SDK 提供的能力时,还需要有配套的AI能力模型资源。
AIKit 的资源全部存放在AEEResource.boundle下,开发者需将其添加到工程中。
# 6.3 设置BitCode
AIKit iOS SDK暂不支持Bitcode,Xcode 7、Xcode 8默认开启了Bitcode,而Bitcode 需要工程依赖的所有类库同时支持,可关闭此设置,只需在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO。
# 6.4 SDK初始化
在使用能力前,需要首先初始化SDK,使用SDK提供的单能力或组合能力时,SDK均只需要初始化一次。
// SDK初始化
- (int)initSDK {
[AiHelper initSDK:^(AiHelperMaker *maker) {
maker.appId(APPID)
.apiKey(APIKEY)
.apiSecret(APISECRET)
.ability(@"e867a88f2");
}];
}
如上代码所示,SDK初始化参数中appId、apiKey、apiSecret为必填项。
初始化参数通过AiHelperMaker构造,各初始化参数含义如下:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
appID | String | 是 | 应用ID |
apiKey | String | 是 | 离线引擎托管平台创建应用后,生成的唯一应用标识 |
apiSecret | String | 是 | 离线引擎托管平台创建应用后,生成的唯一应用秘钥 |
ability | String | 是 | SDK v2.2.13+版本新增接口,传入需要用到的一个或多个能力ID,格式为"xxxx1;xxxx2",多个能力ID中间用 英文分号 隔开 |
workDir | String | 否 | SDK工作目录,默认路径为 "Documents/aikit" |
userDeviceId | String | 否 | 用户自定义设备标识,需要服务端配置开启支持后才支持使用,建议设置长度低于256 |
authType | int | 否 | 离线授权类型(0或1),0-->(默认)设备级授权(DEVICE)和 1-->应用级授权(APP) |
resDir | String | 否 | 指定资源读取路径,不设置默认从工程中AIKITResource.bundle中读取 |
batchID | String | 否 | 授权批次ID,扩展字段,暂未生效 |
authInterval | int | 否 | 在线授权校验间隔时长,默认为300s,可自定义设置,最短为60s,最长为24小时,单位秒 |
# 6.5 注册回调代理
能力结果可通过registerAbilityCallback 注册回调对象,对象需实现AIKitCoreDelegate协议,根据业务需要可为每个能力单独注册回调,或注册一个统一回调。
@interface callback : NSObject<AIKitCoreDelegate>
// 构建实现AIKitCoreDelegate协议的callback类
@end
@implementation callback
// 实现数据回调函数
- (void)aikitOnResult:(NSString *)ability
handleId:(NSInteger)handleId
outputData:(NSArray<AIKITDataModel *> *)data
usrCtx:(AIKITCtxContent *)context {
for (AIKITDataModel *model in data) {
//获取到结果key 和 reslut
NSString *key = model.key;
NSData *value = [[NSData alloc] initWithBytes:model.value length:model.len];
}
}
// 实现事件回调函数
- (void)aikitOnEvent:(NSString *)ability
handleId:(NSInteger)handleId
event:(NSInteger)event
eventData:(NSArray<AIKITDataModel *> *)data
usrCtx:(AIKITCtxContent *)context {
// do something to output event
if (event == AIKIT_EVENT_START) {
// 引擎计算开始
} else if (event == AIKIT_EVENT_PROGRESS) {
// 引擎计算中
} else if (event == AIKIT_EVENT_END) {
// 引擎计算结束
}
}
// 实现错误信息回调函数
- (void)aikitOnError:(NSString*)ability
handleId:(NSInteger)handleId
error:(AIKITError*)error
usrCtx:(AIKITCtxContent*)context {
// do something to output error
if (error) {
NSLog(@"引擎错误,错误类型:%d, 错误码:%d, 错误描述:%@",error.type, error.code, error.description);
}
}
@end
//支持设置一个全局回调,在方法中通过abilityId区分能力,也支持为每一个能力单独设置回调
callback* cb = [[callback alloc] init];
[AiHelper registerAppCallback:cb]; // global callback :注册为全局级别回调
//[AiHelper registerAbilityCallback:@"e867a88f2" callback:cb] // ability callback:注册为能力级别回调
aikitOnResult参数说明
参数 | 类型 | 说明 |
---|---|---|
ability | NSString* | 能力标识ID |
handleId | NSInteger | 能力标识ID |
outputData | NSArray* | 能力执行结果 |
usrCtx | AIKITCtxContent* | 用户自定义标识 |
事件回调 aikitOnEvent参数说明
参数 | 类型 | 说明 |
---|---|---|
ability | NSString* | 能力标识ID |
handleId | NSInteger | 会话id |
event | enum | 0=未知;1=开始;2=结束;3=超时;4=进度 |
eventData | NSArray* | 事件消息数据 |
usrCtx | AIKITCtxContent* | 用户自定义标识 |
aikitOnError:错误回调
参数 | 类型 | 说明 |
---|---|---|
handleId | NSInteger | 会话id |
usrCtx | AIKITCtxContent* | 用户自定义标识 |
ability | NSString* | 能力标识ID |
error | AIKitError*huanx | 错误消息数据 |
AIKITDataModel对象
参数 | 类型 | 说明 |
---|---|---|
key | NSString* | 输出数据名称 |
type | enum | 输出数据类型,1=文本; |
value | void* | 输出数据 |
varType | enum | 输出数据变量类型,0=字节数组;1=整型;2=实型;3=布尔型 |
len | int | 输出数据长度 |
status | int | 输出数据状态,0=首数据;1=中间数据;2=尾数据;3=非会话单次输入输出 |
# 6.6 配置自定义唤醒词
唤醒词由用户自定义在配置文件keyword.txt中。keyword.txt文件要求utf-8的格式,且每个唤醒词占一行,结尾以";"(英文的;)结束。
示例如下:
你好小迪;
小白小白;
小T小T;
通过loadData 方法加载配置文件,可加载多个配置文件。
通过specifyDataSet 方法设置要生效的唤醒词文件。
每次会话时,均需要调用specifyDataSet设置要生效的唤醒词,loadData 方法初始化之后调用一次即可。
SDK 配置自定义唤醒词示例代码如下:
AIKITCustomData *customData = [[AIKITCustomData alloc] init];
[customData addTextPath:custom1 key:@"key_word" index:0];
[AiHelper loadData:e867a88f2 data:customData];
int indexs[] = {0};
[AiHelper specifyDataSet:e867a88f2 key:@"key_word" indexs:indexs count:1];
AIKITCustomData *preData = [[AIKITCustomData alloc] init];
[preData addTextPath:$path key:@"key_word" index:indexs];
ret = [AiHelper preProcess:e867a88f2 data:preData];
个性化数据参数说明
数据段名称:key_word 数据类型:文本
loadData 方法参数说明:设置唤醒词配置文件,可设置多个,初始化前调用一次即可。
参数 类型 必填 说明 abilityId String 是 能力标识ID customData AIKITCustomData* 是 个性化数据构造器 specifyDataSet 方法参数说明:指定要使用的唤醒词文件集合,每次会话开启前需要调用。
参数 类型 必填 说明 abilityId String 是 能力标识ID key String 是 个性化资源key indexs int[] 是 个性化资源索引 preProcess方法参数说明:为避免个性化数据重复加载耗时,可调用该预处理方法,对原始个性化资源进行预处理,再次调用能力时,则引擎会自 动加载预处理后的资源。
参数 类型 必填 说明 abilityId String 是 能力标识ID preData AIKITCustomData* 是 预处理后的个性化资源
# 6.7 能力调用接口
# 6.7.1 创建能力会话
通过 start 方法开启会话,传入当前能力所需要指定的参数。
示例代码如下:
AIKITParameters *abilityParams = [[AIKITParameters alloc] init];
//[abilityParams addString:wdec_param_nCmThreshold value:"$paramValue"];
//[abilityParams addBool:gramLoad value:"false"];
AiHandle *handle = [AiHelper start:e867a88f2 param:abilityParams ctxContent:$usrContext];
if (!handle.isSuccess) {
return;
}
功能参数:
功能标识 | 功能描述 | 数据类型 | 取值范围 | 必填 | 默认值 |
---|---|---|---|---|---|
wdec_param_nCmThreshold | 门限值 格式 0 0:1500 门限值解释说明:表示第一个自定义唤醒词文本里面第一个词的门限,即可以对不同唤醒词文件里的不同的唤醒词单独设置门限值 | string | 最小长度:0, 最大长度:1024 | 否 | |
gramLoad | 更新自定义唤醒词 | bool | true:true, false:false | 否 | false |
start 方法说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
ability | String | 是 | 能力标识ID |
abilityParams | AIKITParameters* | 是 | 能力参数配置,可设置一个或多个 |
usrContext | AIKITCtxContent* | 否 | 用户自定义标识 |
返回:AiHandle
AiHandle对象内部提供isSuccess方法,用于判断会话是否启动成功,通过code属性获取错误码,异常错误请参考文档末尾“常见错误码”章节。
# 6.7.2 送入数据
通过调用 write 方法送入能力输入数据。
write方法参数说明如下:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
input | AIKITInputData* | 是 | 构造能力输入数据及数据描 |
handle | AiHandle* | 是 | 会话的handle对象 |
数据构建API参考“7.2节 能力输入数据”说明,送入代码实现数据如下:
AIKITInputData *dataBuilder = AIKITInputData.instance();
//输入音频数据
AIAudio *wav = AIAudio
.get("wav") //必填项:输入输入音频key
.data(part) //必填项:part为 NSData* 类型输入数据
.status(DataStatusBegin) //非必填:设置输入数据状态,可参考文档7.2节说明及Demo
.valid(); //必填项:输入数据合法性检查
dataBuilder.payload(wav);
int ret = [AiHelper write:dataBuilder handle:$handle];
if (ret != 0) {
return;
}
- 能力输入数据
数据段名称:wav
数据类型:音频
以下是音频输入参数含义说明:
字段 | 含义 | 数据类型 | 取值范围 | 默认值 | 说明 | 必填 |
---|---|---|---|---|---|---|
encoding | 音频编码 | string | lame, speex, opus, speex-wb | speex-wb | 取值范围可枚举 | 否 |
sample_rate | 采样率 | int | 16000, 8000 | 16000 | 音频采样率,可枚举 | 否 |
channels | 声道数 | int | 1, 2 | 1 | 声道数,可枚举 | 否 |
bit_depth | 位深 | int | 16, 8 | 16 | 单位bit,可枚举 | 否 |
data | 音频数据 | string | 音频大小:0-10M | 否 | ||
frame_size | 帧大小 | int | 最小值:0, 最大值:1024 | 0 | 帧大小,默认0 | 否 |
# 6.7.3 获取能力输出结果
结果将通过实现AIKitCoreDelegate协议的callback类onResult方法返回,callback 实现可参考6.5节;能力结果数据格式及含义如下:
- 能力结果数据格式及含义如下:
数据段名称:rlt
数据类型:文本
以下是文本输出参数含义说明:
字段 | 含义 | 数据类型 | 取值范围 | 默认值 | 说明 |
---|---|---|---|---|---|
encoding | 文本编码 | string | utf8, gb2312 | utf8 | 取值范围可枚举 |
compress | 文本压缩格式 | string | raw, gzip | raw | 取值范围可枚举 |
format | 文本格式 | string | plain, json, xml | json | 取值范围可枚举 |
data | 文本数据 | string | 文本大小:0-1M |
输出结果示例:
func_wake_up:{"rlt":[{"sid":"undefine","istart":4,"iresid":1,"iresIndex":0,"iduration":96,"nfillerscore":83645,"nkeywordscore":196206,"ncm_keyword":1993,"ncm_filler":0,"ncm":1993,"ncmThresh":1120,"decConfidence":0.000000,"keyword":"你好小迪","nDelayFrame":0,"wakeUpType":0}]}
- func_wake_up:唤醒结果
结果json参数 | 字段含义 |
---|---|
sid | 本次会话唤醒的任务id |
istart | 唤醒词开始时间(单位是10ms) |
iresid | 唤醒词序号 |
iresIndex | 无需关注 |
iduration | 唤醒词持续时间(单位是10ms,例如78表示时间长度是 780ms) |
nfillerscore | - |
nkeywordscore | - |
ncm_keyword | 唤醒词keyword得分 |
ncm_filler | filler得分 |
ncm | 唤醒词得分 |
ncmThresh | 唤醒词门限 |
decConfidence | - |
keyword | 识别到的唤醒词 |
nDelayFrame | - |
wakeUpType | 唤醒类型 |
pl: “ - ” 意味着该参数不重要,无需关注。
# 6.7.4 结束会话
数据处理完毕,调用end方法结束会话,示例代码如下:
int ret = [AiHelper end:handle];
if (ret != 0)
{
return;
}
end方法说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
handle | AIKIT_HANDLE* | 是 | 会话的handle对象 |
# 6.8 SDK逆初始化
当不再使用能力时,需调用逆初始化方法释放资源,示例代码如下:
BOOL ret = [AiHelper unInit];
# 6.9 导入资源验证效果
能力模型资源在AEEResource.boundle下,开发者确保资源已添加到工程中。至此已完成能力接入,可运行测试合成效果。
# 7. 参数构建API说明
# 7.1 功能参数构建
功能参数通 AIKITParameters 类构建,构建方法如下:
- 整型参数构建 [param addInt:PARAM_KEY value:PARAM_VALUE];
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
key | NSString* | 是 | 功能参数名称 |
value | NSInteger | 是 | 功能参数取值 |
- 布尔参数构建 [param addBool:PARAM_KEY value:PARAM_VALUE];
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
key | NSString* | 是 | 功能参数名称 |
value | BOOL | 是 | 功能参数取值 |
- 字符串参数构建 [param addString:PARAM_KEY value:PARAM_VALUE];
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
key | NSString* | 是 | 功能参数名称 |
value | NSString* | 是 | 功能参数取值 |
- 浮点参数构建 [param addDouble:PARAM_KEY value:PARAM_VALUE];
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
key | NSString* | 是 | 功能参数名称 |
value | Double | 是 | 功能参数取值 |
示例代码如下:
AIKITParameters *abilityParams = [[AIKITParameters alloc] init];
[abilityParams addString:"stringKey" value:"stringValue"];
[abilityParams addDouble:"doubleKey" value:1.001];
[abilityParams addInt:"intKey" value:100];
[abilityParams addBool:"boolKey" value:true];
# 7.2 能力输入数据
输入数据通过AIKITInputData构造,通过 addPayload 方法添加输入数据,输入数据支持文本、图片、音频、视频等格式,分别通过AIText、AIImage、AIAudio、AIVideo封装输入数据及输入数据属性。
- AIAudio 类接口说明
接口 | 参数说明 | 方法说明 | 是否必填 |
---|---|---|---|
+get: | key:NSString* | 设置输入数据key | 是 |
-status: | status: DataStatus | 设置当次输入数据状态,标识当前数据是首次输入、中间数据、结束数据、一次性输入4种类型,对应DataStatusBegin、DataStatusContinue,、DataStatusEnd,、DataStatusOnce | 否 |
-begin | 快速标识数据首帧状态,等同于aiText.status(DataStatusBegin) | 否 | |
-cont | 快速标识数据中间数据,等同与aiText.status(AiStatus.DataStatusContinue) | 否 | |
-end | 快速标识数据尾数据,等同与aiText.status(DataStatusEnd) | 否 | |
-once | 快速标识数据状态,一次性输入,等同与aiText.status(DataStatusOnce) | 否 | |
-data: | data:NSData* | 设置输入参数 | 是 |
-encoding: | encoding:NSString* | 设置音频编码 | 否 |
-channels: | channels: NSInteger | 设置声道数 | 否 |
-bitDepth: | bitDepth: NSInteger | 设置位深 | 否 |
-sampleRate: | dims:NSInteger | 设置采样率 | 否 |
-valid | 输入数据校验,返回AIText对象 | 是 |
示例代码如下:
//输入音频数据
AIAudio *aiAudio = AIAudio
.get("$key") //必填项:输入输入音频key
.encoding($encoding) //非必填:设置音频编码格式
.sampleRate($sampleRate) //非必填:设置音频采样率
.channels($channels) //非必填:设置音频声道数
.bitDepth($bitDepth) //非必填:设置音频位深
.data(part) //必填项:part为 byte[]类型输入数据
.status(AiStatus.BEGIN) //非必填:设置输入数据状态
.valid(); //必填项:输入数据合法性检查
# 8. 高级功能
# 8.1 日志配置
[AiHelper setLogInfo:(AIKITLogLvl)logLevel mode:logMode path:docPath];
日志配置参数说明:
参数 | 类型 | 说明 |
---|---|---|
LogLvl | int32_t | 日志级别枚举值如下:, AIKITLogInfo , AIKITLogWarn , AIKITLogError , AIKITLogFatal , AIKITLogOff |
LogMode | int | 日志模式(stadout:0 logcat:1 file:2) |
LogPath | String | 日志文件名称,默认保存在沙盒路径下 /AIKIT/log |
# 8.2 个性化数据卸载
已加载的个性化数据,如果不在使用或者需要替换,需要卸载已加载的个性化资源,示例代码如下:
[AiHelper unloadData:e867a88f2 key:key_word index:$index]
可配置参数
参数 | 类型 | 说明 |
---|---|---|
ability | String | 能力id |
key | String | 个性化数据唯一标识 |
index | String | 个性化数据索引 |
# 错误码
错误码 | 含义 | 自查指南 |
---|---|---|
18001/ 18002/ 18003/ 18004 | 授权问题 | Linux 平台删除授权文件,将设备联网,重启应用,重新从云端获取授权文件; Android端清除应用缓存,将设备联网,重启应用,重新从云端获取授权文件; 如仍有问题,请联系平台技术支持协助解决。 |
18005 | 授权已过期 | 能力授权已过期。 |
18006 | 授权时间错误,设备时间比标准时间慢 30 分钟以上 | 设备时间不准确导致,请校正设备时间为标准时间,重启应用。 |
18007 | 授权应用不匹配(apiKey、apiSecret) | apiKey、apiSecret 配置有误,请核对项目中配置的 apiKey、apiSecret 。 |
18008 | 授权文件激活过期 | 非永久授权激活文件的有效期为 3天,Linux 平台删除授权文件、Android平台清除应用缓存后重启应用重新激活; 若设备无法联网,请重新申请离线激活文件,在 3 天内激活。 |
18010 | 离线授权激活文件 | 指定平台与设备平台不匹配批量授权激活文件不支持当前设备平台,离线批量授权文件仅只支持申请时指定的的特定平台,不可多平台混用。 |
18011 | 离线授权激活文件 | 指定架构与设备 CPU 架构不匹配批量授权激活文件不支持当前设备架构,离线批量授权文件仅只支持申请时制定的特定架构,不支持多架构混用。 |
18012 | 离线授权激活文件中包含 license 个数异常 | 离线批量激活文件异常,请检查设备中使用的离线激活文件与所申请的是否一致. |
18013 | 离线授权激活文件中未找到当前设备 | 批量离线授权激活文件中不包含改设备,请联网激活或申请离线授权激活文件。 |
18014 | 离线授权激活文件中设备指纹安全等级非法 | 离线授权文件中安全等级错误,请联系平台重新提供。 |
18100/ 18101/ 18102 | 资源错误 | 请仔细检查所用资源与平台提供的资源是否一致,可通过MD5对比,请使用提供SDK时附带的成套资源。 |
18104 | 资源路径打开失败 | 资源路径无读写权限,请确保在 SDK 初始化时以获取到读写权限,或将资源路径设置为有读写权限的路径下。 |
18105 | 资源加载失败,workDir 内未找到对应资源 | 请根据日志提示将所需资源导入到指定路径下。 |
18106 | 资源卸载失败 | 请检查代码是否存在未初始化时调用 SDK uninit 方法,或多次调用 uninit 方法 |
18200 | 引擎鉴权失败 | 应用授权信息与SDK不对应。 1. 请尝试将设备联网后重启应用; 2. 请检查您项目中使用的SDK和平台提供的是否一致; |
18201 | 引擎动态加载失败 | 请检查日志中打印的引擎库是否已导入到项目中 |
18202 | 引擎未初始化 | 请检查调用能力前是否已初始化引擎及初始化是否成功。 |
18203 | 引擎不支持该接口调用 | 请参照 Demo 仔细检查方法调用是否正确。 |
18301 | SDK未初始化 | 在使用能力前请先初始化 SDK,如果有调用 uninit 方法,再次使用能力时需要重新初始化。 |
18302 | SDK初始化失败 | 请根据CoreListener回调中返回的错误码参考此文档做对应检查。 |
18303 | SDK | 已经初始化重复初始化导致,使用能力时,SDK 只需要初始化一次,请检查 SDK 初始化逻辑是否存在多次初始化。 |
18304 | 不合法参数 | 请参考demo及协议文件仔细检查所传参数是否正确;若确认无误,请联网后重启应用后重试。 |
18305/18306 | 会话不存在或已销毁 | 1. 请检查 start 方法调用是否返回成功; 2. 请排查代码是否在调用 end 方法结束会话后又调用了 write 或read 方法。 3. 请确保 end 方法在能力执行完毕后调用,能力执行结果会在 onEvent 中回调。 |
18307 | 会话重复终止 | 该错误一般为重复调用 end 方法导致, 请仔细检查代码是否有重复调用 end 方法。 |
18310 | 会话重复开启 | start 、end方法需成对调用,请仔细检查代码逻辑是否存在调用start 后未调用end结束会话,又再次调用start 情况出现。 |
18400 | 工作目录无写权限 | 在设置 workDir 时,请确保该工作路径有读写权限。若无法设置读写权限,请修改为有读写权限的工作路径。 |
18401 | 未获取到设备标识 | 没有获取到组成设备指纹所必须的组成项,请确认 mac、AndroidID、SN 等是否能获取到,请根据授权安全等级确保能获取对应数量的设备标识。 |
18402 | 文件打开失败 | 请检查 日志中所打印的文件是否存在,以及对应路径下是否有读权限。 |
18404 | 设备指纹比较失败 | 设备指纹组成项发生变化导致,获取到的设备指纹与缓存的设备指纹不一致,请将设备联网后重启应用重试。 |
18500 | 未找到该参数 key | 请参照demo或协议文档仔细检查参数名拼写。 |
18501 | 参数范围溢出,不满足约束条件 | 请根据协议检查调用 SDK 方法时所传参数范围,需要确保所传参数符合协议约束要求。 |
18502 | SDK 初始化参数为空 | 请根据 SDK 集成文件检查 SDK 初始化代码,确保必填参数有值且合法。 |
18503 | SDK 初始化参数中 appId 为空 | appId 为空值,请在 SDK 初始化时传入正确的 appId 值。 |
18504 | SDK 初始化参数中 apiKey为空 | apiKey为空值,请在 SDK 初始化时传入正确的 apiKey值。 |
18505 | SDK 初始化参数中 apiSecret 为空 | apiSecret 为空值,请在 SDK 初始化时传入正确的 apapiSecret 值。 |
18506 | abilityId 参数为空 | abilityId 为空值,请检查 引擎初始化方法及调用能力方法时所传的 abilityId 是否正确。 |
18507 | input 参数为空 | 请检查调用能力方法时 input 参数是否为空。 |
18508 | 输入数据参数 Key 不存在 | 请根据协议文档检查输入参数的 key。 |
18509 | 必填参数缺失 | 请根据文档或demo检查参数漏传项。 |
18510 | 输出参数缺失 | 能力输出参数缺失 |
18520 | 不支持的编解码类型 | 输入的编解码格式不支持 |
18600 | 协议中时间戳字段缺失 | 请将设备联网后重启应用。 |
18601 | 协议中未找到该能力 ID | 请确认 SDK 初始化时所传 appId、 apiKey、apiSecret 是否正确; 若无误请删除授权文件或清空应用缓存后重启应用; 请确认所传能力 ID 是否正确; 请联系平台协助排查授权是否已过期或授权量已用完。 |
18602 | 协议中未找到该资源 | 请确认 SDK 初始化时所传 appId、 apiKey、apiSecret 是否正确; 请将设备联网后重新应用重试; 请确认是否已申请授权过该资源。 |
18603 | 协议中未找到该引擎 | 请确认 SDK 初始化时所传 appId、 apiKey、apiSecret 是否正确; 请将设备联网后重新应用重试; 请确认项目中使用SDK版本是否正确。 |
18606 | 协议能力接口类型不匹配 | 请根据协议检查能力接口类型是否一致,流式与非流式接口不可混用。 |
18700 | 能力未授权 | 该SDK未授权,请申请授权。 |
18701 | 网路不通 | 请检查网络连接是否正常。 |
18702 | 网关检查不过 | 检查设备时间是否正确; 请检查 SDK 初始化时所传 apiKey、apiScrect 是否正确。 |
18703 | 云端响应格式不对 | 请检查网络是否可以正常访问外网。 |
18704 | 应用未注册 | 请检查appid 是否正确。 |
18705 | 应用 ApiKey & ApiSecret 校验失败 | 请检查 apiKey、apiSecret 是否正确。 |
18706 | 引擎不支持的平台架构 | 您所使用的能力不支持该设备平台架构,请确认申请的SDK支持的平台架构。 |
18707 | 授权已过期 | 如需继续使用请申请授权延期。 |
18708 | 无可用授权 | 1. 该能力不支持当前平台架构的设备; 2. 授权量已满。 |
18709 | 未找到该 appid 绑定的能力 | 请检查 appId 是否正确;请确认是否已购买该能力。 |
18710 | 未找到该 appid 绑定的资源 | 请检查 appId 是否正确;请检查是否已申请受限资源。 |
18713 | 设备指纹安全等级不匹配 | 设备指纹安全等级不匹配,请申请申请安全等级变更。 |
18714 | appid 错误 | 该appid未申请过授权,请检查appid是否正确。 |
18715 | 未找到该SDKID | 该组合能力SDK未授权,请申请授权。 |
18716 | 未找到该组合能力集合 | 该组合能力未创建,请申请授权。 |
18717 | SDK组合能力授权不足 | 组合能力授权量已用完,需申请追加授权。 |
18718 | 无效授权应用签名 | 应用级授权,应用签名与授权签名不一致。 |
18719 | 应用签名不唯一 | 应用级授权,提供的应用签名有误。 |