标定指尖OCR识别接入文档
文档状态
| 文件标识: | TuringOS-Finger-V1.0 |
|---|---|
| 系统版本: | SDK |
| 完成日期: | 2022年08月20日 |
文档修订记录
| 文档版本号 | 修订日期 | 修订原因 |
|---|---|---|
| V1.0.0 | 2022.8.20 | 创建文档 |
| V1.0.1 | 2022.9.29 | 查句:新增可设置纠错字段,返回置信度字段sentenceConfidence |
| v1.0.2 | 2022.10.25 | 查句:新增设置请求翻译字段,返回查句附加字段 |
| v1.0.3 | 2022.10.31 | 查句:新增请求tts字段 |
| V1.0.4 | 2022.11.1 | 查词:新增英文自然拼读naturalSpell 字段 |
| V1.0.5 | 2023.04.10 | 查词:输出结果新增拼音数据 |
概述
指尖OCR识别支持指尖定位、查词、查句、查拼音、查段功能
能力硬件要求
基于对摄像头拍摄清晰程度的要求,分类如下:
- 高端要求:查拼音、查句子、查段落:属于高端OCR 能力,一般需要客户产品的前摄像头具备800W及以上像素
- 中端要求:查词,一般需要客户产品的前摄像头具备500W及以上像素
- 低端要求:翻读、指读对客户产品的前摄要求较低。
| 能力名称 | 可支持摄像头 | 内存 | CPU | 分类 |
|---|---|---|---|---|
| 标定版指尖查词 | 500W | 2GB | -- | 标定版 |
| 标定版指尖查句 | 800W | 4GB | -- | 标定版 |
| 免标定指尖查词 | 500W | 4GB | -- | 免标定 |
| 免标定指尖查句 | 800W | 4GB | -- | 免标定 |
| 免标定指尖查拼音 | 800W | 4GB | -- | 免标定 |
| 免标定指尖查段 | 800W | 4GB | -- | 免标定 |
影响指尖准确率维度:图像清晰度和设备性能
- 图像清晰度: 指设备采集图片的清晰程度,影响因素有很多,例如:多少万像素,客户是否针对摄像头进行过调优等 图灵针对客户的图灵质量建立了标准并具体相应的工具,可以方便评估客户的设备是否支持查词,查句等。
- 设备性能: 设备性能主要用于评估设备是否满足免标定方案,相对于标定方案,免标定方案需要前端具体一定的算力来满足算法要求,目前根据手头设备的具体情况,也建立了基本的标准,但这一指标仅具有参考意义,因为最终的响应时间,还和客户采用的分辨率,系统的内存管理,图片渲染等多因素影响,但低于图灵标准,则不建议用免标定方案。
集成前提
进入摄像头参数设置页面,选取合适的分辨率。
● 确定摄像头ID:0=后置;1=前置。
● 获取相机参数:预览分辨率、拍照分辨率。
● 选择高的预览分辨率(例如 1920*1080),适中的拍照分辨率和预览分辨率接近的 (ps: 高拍照分辨率不一定图片高清,所以需要折中选择和预览分辨率接近的)。
● 生成图片并预览此配置下的图片清晰度。
● 多次预览确定最佳摄像头,参数配置写入 assets/turing_config.json 中。
集成步骤
1. 添加依赖库
//必须依赖库
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 'net.sourceforge.jexcelapi:jxl:2.6.12'
2. AndroidManifest配置
添加权限
<!--网络-->
<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" />
<!--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"
3. 代码混淆
代码混淆文件proguard-project.txt,添加如下内容
-keep class com.turing.**{ *;}
-dontwarn com.turing.**
-keep class com.tuling.**{ *;}
-dontwarn com.tuling.**
-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.**
4. SDK 初始化
使用指尖OCR识别功能前调用,请先调用SDK初始化代码。(SDK初始化详情见《接入指南说明文档》)
TuringInitializer.getInstance().initV3XXX()
5. 参数配置
需要在 turing_config.json 中添加 globalConfig.camer、finger 节点。finger 参数如下
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| previewWidth | int | Y | - | 预览宽度 |
| previewHeight | int | Y | - | 预览高度 |
| pictureWidth | int | Y | - | 拍照预览宽度 |
| pictureHeight | int | Y | - | 拍照预览高度 |
| imgQuality | int | N | 0-100 | 图片压缩率 越高图片越清晰 文件越大 传输耗时长 |
| showPoint | boolean | N | - | 是否显示指尖坐标点,默认false |
| horMirror | boolean | N | - | 左右镜像,默认false |
| verMirror | boolean | N | - | 上下镜像,默认false |
| pointColor | String | N | 颜色值 | 坐标点颜色,如"#FC0202" |
| pointWidth | int | N | - | 坐标点宽 |
| appMode | int | N | - | 0-查字/词(默认) 1-查句 |
| ocrMode | Integer | N | - | 0通用模式(默认) 1中文模式 2英文模式 3拼音模式 |
| selectType | String | N | - | charV-字优先 wordV-词优先 normalV-通用 |
| maxLen | int | N | - | 最大支持识别的词语字符长度,默认为4 |
| dictType | String | N | - | 词典库 |
| dicts | List |
N | - | 词典类型 |
| oxfordVersion | int | N | - | 牛津词典版本号 |
| openTts | boolean | N | - | 查句是否开启TTS |
| openTranslator | boolean | N | - | 查句是否开启翻译 |
示例如下
{
"authorization": {
"apikey": "您的apikey",
"secret": "您的secret"
},
"globalConfig": {
"brandModel":"您的品牌型号",
"camera": {
"cameraId": 1,
"cameraApi": 2,
"turingCameraId": 118,
"preMirror": false,
"mirror": true,
"zoom": 0,
"preRotation": -1,
"rotation": 180
}
},
"ability": {
"finger": {
"showPoint": true,
"horMirror": false,
"verMirror": false,
"pointColor": "#FC0202",
"pointWidth": 10,
"appMode": 0,
"maxLen": 4,
"selectType": "wordV",
"dictType": "tuling",
"ocrMode": 0,
"openTts": true,
},
}
}
修改参数值的几种方式:
方式一:在清单文件 turing_config.json 中赋值
方式二:修改全局变量值
调用 TuringConfig.getInstance(this).configData 动态设置入参,参数同 turing_config.json。(注:需要在 startFingerOcr() 前调用 )
val configData: ConfigData = TuringConfig.getInstance(this).configData
configData.ability.finger.selectType = "wordV"
configData.ability.finger.appMode = 0
configData.ability.finger.isShowPoint = true
configData.ability.finger.pictureWidth = 2560
configData.ability.finger.pictureHeight = 1920
configData.ability.finger.previewWidth = 640
configData.ability.finger.previewHeight = 480
configData.ability.finger.ocrMode = 0
方式三:动态调整
仅对本次识别生效,可设置参数有限,如下所示:
| 参数 | 类型 | 说明 | 备注 |
|---|---|---|---|
| FingerConfig.KEY_OCR_MODE | int | 识别模式 | 0- 通用(默认) 1-中文模式 2-英文模式 3-拼音模式 |
| FingerConfig.KEY_SELECT_TYPE | String | 优化查询 | charV-字优先 wordV-词优先 normalV-通用 |
| FingerConfig.KEY_ERR_CORRECTION | boolean | 教材纠错 | true-开启纠错 false-不开启 |
| FingerConfig.KEY_TRANSLATOR | boolean | 查句是否开启翻译 | true-开启 false-关闭 |
| FingerConfig.KEY_OPEN_TTS | boolean | 查句是否开启TTS | true-开启 false-关闭 |
| FingerConfig.KEY_MAX_LEN | int | 最大支持识别的词语字符长度 | |
| FingerConfig.KEY_DICT_TYPE | double | 查词裁图比例 | |
| FingerConfig.KEY_DICTS | int | 查词最小像素 | |
| FingerConfig.KEY_OXFORD_VERSION | int | 牛津词典版本号 |
(注:需要在 startFingerOcr() 后,才能调用postFingerConfig。)
示例代码:
config[FingerConfig.KEY_APP_MODE] = FingerConfig.VALUE_PRO_APP_MODE_WORD
config[FingerConfig.KEY_OCR_MODE] = 3
finger.postFingerConfig(config) // 在startFingerOcr()后调用
6. 开启功能集成
使用说明见下面【功能集成】描述。
实例化
var finger = TuringFinger.getInstance(this)
功能集成
1. 开启指尖查词OCR识别
此方法内部封装了相机,客户端不用关心相机开发。
调用方法前先设置参数,见【集成步骤】中【参数配置】,输入参数 appMode 值为0。
方法
void startFingerOcr(ViewGroup layout, boolean offlineFinger, FingerListener<Parameters> listener, boolean... isPicMode)
输入说明
| 参数 | 类型 | 说明 |
|---|---|---|
| layout | ViewGroup | 相机预览界面的布局,建议使用FrameLayout |
| offlineFinger | boolean | 是否使用离线模型。仅支持查词 |
| listener | FingerListener |
回调接口 |
| isPicMode | boolean | 是否使用拍照模式 true: 拍照 false: 预览(默认) |
- FingerListener说明
public interface FingerListener<Parameters> {
/**
* OCR识别结果
*
* @param result
*/
void onSuccess(Parameters result);
/**
* 返回原始图片
*
* @param image
*/
void onImageData(byte[] image);
/**
* 错误回调
*
* @param errorCode
* @param errMsg
*/
void onError(int errorCode, String errMsg);
/**
* 事件回调
*
* @param event
*/
void onEvent(MessageEvent event);
/**
* 手指坐标
*
* @param fingerPosX
* @param fingerPosY
*/
void onFinger(float fingerPosX, float fingerPosY);
}
- MessageEvent 说明
类具体包名:com.turing.book.eventbus.MessageEvent
- MessageEvent.CODE_START_ORC 开始识别,即检测到运动
- MessageEvent.CODE_RECOGNIZE_FINGER 识别手指
- MessageEvent.CODE_START_QUERY 开始查词查句
- MessageEvent.CODE_OCR_RESULT 识别结果(包含未识别到字符、识别到字符事件)
- MessageEvent.CODE_TIPS 提示信息
- MessageEvent.CAMERA_STATES_OPENING 时机:调用了开启相机方法
- MessageEvent.CAMERA_STATES_OPENED 时机:CameraDevice.StateCallback#onOpened
- MessageEvent.CAMERA_STATES_CLOSEING 时机:调用了关闭相机方法
- MessageEvent.CAMERA_STATES_DISCONNECTED 时机:CameraDevice.StateCallback#onDisconnected
- MessageEvent.CAMERA_STATES_CLOSED 时机:CameraDevice.StateCallback#onClosed
- MessageEvent.CAMERA_STATES_ERROR 时机:CameraDevice.StateCallback#onError
- MessageEvent.CODE_CV_MODEL 算法模型状态的回调事件
输出说明
返回结果
{
"ocrRes": {
"backupContent": [
"天",
"动"
],
"backupIndex": 1,
"useIndex": 0,
"content": [
"惊天动地"
],
"allChars": [{
"distance": -0.682,
"index": 0,
"text": "惊"
}, {
"distance": -0.455,
"index": 1,
"text": "天"
}, {
"distance": -0.273,
"index": 2,
"text": "动"
}, {
"distance": 0.0,
"index": 3,
"text": "地"
}]
},
"result": {
"dict": "cn_idiom",
"dictType": "tuling",
"info": {
"explanationAudio": "http://book-iot-cdn.turingos.cn/202111151702/9ff010d199ba02b0278187826a965d61/dictV2/a9571a885961c092db6b25ae47eae8de.mp3",
"pinyin": "jīng tiān dòng dì",
"examples": [
{
"en": "",
"cn": "很多件惊天动地的好事却都会给自己带来无边无际的烦恼。"
},
{
"en": "",
"cn": "狼牙山五壮士的英雄事迹惊天动地,气壮山河!"
},
{
"en": "",
"cn": "雷声轰鸣犹如擂鼓般一样惊天动地。"
}
],
"synonyms": [],
"antonyms": [],
"explanations": [
"使天地惊动。形容某个事件的声势或意义极大"
],
"copy": [
"http://book-iot-cdn.turingos.cn/202111151702/3dfd1420254590f11690ee3a0f208a79/svg/svgs/24778.svg",
"http://book-iot-cdn.turingos.cn/202111151702/504fd545bf6703192a0176582d2cc452/svg/svgs/22825.svg",
"http://book-iot-cdn.turingos.cn/202111151702/c3015024ed7bb640eae2803082f305e0/svg/svgs/21160.svg",
"http://book-iot-cdn.turingos.cn/202111151702/a2196966716bfebc8a28af7b6c2edbff/svg/svgs/22320.svg"
],
"wordAudio": "http://universe-file-limit.turingapi.com/202111151632/5ab96d5c1f0791caf2f9d97ff8495abd/dict/86d9bb6daf1d4ed59bad9ccbe9d15005.mp3",
"word": "惊天动地"
}
},
"content": "惊天动地"
}
Parameters 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| ocrRes | OcrRes | N | ocr识别结果 |
| operateState | int | Y | 操作符 |
| result | Result | N | 词典结果 |
| sentenceResult | array | N | 查句返回结果 |
OcrRes 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| content | array |
N | ocr结果:有序输出识别的文字或词语 (推荐使用) |
| useIndex | int | N | 推荐content中使用元素下标 (一般查字使用该内容) |
| backupContent | array |
N | ocr结果:有序输出识别的文字 (备份使用,如:推荐词语查询不到内容时) |
| backupIndex | int | N | 推荐backupContent中使用元素下标 |
| allChars | array |
N | 所有识别内容数组 (admin开关控制输出) |
| sentence | String | N | ocr识别句子结果 |
| sentenceConfidence | double | N | 置信度0-100 |
| extParams | ExtParams | N | 查句附加参数 |
OcrChar 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| distance | float | N | 距离 |
| index | int | N | 索引 |
| text | String | N | 文本 |
| confidence | double | N | 置信度 |
Result 字段
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
| dict | String | Y | 词典类型:汉字(cn_char),成语(cn_idiom),汉词(cn_word),单词(en_word),拼音(cn_pinyin),无词典类型(others) |
| dictType | String | Y | 词典:图灵(tuling),图灵自研(turingown),图灵拼音(Turingkid),牛津(niujin) |
| info | Object | Y | 词典返回内容,需客户端解析 |
| naturalSpell | NaturalSpell | N | 自然拼读(admin开关控制输出) |
naturalSpell字段
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
| phoneticSymbol | String | N | 单词音标 |
| audio | String | N | 单词音频 |
| phoneticLetters | List |
N | 单词拆分详情 |
| word | String | N | 单词 |
phoneticLetters
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
| phoneticSymbol | String | N | 字母音标 |
| letter | String | N | 单词拆分后的字母 |
| phoneticSymbolAudio | String | N | 音标音频 |
dics 字段说明
可指定词典类型为以下几种:
| 类型 | 参数 | 说明 |
|---|---|---|
| 汉字 | cn_char | 汉字(单字) |
| 成语 | cn_idiom | 汉语成语 |
| 词语 | cn_word | 汉语词语 |
| 拼音 | cn_pinyin | 拼音 |
| 单词 | en_word | 英语词(包括单词、词组、缩写等) |
若不指定词典类型,则按默认优先级顺序查词,默认顺序为 汉字、成语、古诗词、词语、单词、人名、英语词组
1. 汉字
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| word | String | 是 | 汉字 | ---- |
| wordAudio | String | 是 | 汉字音频 | 125(tts内容,下同) |
| radicals | String | 是 | 偏旁(部首) | 8 |
| structure | String | 是 | 结构 | 16 |
| polyphone | List | 否 | 多音字 | ---- |
| copy | List | 否 | 描红 | ---- |
| explanationAudio | String | 否 | TTS语音播报 | 125 |
polyphone
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| pinyin | String | 是 | 拼音 | 32 |
| combineWords | List | 是 | 组词 | 21845 |
| explanation | List | 是 | 释义 | 21845 |
| spellSign | boolean | 否 | 拼音拼读标识 | --- |
2. 成语
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| word | String | 是 | 成语 | ---- |
| wordAudio | String | 是 | 成语音频 | 125 |
| pinyin | String | 是 | 拼音 | 255 |
| explanation | String | 是 | 释义 | 21845 |
| copy | List | 否 | 描红 | ---- |
| examples | String | 否 | 双语例句 | ---- |
| synonyms | String | 否 | 近义词 | 21845 |
| antonyms | String | 否 | 反义词 | 21845 |
| explanationAudio | String | 否 | TTS语音播报 | 125 |
examples
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| en | String | 否 | 英文 | ---- |
| cn | String | 否 | 中文 | ---- |
3. 词语
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| word | String | 是 | 汉字 | ---- |
| wordAudio | String | 是 | 词语音频 | 125 |
| polyphone | List | 否 | 多音字 | |
| copy | List | 否 | 描红 | ---- |
| explanationAudio | String | 否 | TTS语音播报 | 125 |
polyphone
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| pinyin | String | 是 | 拼音 | 255 |
| examples | String | 否 | 双语例句 | ---- |
| explanation | List | 否 | 释义 | 21845 |
| synonyms | String | 否 | 近义词 | 21845 |
| antonyms | String | 否 | 反义词 | 21845 |
examples
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| en | String | 否 | 英文 | ---- |
| cn | String | 否 | 中文 | ---- |
4. 单词
info
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| word | String | 是 | 单词 | ---- |
| wordAudio | String | 是 | 单词音频 | 128 |
| explanations | List | 是 | 词义 | ---- |
| phoneticEn | String | 是 | 英音标 | 64 |
| phoneticUs | String | 是 | 美音标 | 64 |
| examples | Object | 否 | 双语例句 | |
| thirdSingular | String | 否 | 单数 | ---- |
| nounPlurals | String | 否 | 复数 | ---- |
| pastParticiple | String | 否 | 过去分词 | ---- |
| presentParticiple | String | 否 | 现在分词 | ---- |
| explanationAudio | String | 否 | TTS语音播报 | 125 |
| explanationAudio | String | 否 | TTS语音播报 | 125 |
examples
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| en | String | 否 | 英文 | 21845 |
| cn | String | 否 | 中文 | 21845 |
explanations
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| pos | String | 是 | 单词属性 | ---- |
| meaning | String | 是 | 单词属性中文翻译 | 21845 |
5. 无词典类型(others)
| 参数 | 类型 | 是否必须 | 描述 | 最长限制 |
|---|---|---|---|---|
| word | String | 是 | 待查词内容 | ---- |
| translation | String | 是 | 汉译英 | 150(翻译内容) |
| translationAudio | String | 是 | 翻译音频 | 125 |
6. 拼音(cn_pinyin)
声母
{
"audioUrl": "https://source1.qiaoxuesi.com/source/audio/219unmq8bh7/1669191192091_normed00.mp3",
"imgUrl": "https://source1.qiaoxuesi.com/source/img/1663060805006.png",
"spelling": "m",
"spellingGif": "https://source1.qiaoxuesi.com/xuepinyin/gif/12t7akpfisu1662109726190.gif",
"titleAudioUrl": "https://source1.qiaoxuesi.com/source/audio/bc8dac3cvv/1668678699003_normed00.mp3",
"typeExt": 1,
"videoUrl": "https://source1.qiaoxuesi.com/source/video/u1q1o7a2rt/1660918424457_320_170.mp4"
}
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| spelling | String | 是 | 文本 |
| titleAudioUrl | String | 是 | 音频 |
| spellingGif | String | 是 | 拼音gif |
| imgUrl | String | 是 | 象形图片 |
| audioUrl | String | 是 | 顺口溜音频 |
| videoUrl | String | 是 | 拼音学习视频 |
| typeExt | int | 是 | 拼音词典查询类别扩展字段 0:韵母;1.声母;3:拼读;4:整体认读 |
韵母
{
"audioUrl": "https://source1.qiaoxuesi.com/xuepinyin/audio/137dlzvy2xj1652695957079_normed00.mp3",
"imgUrl": "https://source1.qiaoxuesi.com/source/img/1663060819091.png",
"spelling": "ɑi",
"spellingGif": "https://source1.qiaoxuesi.com/xuepinyin/gif/1layjq4ney1662109709706.gif",
"titleAudioUrl": "https://source1.qiaoxuesi.com/xuepinyin/audio/v4psa1uugf/1663758139055_normed00.mp3",
"toneOrder": "a",
"tones": [{
"ci": "开心",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-e9e1a24dbd934da5988b6dde5f48be3b_normed00.mp3",
"pin": "k-ɑi",
"pinAudioUrl": "https://source1.qiaoxuesi.com/source/audio/295f7c7ebkl_1653477636373_normed00.mp3",
"tone": "āi",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/uu2xtp4uto/1662355157516_normed00.mp3",
"zi": "开",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/295f7c7ebkl_1653477636373_normed00.mp3"
}, {
"ci": "白天",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-24cf6d90de594adb9efd67935d8e1765_normed00.mp3",
"pin": "b-ɑi",
"pinAudioUrl": "https://source1.qiaoxuesi.com/source/audio/289ipwqxe8h_1653477298257_normed00.mp3",
"tone": "ái",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/2o47sxl2b9c/1651809615488_normed00.mp3",
"zi": "白",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/289ipwqxe8h_1653477298257_normed00.mp3"
}, {
"ci": "改正",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-c2987747a8d247c4951e155714d0dacc_normed00.mp3",
"pin": "g-ɑi",
"pinAudioUrl": "https://source1.qiaoxuesi.com/source/audio/1fwn86ag818_1653477510828_normed00.mp3",
"tone": "ǎi",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/1oufr3jcjt/1651809633609_normed00.mp3",
"zi": "改",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/1fwn86ag818_1653477510828_normed00.mp3"
}, {
"ci": "太阳",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-097b7e0655fc4a56b995f521f58dcbc1_normed00.mp3",
"pin": "t-ɑi",
"pinAudioUrl": "https://source1.qiaoxuesi.com/source/audio/sxz38nwx0_1653478156900_normed00.mp3",
"tone": "ài",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/6pmiiu6q4w/1651820482512_normed00.m4a",
"zi": "太",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/sxz38nwx0_1653478156900_normed00.mp3"
}],
"typeExt": 0,
"videoUrl": "https://source1.qiaoxuesi.com/source/video/1vuw1z4a70a/1662347551226_320_170.mp4"
}
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| spelling | String | 是 | 文本 |
| titleAudioUrl | String | 是 | 音频 |
| spellingGif | String | 是 | 拼音gif |
| imgUrl | String | 是 | 象形图片 |
| audioUrl | String | 是 | 顺口溜音频 |
| videoUrl | String | 是 | 拼音学习视频 |
| toneOrder | String | 是 | 音序 |
| typeExt | int | 是 | 拼音词典查询类别扩展字段 0:韵母;1.声母;3:拼读;4:整体认读 |
| tones | object | 否 | 四声调文本 |
tones字段说明
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| tone | String | 是 | 四声调文本 |
| toneAudioUrl | String | 是 | 四声调音频 |
| pin | String | 否 | 拼读 |
| pinAudioUrl | String | 否 | 拼读音频 |
| ci | String | 是 | 声调范字 |
| ciAudioUrl | String | 是 | 声调范字音频 |
| zi | String | 是 | 声调范词 |
| ziAudioUrl | String | 是 | 声调范词音频 |
整体认读
{
"audioUrl": "https://source1.qiaoxuesi.com/xuepinyin/audio/dpaxi5xlni/1663758190814_normed00.mp3",
"imgUrl": "https://source1.qiaoxuesi.com/source/img/1663060965077.png",
"spelling": "zhi",
"spellingGif": "https://source1.qiaoxuesi.com/xuepinyin/gif/khvydd7x7z1662109746415.gif",
"titleAudioUrl": "https://source1.qiaoxuesi.com/xuepinyin/audio/dpaxi5xlni/1663758190814_normed00.mp3",
"toneOrder": "z",
"tones": [{
"ci": "知识",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-06e416086e8a42a3a90f1a19f3fcdf3d_normed00.mp3",
"tone": "zhī",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/hxpzagzwph/1651815004245_normed00.mp3",
"zi": "知",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/15nzurq9xq0_1653477210360_normed00.mp3"
}, {
"ci": "直线",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-0da199f31eab4f25b622efb65d5797f6_normed00.mp3",
"tone": "zhí",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/1t76gukoddn/1651815015867_normed00.mp3",
"zi": "直",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/1v9maa47tgh_1653477129441_normed00.mp3"
}, {
"ci": "纸张",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-f9e9ca28072b40d89c4494c9485c3dd3_normed00.mp3",
"tone": "zhǐ",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/g5x0fkh4vq/1651815031542_normed00.mp3",
"zi": "纸",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/16ct4bqvrco_1653477130808_normed00.mp3"
}, {
"ci": "治理",
"ciAudioUrl": "https://source1.qiaoxuesi.com/tts/tts-f74098a8cecd4f4c99d12c261b940e92-2d2d232ec42e4baab3a989eb42588c74_normed00.mp3",
"tone": "zhì",
"toneAudioUrl": "https://source1.qiaoxuesi.com/source/audio/2l2bwwg9a64/1651815041979_normed00.mp3",
"zi": "治",
"ziAudioUrl": "https://source1.qiaoxuesi.com/source/audio/2ev0jnrxwfx_1653477132669_normed00.mp3"
}],
"typeExt": 4,
"videoUrl": "https://source1.qiaoxuesi.com/source/video/1hhd2li45sz/1660959767651_320_170.mp4"
}
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| spelling | String | 是 | 文本 |
| titleAudioUrl | String | 是 | 音频 |
| spellingGif | String | 是 | 拼音gif |
| imgUrl | String | 是 | 象形图片 |
| audioUrl | String | 是 | 顺口溜音频 |
| videoUrl | String | 是 | 拼音学习视频 |
| toneOrder | String | 是 | 音序 |
| typeExt | int | 是 | 拼音词典查询类别扩展字段 0:韵母;1.声母;3:拼读;4:整体认读 |
| tones | object | 否 | 四声调文本 |
tones字段说明
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| tone | String | 是 | 四声调文本 |
| toneAudioUrl | String | 是 | 四声调音频 |
| pin | String | 否 | 拼读 |
| pinAudioUrl | String | 否 | 拼读音频 |
| ci | String | 是 | 声调范字 |
| ciAudioUrl | String | 是 | 声调范字音频 |
| zi | String | 是 | 声调范词 |
| ziAudioUrl | String | 是 | 声调范词音频 |
拼读
{
"allSpellings": ["xiāo", "xiáo", "xiǎo", "xiào"],
"audioUrl": "https://source1.qiaoxuesi.com/source/audio/64cvnxyyhx_1653477642277_normed00.mp3",
"spelling": "xiǎo",
"spellingType": "三拼音节",
"spellings": [{
"name": "x",
"type": "声母"
}, {
"name": "i",
"type": "韵母"
}, {
"name": "ɑo",
"type": "韵母"
}],
"toneNum": 3,
"toneOrder": "x",
"typeExt": 3,
"words": [{
"content": "筱"
}],
"phrases": [{
"content": "渺小"
}]
}
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| spelling | String | 是 | 文本 |
| spellingType | String | 是 | 拼读类别(整体认读⾳节/两拼⾳节/三拼⾳节) |
| audioUrl | String | 是 | 拼读音频 |
| toneOrder | String | 是 | 音序 |
| toneNum | int | 是 | 声调(0 代表轻声) |
| typeExt | int | 是 | 拼音词典查询类别扩展字段 0:韵母;1.声母;3:拼读;4:整体认读 |
| spellings | array | 是 | 拼读内容 |
| allSpellings | array | 是 | 四声调文本 |
| words | array | 是 | 范字 |
| phrases | array | 是 | 范词 |
spellings字段说明
| 参数 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| name | String | 是 | 内容 |
| type | String | 是 | 类型 |
请求示例
turing.startFingerOcr(frame_layer, useOfflineFinger, ocrListener, isPicMode)
2. 开启指尖查句OCR识别
调用方法、输入参数同【1. 开启指尖查词OCR识别】,区别在于 输入参数 appMode 值为1。
输出说明
返回结果
{
"code": 200,
"done": true,
"globalId": "182967974971176001",
"message": "success",
"nlpResponse": {
"intent": {
"code": 50101
},
"results": [
{
"groupType": 0,
"resultType": "text",
"values": {
"text": "任务意识,提升专注:!",
"ttsUrl": [
"http://turing-iot-tts-oss.turingapi.com/tts/tts-9d721700890f4bcf874cb1b5404c02ff-fd182c666c43445cb0ac1f29fb0576d9.mp3"
]
}
}
]
}
}
Parameters-sentenceResult 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| groupType | int | N | |
| resultType | String | N | |
| values | array | N | 分词结果 |
values 字段说明
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| text | int | N | 文本 |
| ttsUrl | array |
N | 音频 |
OcrRes-ExtParams 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| translate | String | N | 翻译结果 (admin+input开关使用) |
| translateTextType | int | N | 请求翻译,文本语言类型 1:中文;2:英文(admin+input开关使用) |
| multiSegments | array |
N | 分词结果 |
MultiSegment 字段
| 参数 | 类型 | 是否必返 | 说明 |
|---|---|---|---|
| nature | String | N | 词性 |
| word | String | N | 词 |
| dataType | int | N | 词的来源 0:未知-默认值 1:中文自定义词典 2:英文自定义词典 -1:不在中文和英文的自定义词典 |
| subTerms | array |
N | 下一层的细粒度分词 |
3. 语音唤醒指尖OCR识别
分为两种方式:纯语音唤醒 和 识别过程中开启唤醒。
3.1 纯语音唤醒场景
通过 ASR 语音唤醒指尖 OCR 功能。例如:调用 startAsrOcr() 后,语音说“这个词怎么读”触发指尖OCR技能。
方法
void startAsrOcr(ViewGroup layout, boolean offlineFinger, FingerListener<Parameters> listener, boolean... isPicMode);
输入参数、输出参数同 startFingerOcr() 方法。
3.2 识别过程中开启唤醒场景
指尖OCR识别过程中开启 ASR 查词,必须在 startFingerOcr() 后调用。
方法
void startAsrAfterPauseFingerOcr(FingerListener<Parameters> listener);
输入参数、输出参数同 startAsrOcr() 方法。
3.3 主动停止录音
调用startAsrOcr()、startAsrAfterPauseFingerOcr() 后,可以停止录音。
方法
void stopAsr();
3.4 是否支持离线VAD
检测是否支持离线VAD,若不支持则使用在线VAD。
方法
boolean isSupportOfflineVAD();
4. 手指检测方式
4.1 改变手指检测方式
使用离线或在线识别手指。适用于查词,查句仅支持在线。
方法
void changeFingerDetectWay(boolean isOffline, FingerListener<Parameters> listener);
输入说明
| 参数 | 类型 | 说明 |
|---|---|---|
| isOffline | boolean | true-离线指尖识别 false-在线指尖识别 |
| listener | FingerListener |
回调接口 |
输出说明
同 startXXXOcr() 方法。
4.2 是否支持离线手指检测
方法
boolean isSupportOfflineFingerDetect();
输出说明
true-支持离线检测,false-不支持离线检测。
5. 动态调整参数值
5.1 postFingerConfig
动态设置参数,在 startXXXOcr() 之后设置。可调整参数字段,见【集成步骤】->【5.参数配置】。
方法
void postFingerConfig(HashMap<String, Object> config);
请求示例
//
val config = HashMap<String,Any>()
config[FingerConfig.KEY_DICT_TYPE] = "niujin"
config[FingerConfig.KEY_OXFORD_VERSION] = 4
config[FingerConfig.KEY_OPEN_TTS] = isChecked // 控制是否开启tts
fingerPro.postFingerConfig(config) // 在startXXXOcr()后调用
5.2 postFingerParams()
动态设置参数,在 startXXXOcr() 之后设置。与postFingerConfig作用一致,简化调用方式,两个方法二选一。
方法
void postFingerParams(FingerParamListener listener);
请求示例
turing.postFingerParams { builder ->
// 控制是否开启tts
builder!!.setOpenTts(isChecked)!!.build()
// 控制是否开启翻译
builder!!.setOpenTranslator(isChecked)!!.build()
}
6. 停止/启动识别
调用 pause() 只会停止识别,预览画面会实时显示。 调用resume() 恢复识别。
方法
/**
* 暂停识别
*/
void pause();
/**
* 重新开始识别
*/
void resume();
7. 停止预览/ 重新开始预览
此方法影响预览画面,调用了stopPreView() 后画面不会实时刷新。若想恢复请调用 resumePreview()。
方法
/**
* 暂停预览
*/
void stopPreview();
/**
* 重新开始预览
*/
void resumePreview();
8. 开启指尖定位识别
只进行指尖定位识别,不识别指尖区域的文本。
方法
-
先初始化
java /** * 初始化离线手指模型,单独识别指尖时需要调用 * 与fingerDetect配合使用 * * @param previewSizeWidth 保留字段,暂无作用 * @param previewSizeHeight 保留字段,暂无作用 * @param listener * @return */ void initHandDetect(int previewSizeWidth, int previewSizeHeight, FingerListener listener); -
再传输图片进行识别
java /** * 离线手指模型 检测手指 并保存到本地路径 * * @param srcData 图片宽高与标定CameraId的原始分辨率一致 * @param format 仅支持ImageFormat.NV21、 ImageFormat.YUV_420_888 * @return */ void handDetect(byte[] srcData, int format);
请求示例
需要保证设备已标定,客户端自定义相机的预览图分辨率要和标定CameraId的原始分辨率保持一致。
-
先初始化
```kotlin private fun initTuringFinger() { TuringFinger.getInstance(this) .initHandDetect(1920, 1080, object : FingerListener
{ override fun onSuccess(result: Parameters?) { } override fun onImageData(image: ByteArray?) { } override fun onError(errorCode: Int, errMsg: String?) { Log.d(TAG, "onError() called with: errorCode = $errorCode, errMsg = $errMsg") } override fun onEvent(event: MessageEvent?) { } override fun onFinger(fingerPosX: Float, fingerPosY: Float) { Log.d( TAG, "onFinger() called with: fingerPosX = $fingerPosX, fingerPosY = $fingerPosY" ) // (fingerPosX,fingerPosY) 是原始大图的坐标 runOnUiThread { cameraView?.let { // 绘制小红点 it.showRedPoint(fingerPosX, fingerPosY, 10, "#FC0202") } } } }) }```
-
再传输图片开启识别指尖位置
```kotlin // 客户端自定义相机开发,相机预览图分辨率与标定CameraId的原始分辨率一致。 // SDK不包含CameraView,下面是给出调用方法示例
private fun initCamera() { mainView?.let { val width = it.width val height = it.height cameraView = CameraView( this, width, height, it, 前置id, "16:9", 预览图宽, 预览图高, 拍照图宽, 拍照图高, 0, true, -1 ) cameraView!!.setOnFrameListener(object : OnFrameListener { override fun onError(error: String) {} override fun onFrameData(videodata: ByteArray, length: Int) { // 这里是预览图数据 if (videodata != null && videodata.isNotEmpty()) {
// handDetect() 请求识别手指坐标 TuringFinger.getInstance(this@FingerPositionActivity) .handDetect(videodata, ImageFormat.NV21) } } override fun onPicture(data: ByteArray, length: Int) {} }) } }```
-
停止指尖识别
不调用 TuringFinger#handDetect() 就能停止指尖识别。
9. 资源释放
不使用时及时调用方法释放资源。
方法
void releaseFinger();