Android SDK接入指南说明文档
文档修订记录
| 文档版本号 | 修订日期 | 修订原因 | 备注 |
|---|---|---|---|
| V1.0.0 | 2022.7.20 | 创建文档 | |
| V1.0.1 | 2022.8.3 | 更新混淆规则 | |
| v1.0.2 | 2022.8.18 | 新增vad参数 vadThreshold,模型判定门限 | |
| V1.0.3 | 2023年3月23日 | 更新鉴权接口,更新code释义,更新参数说明 | |
| V1.0.4 | 2023年4月10日 | 更新第三方依赖库说明 | |
| V1.0.5 | 2023年6月20日 | turing_config.json新增brandModel,获取免标定云端配置参数,详情见5.2 globalConfig | 使用免标定指尖:填写brandModel则使用云端配置参数,不填写brandModel则使用本地配置参数。 turingCameraId 如何填写: · 只使用标定版指尖&绘本,填写标定的摄像头id; · 只使用免标定版指尖&绘本,填写0; · 标定与免标定版混合使用,填写标定的摄像头id; |
| V1.0.6 | 2023年7月6日 | 新增接口:getLicenseToken(String SN, TuringInitListener listener) | |
| V1.0.7 | 2024年4月30日 | 新增Demo下载地址 |
一、简介及运行环境
1.1 概述
此文档包括图灵SDK接入指南,以及图灵鉴权接入说明,在接入图灵任何能力前,都需要鉴权成功后才能使用。
1.2 能力硬件要求
基于对摄像头拍摄清晰程度的要求,分类如下: 高端要求:查拼音、查句子、查段落:属于高端OCR 能力,一般需要客户产品的前摄像头具备800W及以上像素 中端要求:查词,一般需要客户产品的前摄像头具备500W及以上像素 低端要求:翻读、指读对客户产品的前摄要求较低。
| 能力名称 | 可支持摄像头 | 内存 | CPU | 分类 |
|---|---|---|---|---|
| 标定版绘本翻指读 | 30W | 2GB | -- | 标定版 |
| 标定版指尖查词 | 500W | 2GB | -- | 标定版 |
| 标定版指尖查句 | 800W | 4GB | -- | 标定版 |
| 免标定绘本翻指读 | 500W | 4GB | -- | 免标定 |
| 免标定指尖查词 | 800W | 4GB | -- | 免标定 |
| 免标定指尖查句 | 800W | 4GB | -- | 免标定 |
| 免标定指尖查拼音 | 800W | 4GB | -- | 免标定 |
| 免标定指尖查段 | 800W | 4GB | -- | 免标定 |
目前图灵针对翻读,指读,查词,查句,查拼音,查段等AI能力具有两套解决方案,分别是标定和免标定,图灵售前同事会根据您的具体产品,推荐您选择合适的方案。 核心的参考指标有两个:图像的清晰度和设备性能 图像清晰度: 指设备采集图片的清晰程度,影响因素有很多,例如:多少万像素,是否针对摄像头进行过调优等 图灵针对客户的图灵质量建立了标准并具体相应的工具,可以方便评估客户的设备是否支持查词,查句等。 设备性能: 设备性能主要用于评估设备是否满足免标定方案,相对于标定方案,免标定方案需要前端具体一定的算力来满足算法要求,目前根据手头设备的具体情况,也建立了基本的标准,但这一指标仅具有参考意义,因为最终的响应时间,还和客户采用的分辨率,系统的内存管理,图片渲染等多因素影响,但低于图灵标准,则不建议用免标定方案
1.3 创建机器人
使用前,请在平台地址图灵官网注册登录。在机器人管理界面中创建机器人,并在机器人信息界面获取APIKey与Secret。
开发集成儿童版SDK前需要申请APIKey与Secret,请在平台地址 图灵官网 注册登录。在机器人管理界面中创建机器人,并在机器人信息界面获取APIKey与Secret
标定版绘本识别和指尖查词需要提前给设备标定摄像头,具体参考摄像头标定流程。
1.4 兼容性
| 类别 | 兼容范围 |
|---|---|
| 系统 | 支持Android 5.0 以上版本 API LEVEL 21 |
| 硬件要求 | 要求设备上有麦克风、摄像头 |
| 网络 | 支持移动网络、WIFI等网络环境 |
| 开发环境 | 建议使用最新版本Android Studio 进行开发 |
1.5 SDK库文件
| 资源名称 | 资源描述 |
|---|---|
| turingsdk-release.aar | aar 库 |
二、集成指南
2.1 添加依赖库
将turingsdk-release.aar复制到您的项目的app/libs/目录下,修改您的项目的app/build.gradle文件,将下面依赖库添加到您的依赖目录中。
// 下面列出的依赖如果有重复,只保留一个
implementation(name: 'turingsdk-release', ext: 'aar')
//motiondetect-release是绘本和指尖查词模块需要的,其他模块不需要
implementation(name: 'motiondetect-releaseV1.0.7', ext: 'aar')
//必须依赖库
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation "org.java-websocket:Java-WebSocket:1.4.0"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.11'//SDKV2.4.1.25 以后需加入
//坐姿检测
implementation 'com.squareup.moshi:moshi:1.9.3'
implementation "androidx.security:security-crypto:1.1.0-alpha03"
// 指尖&绘本(标定、免标定)
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
// 免标定指尖绘本
def room_version = "2.4.2"
def corotine_version ="1.3.9"
api "androidx.room:room-runtime:${version["room_version"]}"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:${version["corotine_version"]}"
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:${version["corotine_version"]}"
kapt "androidx.room:room-compiler:${rootProject.ext.version["room_version"]}"
// 指尖&词典
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
// 口算批改
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation "com.squareup.retrofit2:converter-moshi:2.6.0"
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
implementation "com.squareup.moshi:moshi-kotlin:1.13.0"
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.13.0"
implementation "androidx.work:work-runtime-ktx:2.7.1"
2.2 AndroidManifest.xml 权限
<!--网络-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--文件读写-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--录音 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--deviceID-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--绘本、指尖查词-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 读取手机状态,获取IMEI -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<!-- android 10 -->
在application节点添加以下适配高版本
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
备注:android 6.0 以上版本权限需动态申请。
2.3 build.gradle配置
android{
defaultConfig {
ndk {
abiFilters "armeabi-v7a","arm64-v8a"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
2.4 添加配置文件
将turing_config.json配置文件放在main/assets文件夹下,手动修改参数值,详细配置如下,字段说明见“配置文件参数说明”。
{
"authorization": {
"apikey": "您的apikey",
"secret": "您的secret"
},
"globalConfig": {
"brandModel":"您的品牌型号",
"camera": {
"cameraId": 1,
"cameraApi": 3,
"turingCameraId": 118,
"preMirror": false,
"mirror": true,
"zoom": 0,
"preRotation": -1,
"rotation": 180
}
},
"ability": {
"bookCamera": {
"previewWidth": 640,
"previewHeight": 480,
"imgQuality": 90,
"smallImgQuality": 100
},
"book": {
"useQa": false,
"deviceType": 5,
"innerUrlFlag":true,
"cameraHeight":-1.0,
"languageOrder": 1,
"textFlag": 1,
"accessModel": 1,
"modelOrder": 1,
"imageType": "jpg",
"osState": "",
"readQuestion": false
},
"textBook":{
"sceneMode":0,
"zipUrlFlag": 0,
"categories": [
1,2,3,4,5
],
"regMode": 2,
"innerAudio": 0,
"languageOrder":1,
"accessMode": 1,
"textFlag": 3,
"audioType": 1,
"osState": ""
},
"finger": {
"imgQuality": 100,
"showPoint": true,
"horMirror": false,
"verMirror": false,
"pointColor": "#FC0202",
"pointWidth": 10,
"appMode": 0,
"maxLen": 4,
"selectType": "wordV",
"dictType": "tuling",
"ocrMode": 0,
"optMode": 1,
"openTts": true,
"motionSensitivity": 64.0,
"previewWidth": 640,
"previewHeight": 480,
"pictureWidth": 2560,
"pictureHeight": 1920,
"cropRatio": [0.0,1,0.0,1]
},
"nlp": {
"codes": [],
"robotSkills": {
}
},
"tts": {
"tone": "huiting",
"format": "MP3_16_16",
"speed": 5,
"volume": 5,
"pitch": 5,
"arousal": 6
},
"asr": {
"asrSrcFormatEnum": -1,
"asrFormatEnum": 0,
"asrLanguageEnum": 0,
"asrRateEnum": 16000,
"channel": 1,
"enableITN": true,
"enablePunctuation": false,
"enableVoiceDetection": true,
"intermediateResult": true,
"maxEndSilence": 1000,
"maxStartSilence": 5000,
"vadThreshold": 0.1,
"vadReviseTime": 1200,
"interactionTime": 20,
"enableCloudVad": false,
"enableVolume": false,
"audioSource": 1
}
}
}
2.5 动态配置参数
方法一:(推荐)
val configData: ConfigData = TuringConfig.getInstance(this).configData
configData.authorization.apikey ="*******"
configData.authorization.secret ="*******"
configData.globalConfig.camera.turingCameraId ="118"
TuringInitializer.getInstance(this).setGlobalConfig(configData)
方法二:
TuringConfig.getInstance(this).configData.authorization.apikey = "*******"
TuringConfig.getInstance(this).configData.authorization.secret = "*******"
TuringConfig.getInstance(this).configData.globalConfig.camera.turingCameraId = 118
注意:
如果是动态修改TuringCameraId,则需要在鉴权前设置。
2.6 其他配置
Android 10以上(包括10),需在清单文件中,application标签下,加入如下配置
android:usesCleartextTraffic="true"
如果需要保存文件到sdcard中,则需要加入权限及配置
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true">
2.7 混淆
-keep class com.iflytek.**{ *;}
-dontwarn com.iflytek.**
-keep class com.turing.**{ *;}
-dontwarn com.turing.**
-keep class com.sdk.finger.**{ *;}
-dontwarn com.sdk.finger.**
-keep class org.java_websocket.**{*;}
-dontwarn org.java_websocket.**
-keep class org.slf4j.**{*;}
-dontwarn org.slf4j.**
-keep class org.eclipse.** { *; }
-dontwarn org.eclipse.**
-keep class net.idik.lib.cipher.so.encrypt.**{
*;
}
-keep class com.Posture.detection**{
*;
}
-keep class com.tcl.detection.**{
*;
}
-keep class com.aiworks.**{
*;
}
-keep class com.youdao.sdk.** { *;}
-keep class com.youdao.zhiyun.sdk.** { *;}
-keep class com.youdao.compositioncorrection.**{*;}
三、鉴权初始化
随着Android版本的更新,设备唯一标识无法保证都能获取到。图灵的鉴权方法有多个可供使用,每个鉴权方法读取或使用的deviceID方式不一样,客户需要根据自己的实际情况选择不同的鉴权方法。
注意:使用图灵SDK的任何模块功能时,都需要调用鉴权接口。请在鉴权成功之后,再使用其他能力。
3.1 实例化
com.turing.license.api.TuringInitializer
TuringInitializer turingInitializer = TuringInitializer.getInstance(this)
3.2 接口说明
public interface InitializeInterface {
/**
* 初始化,设备唯一标识根据不同系统版本有不同的值
*
* @param initListener 回调接口
*/
void init(TuringInitListener initListener);
/**
* 初始化
*
* @param deviceID 设置唯一标识
* @param initListener 回调接口
*/
void init(String deviceID, TuringInitListener initListener);
/**
* V3鉴权,使用离线功能,需使用V3鉴权,不传SN,用于普通SDK接入
*
* @param initListener
*/
void initV3(TuringInitListener initListener);
/**
* V3鉴权,使用离线功能,需使用V3鉴权,用于普通SDK接入,推荐使用此方法
*
* @param initListener
* @param customId 唯一标识,用于对比鉴权数量。
*/
void initV3(TuringInitListener initListener, String customId);
/**
* V3鉴权,使用离线功能,需使用V3鉴权,传SN,用于混合SDk接入方式
*
* @param sn
* @param initListener
*/
void initV3(@NonNull String sn, TuringInitListener initListener);
/**
* V3鉴权,使用离线功能
* @param deviceType 用于鉴权的唯一标识,可选择:SN,MAC,IMEI
* @param listener
*/
void initV3(@DeviceIdType.DeviceType int deviceType, TuringInitListener listener);
/**
* V3鉴权,使用离线功能,需使用V3鉴权
*
* @param deviceId 鉴权使用的唯一标识
* @param initListener
*/
void initV3Uid(@NonNull String deviceId, TuringInitListener initListener);
/**
* 纯离线能力的V3鉴权,不传SN,用于普通SDK接入
*
* @param initListener
*/
void initOfflineV3(TuringInitListener initListener,InitParams initParams);
/**
* 纯离线能力的V3鉴权,传SN,用于混合SDk接入方式
*
* @param initListener
*/
void initOfflineV3(String SN, TuringInitListener initListener, InitParams initParams);
/**
* V4鉴权,工厂鉴权方式,需提前使用云端鉴权接口鉴权,获取到authInfo写入设备,调用该接口时,从设备读取并传入。
*
* @param deviceId 鉴权使用的唯一标识,必须与调用云端API接口传入的Id一致
* @param authInfo 鉴权信息
* @param initListener 回调接口
*/
void initV4Uid(@NonNull String deviceId, String authInfo,TuringInitListener initListener);
/**
* 设置服务器环境,内部测试接口,开发者不需要设置,默认正式环境
* 已弃用,如要设置服务器环境,请使用 setDebugParams(com.turing.common.params.GlobalParams)
* @param type
*/
@Deprecated
void setRequestPath(@UserData.ServerChannel int type);
/**
* 设置写入log文件接口
* 已弃用,如要设置服务器环境,请使用 setDebugParams(com.turing.common.params.GlobalParams)
* @param debugPath 日志路径
* @param isWrite 是否写入
*/
@Deprecated
void setWriteLog(String debugPath, boolean isWrite);
/**
* 设置全局调试参数,可用于设置debug日志输出,文件保存,音频文件,图片保存等参数
* @param globalParams 全局调试参数
*/
void setDebugParams(GlobalParams globalParams);
GlobalParams getDebugParams();
/**
* 获取鉴权信息
* @return 鉴权信息
*/
AuthUserInfo getLicenseInfo();
/**
* 获取token,仅支持提前上传设备号的apikey
* @param SN 提前上传的设备唯一Id
* @param listener 回调接口,成功回调返回token值
*/
void getLicenseToken(String SN, TuringInitListener listener);
/**
* 动态设置配置参数
*
* @param configData 参数配置类
*/
void setGlobalConfig(ConfigData configData);
/**
* 获取SDK版本
*
* @return
*/
String getSDKVersion();
interface TuringInitListener {
/**
* 初始化成功回调
*
* @param deviceID 设备唯一标识
*/
void onSuccess(String deviceID);
/**
* 初始化失败回调
*
* @param errorCode 错误码,错误码见{ TuringCode}
* @param errorMsg 鉴权失败信息
*/
void onError(int errorCode, String errorMsg);
}
}
3.2.1 TuringInitListene接口说明
interface TuringInitListener {
/**
* 初始化成功回调
*
* @param deviceID 设备唯一标识
*/
void onSuccess(String deviceID);
/**
* 初始化失败回调
*
* @param errorCode 错误码,错误码见{ TuringCode}
* @param errorMsg 鉴权失败信息
*/
void onError(int errorCode, String errorMsg);
}
3.2.2 InitParams
| 参数 | 类型 | 说明 |
|---|---|---|
| tryTime | int | 重试请求次数 |
| licensePath | String | 图灵鉴权文件路径 |
3.2.3 GlobalParams
| 参数 | 类型 | 说明 |
|---|---|---|
| serverType | int | 设置运行环境,ALPHA:1,BETA:2,PRODUCT:3,默认使用PRODUCT正式环境 |
| openLog | boolean | 是否开启日志打印,默认true |
| logLevel | int | 日志级别;1:重要日志,INFO及以上,2:DEBUG日志,DEBUG及以上(默认),3:所有日志 |
| debugPath | String | 文件保存路径,图片、日志文件、音频等 |
| isWriteImg | boolean | 是否写入debug图片,绘本、指尖查词等,默认false |
| isWriteFingerTip | boolean | 是否写入指尖识别图片,默认false |
| isSaveRecord | boolean | 是否保存音频文件,默认false |
| isWriteLog | boolean | 是否写入日志文件,默认false |
| isRemoteDebug | boolean | 是否打开绘本云端debug,默认false |
3.2.4 AuthUserInfo
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0:正常,40005:无授权信息,但设备已激活 ,40008:请求异常,见message |
| apiKey | String | 您的apikey,开放平台申请 |
| secret | String | 您的secret,开放平台申请 |
| productSN | String | 设备SN号 |
| deviceId | String | 设备鉴权的唯一标识 |
| userId | String | sdkV3 合法设备调用时返回云端系统分配id |
| activateStatus | String | sdkV3 合法设备调用时返回激活状态; 0:正常激活,1:已激活设备 |
| activateTime | String | sdkV3 合法设备调用时返回设备激活时间戳(毫秒) |
四、能力接入
接入详情见各个能力的接入说明文档。
五、配置文件参数说明
5.1 authorization(授权参数)
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| apikey | String | Y | - | 您的apikey |
| secret | String | Y | - | 您的secret |
5.2 globalConfig(全局参数)
"globalConfig": {
"brandModel":"您的品牌型号",
"camera": {
"cameraId": 1,
"cameraApi": 3,
"turingCameraId": 118,
"preMirror": false,
"mirror": true,
"zoom": 0,
"preRotation": -1,
"rotation": 180
}
}
全局调试参数,已弃用配置文件中的参数,使用InitializeInterface#setDebugParams(GlobalParams globalParams)替代
5.2.1 GlobalConfig.camera(全局camera参数)
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| cameraId | int | N | 0,1 | 摄像头ID,1-前置,0-后置 |
| cameraApi | int | Y | 1,2,3,4 | CAMERA_1 = 1; CAMERA_2 = 2; CAMERA_USB = 3; //USB摄像头 |
| turingCameraId | int | N | - | 只使用标定版指尖&绘本,填写标定的摄像头id; 只使用免标定版指尖&绘本,填写0; 标定与免标定版混合使用,填写标定的摄像头id; |
| preMirror | booleab | N | - | 预览视图是否镜像 |
| mirror | boolean | N | - | 是否开启镜像,标定后优先使用云端配置 |
| preRotation | int | N | 90、180、270、360 | 预览旋转角度,-1表示不设置 |
| rotation | int | N | 90、180、270、360 | 图片旋转角度,标定后优先使用云端配置 |
| zoom | int | N | Camera1:0~Camera1支持的最大变焦值; Camera2:0~Camera2支持的最大变焦值*10 |
变焦镜头 |
| gestureZoom | boolean | N | - | 是否开启手势触摸变焦 |
a. 目前全局 cameraId 作用于绘本和指尖查词能力。
b. Camera支持的最大变焦值,可调用SDK提供方法获取:com.turing.common.util.CameraDeviceUtil#getCamera1SupportMaxZoom()|getCamera2SupportMaxZoom()。
5.2.2 GlobalConfig.brandModel
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| brandModel | String | N | -- | 填写biz平台上创建的品牌型号。 使用免标定指尖:填写则使用云端配置参数,不填写则使用本地配置参数。 |
5.3 bookCamera(绘本camera参数)
"bookCamera": {
"previewWidth": 640,
"previewHeight": 480,
"imgQuality": 90,
"smallImgQuality": 60
}
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| previewWidth | int | N | - | 预览图片像素宽 |
| previewHeight | int | N | - | 预览图片像素高 |
| imgQuality | int | Y | 0-100 | 大图片质量 |
| smallImgQuality | int | N | 0-100 | 小图片质量(320*240) |
5.4 book(绘本2.0请求参数)
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| deviceType | int | N | - | 设备类型,请求类型。0-普通类型(默认),1-⼿机app。设置1时,不需要传入摄像头其他参数。固定传入cameraId=1 |
| cameraHeight | float | N | - | 摄像头高度(支架参数,若有则覆盖默认参数) |
| innerUrlFlag | Boolean | N | - | 方案商是否需要每页的音频URL链接,(非必填,默认为false) |
| languageOrder | int | N | - | 绘本语言版本顺序(针对多语言版本绘本):languageOrder=1:中文版本绘本优先,languageOrder=2:英文版本绘本优先。 |
| textFlag | int | N | - | 是否返回文本,0不返回,1返回热区文本 默认0 |
| accessModel | int | N | - | 访问模型;1:公有库+私有库;2:公有库;3:私有库,默认1 |
| modelOrder | int | N | - | 优先级顺序;1:公有库优先;2:私有库优先,默认2 |
| useQa | Boolean | N | - | 开启QA模式:false(default),使用需要管理平台开通对应题库 |
| imageType | String | N | - | 图片类型 |
| readQuestion | String | N | TRUE,FALSE,CANCEL | 问答状态,客户端是否完成题目信息的输出(result-values中包含"contentType":"question"的为题目内容)。不上传状态,默认不可以回答指读类题目 |
| osState | String | N | clean | 清除休眠状态,非休眠状态不可使用(异常1009) |
5.5 textBook(绘本3.0请求参数)
详细说明见《标定绘本识别接入文档》《免标定绘本识别接入文档》
5.6 finger(指尖查词配置)
详细说明见《标定指尖识别接入文档》《免标定指尖识别接入文档》
5.7 nlp(语音对话、NLP)
详细说明见《语义理解接入文档》
5.8 tts(语音对话、TTS)
详细说明见《在线TTS接入文档》
5.9 asr(语音对话、ASR)
详细说明见《在线ASR接入文档》
六、错误码
6.1 intentCode
| intentCode | 说明 |
|---|---|
| 200 | 识别绘本封面成功 |
| 201 | 识别绘本内页成功 |
| 202 | 绘本扉页识别成功 |
| 203 | 绘本无文本内页识别成功 |
| 204 | 绘本无意义内页识别成功 |
| 205 | 封面识别成功,热区识别成功 |
| 206 | 封面识别成功,热区识别失败 |
| 207 | 内页识别成功,热区识别成功 |
| 208 | 内页识别成功,热区识别失败 |
| 209 | 卡片识别成功,输出协议与绘本封面识别成功一致 |
6.2 intent-operateState
| operateState | 说明 |
|---|---|
| 1010 | 上传状态错误 |
| 1110 | 上传状态正确 |
| 1120 | 上传状态重复 |
| 1200 | 休眠状态 |
| 2000 | 绘本识别正常 |
| 3000 | 文本类问题数据输出,开启文本输入 |
| 3100 | 回答问题结束状态, 不再处理非图片类型请求 |
| 3200 | 回答问题状态(所有类型)-继续回答问题 |
| 3240 | 图片类问题-回答问题时被判断为无效的输入(不参与答题,前端可忽略该输出) |
| 3300 | 音频类问题数据输出,开启音频输入(注意音频类型!) |
| 3400 | 图片类问题数据输出。 |
| 1001 | 绘本图片识别异常,有intentCode |
| 1005 | 图片内容大小非法(取值范围:[1,200]kb) |
| 1006 | 图片内容处理异常 |
| 1007 | 请求Type非法 |
| 1008 | 请求中无图片信息 |
| 1009 | 错误输入(非法使用唤醒功能) |
6.3 云端Code
| code | 说明 |
|---|---|
| 200 | 正确结果返回 |
| 210 | 参数初始化成功 |
| 220 | 参数上传完成,正在请求nlp/tts |
| 230 | ASR/NLP正确处理,但tts功能处理失败(单独请求TTS功能,异常时也返回该code) |
| 240 | 输入参数为空,nlp/tts不处理 |
| 250 | robot TTS调用次数耗尽 |
| 260 | TTS 流式处理状态 |
| 261 | AIGC生成内容中间结果 |
| 262 | AIGC生成内容结束 |
| 270 | 测评中间结果 |
| 280 | 测评最终结果 |
| 291 | OCR文本TTS结果 |
| 292 | OCR,TTS处理失败,请稍后再试。 |
| 293 | OCR文本分词结果 |
| 294 | OCR分词处理失败 |
| 295 | OCR中间结果返回-无分词 |
| 300 | 无效数据:二进制参数已完成传输,不要发送该数据 |
| 4004 | 机器人类型非法 |
| 4005 | apikey信息错误 |
| 4006 | deviceId信息错误 |
| 4007 | 解密失败,您的加密逻辑存在异常 |
| 4008 | 数据内容格式错误 |
| 4009 | 机器人被禁用 |
| 4010 | 试用期已过 |
| 4011 | 系统不支持二进制参数 |
| 4012 | 今天我们已经聊了很多啦,明天再来找我聊天吧。 |
| 4013 | 这一小时的对话次数已经超过我的极限啦,让我休息一下,待会再聊 |
| 4014 | 这一分钟里我们已经聊了很多啦,休息,休息一下吧 |
| 4015 | 二进制参数错误,请确定binarysId是否对应 |
| 4016 | 单次交互时间过长,请查看文档! |
| 4017 | 二进制参数错误,有重复binarysId! |
| 4018 | 二进制参数输入状态异常 |
| 4019 | 二进制参数处理时间超时/第三方引擎参数错误 |
| 4020 | ASR权限异常 |
| 4021 | TTS权限异常 |
| 4022 | 二进制传输内容过大! |
| 4023 | 单次交互同类型的二进制参数只允许输入一个 |
| 4025 | 上传数据失败,请稍后~ |
| 4026 | nlp/tts请求内容过长 |
| 4027 | 请求类型不能为空 |
| 4028 | 丢弃任务:同一用户不允许同时处理一个以上的ASR请求 |
| 4029 | robot ASR调用次数耗尽 |
| 4030 | robot NLP调用次数耗尽 |
| 4031 | uri不支持 |
| 4032 | 请求时间戳偏与服务器时间偏差太大,message为服务器时间戳 |
| 4033 | OCR权限异常 |
| 4100 | 服务正在升级 请稍后再试 |
| 4101 | 请求没有正确初始化! |
| 4102 | 长时间未请求业务,关闭连接 |
| 4200 | robot信息异常 |
| 4201 | nlp/tts处理异常 |
| 4202 | tts数据为空 |
| 5001 | 音频信息参数错误 |
| 5002 | 未上传任何二进制数据 |
| 5003 | ASR音频格式不支持 |
| 5004 | ASR引擎链接异常 |
| 5005 | ASR引擎异常超时 |
| 5006 | ASR引擎异常 |
| 5007 | ASR数据传输失败,没有初始化 |
| 5008 | ASR二进制数据转码失败 |
| 5010 | ASR不支持混合模式识别 |
| 5100 | 评测启动失败,请稍后再试 |
| 5101 | 评测状态错误,请正确上传文件 |
| 5102 | 评测类型非法 |
| 5103 | 评测内容为空 |
| 5104 | userid并发请求测评功能 |
| 5105 | 测评失败,请查看错误信息 |
| 5200 | OCR引擎链接异常 |
| 5201 | OCR客户端非法并发请求 |
| 5202 | OCR处理异常 |
6.4 TuringCode
应用端处理code时,建议使用TuringCode类的常量,不要直接使用固定值
| 常量名称 | code | 说明 |
|---|---|---|
| NETWORK_ERROR | 100001 | 网络未连接 |
| DEVICEID_ERROR | 100002 | 获取Device ID异常! |
| VAD_STATE_BEGIN | 100100 | VAD开始状态 |
| VAD_STATE_FINISH | 100101 | VAD结束状态 |
| AUTHORITY_HAS_EXPIRED | 100003 | Apikey过期 |
| CLIENT_PARAM_NULL | 200002 | 输入参数为空 |
| CLIENT_PARAM_ERROR | 200003 | 输入参数错误 |
| CLIENT_REQUEST_OVER | 200004 | 请求任务栈溢出,默认限制200个任务 |
| CLIENT_TIMEOUT | 200005 | 单轮请求20s限制超时 |
| CLIENT_OVER | 200006 | 请求动作太过频繁 |
| CLIENT_ASR_NOINIT | 200007 | ASR已经结束或者通道没有初始化,请停止传入数据 |
| CLIENT_ASR_INIT_TIMEOUT | 200008 | ASR初始化时网络请求超时 |
| CLIENT_ASR_END_TIMEOUT | 200009 | ASR结束时网络请求超时 |
| VAD_INITIALIZE_FAILED | 200010 | VAD初始化失败 |
| VAD_READ_ONE_FRAME_FAILED | 200011 | VAD处理数据异常 |
| VAD_READ_NO_DATA | 200012 | VAD未读取到数据 |
| VOICE_DATA_TIMEOUT | 200013 | 长时间未发送音频数据 |
| VOICE_DATA_ERROR | 200014 | 音频数据为空或者音频数据不合法,音频数据长度不能大于1280个byte,而且要求必须是 |
| CLIENT_BOOK_OVERFLOW | 200015 | 绘本请求频繁 |
| CLIENT_SEND_TIMEOUT | 200016 | 网络请求超时 |
| CLIENT_BOOK_INIT_TIMEOUT | 200017 | 绘本初始化时网络请求超时 |
| CLIENT_BOOK_END_TIMEOUT | 200018 | 绘本结束时网络请求超时 |
| CLIENT_BOOK_NOSTATE | 200019 | 当前不在绘本识别状态 |
| OPUS_CODEC_INITIALIZE_FAILED | 200020 | opus codec initialize error ! |
| OPUS_CODEC_PROCESS_FAILED | 200021 | opus codec process data error ! |
| CLIENT_FINGER_END_TIMEOUT | 200022 | 指尖查词时网络请求超时 |
| PERMISSION_MANAGE_EXTERNAL_STORAGE | 200023 | 没有MANAGE_EXTERNAL_STORAGE权限 |
| WSS_REQUEST_FAILED | 200024 | webSocket 请求失败,请重试 |
| VOICE_PROGESS_FAILED | 200030 | btn_to_voice initialize error ! |
| CLIENT_RECOGNIZE_ERROR | 200031 | 识别失败,请重试 |
| CLIENT_CONFIG_ERROR | 200032 | 配置文件异常 |
| CLIENT_DPI_NOT_MATCH | 200033 | 图片分辨率与云端配置的分辨率不匹配 |
| BOOK_STATE_RESET_FAILED | 200034 | 绘本状态重置失败 |
| HTTP_REQUEST_FAILED | 200035 | 网络请求失败 |
| DATA_PARSER_ERROR | 200036 | 数据解析异常 |
| CLIENT_CAMERA_ERROR | 200037 | 摄像头配置异常 |
| CLIENT_CAMERA_OPEN_ERROR | 200038 | 摄像头打开失败 |
| CLIENT_FILE_WRITE_ERROR | 200039 | 文件写入失败 |
| RECORDER_READ_ONE_FRAME_FAILED | 200040 | recorder process data error ! |
| RECORDER_INITIALIZE_FAILED | 200041 | recorder initialize error ! |
| CLOUD_DATA_ERROR | 200042 | 云端数据解析错误 |
| VAD_WRITE_DATA_FAILED | 200043 | vad 写入数据失败 |
| CLIENT_END_TIMEOUT | 200044 | 结束时网络超时 |
| OFFLINE_AUTHORITY_DATA_ERROR | 200050 | 离线鉴权数据异常 |
| CAMERA_INFO_DATA_ERROR | 200051 | CameraInfo 数据异常! |
| PERMISSION_NOT_ALLOW | 200060 | 未授予应用权限 |
| GET_DEVICE_ID_FAILED | 200061 | 获取设备唯一标识失败 |
| CLIENT_OTHER_ERROR | 200099 | 其他错误 |
| V3_INIT_ERROR | 200100 | V3 init error! |
| V3_ACCESS_USERINFO_ERROR | 200101 | V3 access userinfo error! |
| PERMISSION_NO_OFFLINE_DICT | 200105 | 请检查是否授权离线词典能力! |
| PERMISSION_NO_OFFLINE_VAD | 200106 | 请检查是否授权离线VAD能力! |
| PERMISSION_NO_OFFLINE_TTS_TRANS | 200107 | 请检查是否授权离线TTS能力! |
| PERMISSION_NO_OFFLINE_HAND | 200108 | 请检查是否授权离线指尖能力! |
| PERMISSION_NO_OFFLINE_DNTTS | 200109 | 请检查是否授权离线DNTTS能力! |
| PERMISSION_NO_CAMERA | 200200 | 未开启相机权限 |
| CAMERA_NOT_SUPPORT_CAMERA2 | 200201 | 当前设备不支持 Camera 2.0 |
| CAMERA_CONFIG_FAIL | 200202 | 相机配置失败 |
| DOC_FAIL_DOWNLOAD_AUTHFILE | 200203 | 鉴权文件下载失败 |
| PERMISSION_NO_OFFLINE_DOC | 200204 | 请检查是否授权文档检测能力! |
| DOC_NOT_FIND | 200205 | 未检测到文档 |
| DOC_LACK_ANGLE | 200207 | 检测到文档缺角 |
| DOC_LACK_EDGE | 200208 | 检测到文档缺边 |
| DOC_INIT_ERROR | 200210 | 主体检测模型初始化失败 |
| MATH_NO_ABILITY | 200300 | 未匹配到口算批改能力 |
| PERMISSION_NO_OFFLINE_POSTURE | 200400 | 请检查是否授权坐姿检测检测能力! |
| POSTURE_INPUT_PARAMETER_ERR | 200401 | 输入参数错误 |
| POSTURE_REPEATED_CALL | 200402 | 重复调用 |
| POSTURE_USERINFO_NOT_EXIST | 200403 | 用户信息不存在 |
| POSTURE_NUMBER_OF_USER_REGI_USED_UP | 200404 | 用户注册数量已用完 |
| POSTURE_DEVICEID_EXCEEDED_REGISTERED_USERS | 200405 | 获取的设备信息数量远超用户注册数量 |
| POSTURE_FAILED_TO_INSERT_OR_REGISTER | 200406 | 新设备插入或注册失败 |
| POSTURE_NET_SERVICE_INPUT_PARAMETER_EMPTY | 200407 | 网络服务输入参数为空 |
| POSTURE_SOME_INPUT_PARAMETER_NULL | 200408 | 某些输入参数为空 |
| POSTURE_UNKNOWN_SERVER_EXCEPTION | 200409 | Unknown Server Exception(异常) |
| POSTURE_FAILED_TO_CONNECT_SERVER | 200410 | 接服务器失败 |
| POSTURE_USER_DEVICEID_EXCEEDS_80BYTES | 200411 | 用户设备唯一信息超过80字节 |
| COMPOSITION_NOT_INIT | 200500 | 作文批改没有初始化 |
| COMPOSITION_NOT_OFFLINE | 200501 | 请检查是否授权作文批改能力! |
| OCR_NO_PICTURE | 200601 | 没有获取到图片 |
| OCR_HAND_NO_INIT | 200800 | 手写OCR没有初始化 |
| OCR_HAND_NO_OFFLINE | 200801 | 请检查是否授权手写OCR能力! |
| WEBSOCKET_200 | 200 | websocket success |
| WEBSOCKET_210 | 210 | asr init success |
| WEBSOCKET_220 | 220 | |
| WEBSOCKET_230 | 230 | tts合成失败 |
| WEBSOCKET_240 | 240 | 未识别到文本 |
| WEBSOCKET_ASR_200 | 200 | asr识别完成结果! |
| WEBSOCKET_ASR_201 | 201 | asr识别中间结果返回! |
| WEBSOCKET_TIMEOUT | 4102 | 长时间未请求业务,关闭连接 |
| WEBSOCKET_SERVER_ERROR | -41 | websocket server error ! |
| WEBSOCKET_NO_NET | -42 | websocket error cause no net ! |
| WEBSOCKET_EXCEPTION | -43 | websocket error cause exception occurred ! |
| WEBSOCKET_CONNECT_ERROR | -44 | webSocket 连接失败 |
| WEBSOCKET_DISCONNECT_ERROR | -45 | webSocket 异常断开 |
| IOT_INIT_ERRCODE | 400001 | IOT初始化错误 |
| IOT_CONNECT_ERRCODE | 400002 | IOT MQTT连接错误 |
| IOT_CONNECT_EXCEPTION | 400003 | IOT MQTT连接异常 |
| IOT_SUBSCRIBE_EXCEPTION | 400004 | IOT MQTT订阅话题异常 |
| BIND_CODE_NULL | 400005 | Bind 获取绑定码为空 |
| IOT_CONNECTION_LOST | 400006 | IOT 与服务器失去连接 |
| CHAT_NO_SPEAK | 5002 | 未检测到声音 |
| USER_OPERATE_VALID_ASR_PAUSE_FINGER | 300000 | 用户操作非法, 必须在查词过程中使用 |
| FINGER_OCR_INIT_FAIL | 300001 | 离线手指模型未成功初始化 |
| FINGER_STRUCT_POINT_ERROR | 300002 | 主体坐标映射失败 |
| FINGER_NOT_IN_STRUCT | 300003 | 指尖不在主体内 |
6.5 鉴权相关code
| 常量名称 | code | 说明 |
|---|---|---|
| AUTH_ERROR_MAC | 20210001 | mac 获取失败 , 必须保证唯一,如果不唯一会导致功能无法使用 |
| AUTH_ERROR_CPUID | 20210002 | cpu id 获取失败 ,必须保证唯一,如果不唯一会导致功能无法使用 |
| AUTH_ERROR_FLASHID | 20210003 | flash id 获取失败,必须保证唯一,如果不唯一会导致功能无法使用 |
| AUTH_ERROR_SN | 20210004 | SN 获取失败 , 必须保证唯一,如果不唯一会导致功能无法使用 |
| AUTH_ERROR_NO_INFO | 40005 | 云端鉴权失败,apikey无授权信息 |
| AUTH_ERROR_CLOUD | 40008 | 云端鉴权失败,鉴权请求异常:解码失败等 |
| AUTH_ERROR_UNKNOWN | 20210012 | 云端鉴权失败,未知请求异常 |
| AUTH_ERROR_NO_FUNCTION | 20210005 | 云端鉴权失败,无开通功能 |
| AUTH_ERROR_LOCAL_DEVICEID | 20210006 | 本地获取缓存文件的deviceid异常,deviceid 不同 |
| AUTH_ERROR_LOCAL_FUNCTION | 20210007 | 本地获取缓存文件,鉴权异常无开通功能 |
| AUTH_ERROR_LOCAL_DECODE | 20210008 | 本地获取缓存文件解密失败 |
| AUTH_ERROR_FILE_NO | 20210009 | 获取deviceid是正常的,但是未发现本地的鉴权文件,需要重新鉴权 |
| AUTH_ERROR_EXPIRE | 20210010 | 鉴权文件过期 |
| AUTH_ERROR_NOT_INIT | 20210011 | 没有调用初始化接口 |
| AUTH_POST_ERROR_CURLINIT | 20210101 | http错误:curl init错误 |
| AUTH_POST_ERROR_CURLPERFORM | 20210102 | http错误:curl_easy_perform异常 |
| AUTH_FILE_ERROR_FOPEN | 20210201 | 打开文件失败 |
| AUTH_SKILL_ERROR | 20210301 | 没有权限 |
| PERMISSION_READ_PHONE_STATE | 20210401 | 没有READ_PHONE_STATE权限 |
七、常见问题
7.1 鉴权问题
1.设备鉴权失败,鉴权方式与机器人类型不匹配
①如果接入方式是“SDK接入”则使用不带SN的鉴权接口。
②如果接入方式是“混合SDK接入”则使用带SN的鉴权接口。
7.2 标定版绘本问题
1.封面识别失败
①图片角度,上传的图片需要旋转180°,可查看 com.turing.book.api.BookListener#onImageData 回调接口中图片的角度是否符合要求。
②图片镜像,查看是否需要做镜像处理。除了手机支架+反光镜的场景,其他的需要是非镜像的图片。具体说明,3.0查看sceneMode,2.0查看deviceType。
③turingCameraId是否使用标定的ID,如果没有标定,找项目负责人标定。
④查看是否配置绘本库,biz->机器人管理->机器人识别管理->配置->开打库权限。
2.内页识别失败
①检查封面是否识别成功。
3.tts权限异常
联系图灵项目负责人,开启tts权限。
6.3 标定版指尖查词问题
1.无法检测到手指或识别失败
①同绘本封面识别原因①②③
②检测CameraID标定,是否配置指尖查词摄像头参数,找图灵负责人。
③查看摄像头预览分辨率是否符合要求,需100万像素。
7.4 语音对话问题
1.提示“ASR权限异常”、“TTS授权异常”
联系图灵项目负责人,开启权限。
7.5 坐姿检测问题
1. 如何确定设置图片旋转角度后图片是人脸正向图片?
可以调用 TuringPosture().getInstance(context).debugSavaPreView() ,在相册中查看保存的预览图片。
2. 不想要显示预览界面,如何实现?
目前 SDK 使用 Camera2 开发,Camera2 要求预览界面必须可见,不能隐藏。
可按照下面方式实现:
① 预览界面viewgroup 宽高设置为1dp,必须要传入图片分辨率参数,否则sdk内部的默认值会影响结果。 分辨率取值范围:640×480 ~ 1280×720
7.6 口算批改问题
- 提示”请检查是否授权文档检测能力!“、”This api key do not have permission.Please contact the staff if need use“
联系图灵项目负责人,开启权限。
- 提示”鉴权失败“
测试阶段,请使用 com.turing.sample;正式阶段,需提前 1-2 天告知图灵项目负责人 APP 包名。
7.7 其他问题
1.获取Device ID异常!
①检测是否已鉴权成功,所有能力都需要鉴权成功之后才能使用。
八、Demo下载
1.下载地址
https://turing-appstore.oss-cn-beijing.aliyuncs.com/android/demo/TuringAISample.zip
2.使用方法
根据自身SDK的模块功能,修改gradle.properties文件,将需要的模块isExport参数设置为true,其他设置false,例如:SDK只有标定版绘本翻指读,设置如下
isExportFinger=false
isExportTextbook=true
isExportFINGERPro=false
isExportTextBookPro=false
isExportQuality=false
isExportStruct=false
isExportOCR=false
isExportBookScreen=false
isExportAsr=false
isExportTts=false
isExportChat=false
isExportOnlineDict=false
isExportSpeech=false
isExportDNTTS=false
isExportWakeUp=false
isExportAIGC=false