跳转至

标定指尖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 listener 回调接口
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 listener 回调接口
输出说明

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. 开启指尖定位识别

只进行指尖定位识别,不识别指尖区域的文本。

方法

  1. 先初始化

    java /** * 初始化离线手指模型,单独识别指尖时需要调用 * 与fingerDetect配合使用 * * @param previewSizeWidth 保留字段,暂无作用 * @param previewSizeHeight 保留字段,暂无作用 * @param listener * @return */ void initHandDetect(int previewSizeWidth, int previewSizeHeight, FingerListener listener);

  2. 再传输图片进行识别

    java /** * 离线手指模型 检测手指 并保存到本地路径 * * @param srcData 图片宽高与标定CameraId的原始分辨率一致 * @param format 仅支持ImageFormat.NV21、 ImageFormat.YUV_420_888 * @return */ void handDetect(byte[] srcData, int format);

请求示例

需要保证设备已标定,客户端自定义相机的预览图分辨率要和标定CameraId的原始分辨率保持一致。

  1. 先初始化

    ```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")
                        }
                    }
                }
            })
    }
    

    ```

  2. 再传输图片开启识别指尖位置

    ```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) {}
            })
        }
    }
    

    ```

  3. 停止指尖识别

不调用 TuringFinger#handDetect() 就能停止指尖识别。

9. 资源释放

不使用时及时调用方法释放资源。

方法

void releaseFinger();