更新记录

2.0.3(2026-10-14)

  • 新增 Android UTS API 插件,支持在 uni-app 项目中通过 import 调用。
  • 支持 PP-OCRv4、ML Kit 和 auto 双引擎自动复核。
  • 新增 getEngineInfo、initEngine、identify、release API。
  • 支持本地图片、网络图片、相册图片识别和进度回调。
  • 更新示例工程、使用说明和效果截图。

平台兼容性

离线 OCR 文字识别 UTS 版

ysh-ocr-uts 是 Android 离线 OCR UTS API 插件,支持中文、英文、数字和常用符号识别,内置 PP-OCRv4、Google ML Kit 双引擎,并支持 Auto 模式自动复核。

平台与兼容性

项目 值
类型 uni-app UTS API 插件
平台 Android
minSdkVersion 21
Android 最低版本 Android 5.0
ABI armeabi-v7a、arm64-v8a、x86
HBuilderX 最低版本 ^3.91.0
uni-app 支持 uni-app,暂不支持 uni-app x
iOS / HarmonyOS 暂不支持
离线能力 OCR 引擎和模型离线运行;网络图片识别需要应用联网

依赖:

com.microsoft.onnxruntime:onnxruntime-android:1.17.1
com.google.mlkit:text-recognition:16.0.0
com.google.mlkit:text-recognition-chinese:16.0.0

集成方式

  1. 从插件市场安装本插件,或将 uni_modules/ysh-ocr-uts 放入 uni-app 项目。
  2. 如使用网络图片,请在 manifest.json 中声明 android.permission.INTERNET。
  3. 修改 UTS、AAR 或依赖后,请重新制作包含 UTS 插件的自定义调试基座,或重新云打包。
  4. 页面中直接 import:
import { getEngineInfo, initEngine, identify, release } from '@/uni_modules/ysh-ocr-uts';

三种识别模式

1. auto:自动复核模式(推荐)

auto 是默认模式。插件先使用 PP-OCRv4 识别,并根据结果质量分判断是否足够可靠;当 PP-OCRv4 质量不足时,会调用 ML Kit 进行复核和结果比较,最终返回质量更优的文本。

适合场景:

  • 普通中文、英文、数字、日期、短文本识别。
  • 开发者不想手动选择引擎。
  • 对稳定性要求高于极致速度的场景。

特点:

  • 中文短文本表现较好。
  • 对低质量、小字、符号结果会尝试 ML Kit 复核。
  • 速度比单引擎慢,因为可能触发第二次 ML Kit 推理。

2. paddle / pp-ocrv4:PP-OCRv4 单引擎模式

直接调用 PP-OCRv4 OCR 引擎,不进入 ML Kit 复核流程。

适合场景:

  • 中文、数字、常见标点识别。
  • 图片较清晰、文字较大。
  • 不需要双引擎复核,追求可预测耗时。

特点:

  • 中文短文本识别效果较好。
  • 对部分英文空格、标点、复杂密集文段仍可能误识别。
  • 速度通常优于 auto,因为不会自动触发 ML Kit 第二次识别。

3. mlkit:Google ML Kit 单引擎模式

直接调用 Google ML Kit 文本识别能力,当前使用 text-recognition-chinese 中文识别模型。

适合场景:

  • 英文、数字、常见符号。
  • 不希望使用 PP-OCRv4 的机型或场景。
  • 作为 auto 复核链路的单独测试模式。

特点:

  • 英文、数字和常见符号较稳定。
  • 中文标点、密集小字、特殊符号容易漏识别或替换。
  • 部分样本速度优于 PP-OCRv4,但耗时受机型影响较大。

技术实现

插件识别链路如下:

UTS API -> Android AAR -> ImageLoader -> AutoOcrEngine -> PP-OCRv4 / ML Kit -> 质量评分 -> 返回文本

主要技术:

模块 技术
UTS 接口层 getEngineInfo、initEngine、identify、release,使用 UTS Android 调度器异步执行
OCR 主引擎 PP-OCRv4 文字检测 + PP-OCRv4 文字识别
推理运行时 ONNX Runtime Android 1.17.1
备用复核引擎 Google ML Kit Text Recognition Chinese 16.0.0
自动模式 PP-OCRv4 先识别,低质量时 ML Kit 复核,并按质量分选择结果
质量评分 根据识别区域、检测分数、文本长度、中英标点、疑似乱码等规则计算 qualityScore
图片来源 本地文件路径、应用沙箱路径、网络 URL
图片处理 ImageLoader 加载 Bitmap、recycle 释放、异常回调
进度回调 queued、engine、image、recognize、result、done、error 等阶段

API

getEngineInfo(): EngineInfo

同步返回插件版本、默认引擎、支持引擎列表等信息。

const info = getEngineInfo();
console.log(info.version, info.defaultEngine, info.engines);

initEngine(options)

初始化或切换 OCR 引擎。

initEngine({
  engine: 'auto',
  success(res) {
    console.log(res.engine, res.version);
  },
  fail(err) {
    console.error(err);
  }
});

engine 可选值:

值 说明
auto 默认,PP-OCRv4 优先,低质量时 ML Kit 复核
paddle / pp-ocrv4 PP-OCRv4 引擎
mlkit Google ML Kit 中文识别引擎

identify(options)

识别本地图片或网络图片。

identify({
  url: 'https://example.com/demo.png',
  engine: 'auto',
  speed: 'balanced',
  fallback: true,
  progress(res) {
    console.log(res.stage, res.percent, res.message);
  },
  success(res) {
    console.log(res.text, res.processTime, res.selectedEngine, res.qualityScore);
  },
  fail(err) {
    console.error(err);
  }
});

参数:

参数 类型 必填 说明
path string 否 Android 可读取的图片文件路径,与 url 二选一
url string 否 网络图片地址,与 path 二选一
engine string 否 auto、paddle、mlkit,默认 auto
speed string 否 fast、balanced、accurate,默认 balanced
fallback boolean 否 Auto 模式是否允许双引擎复核,默认 true
progress function 否 进度回调
success function 否 成功回调
fail function 否 失败回调

返回字段:

type IdentifyResult = {
  text: string,
  processTime: number,
  imageWidth: number,
  imageHeight: number,
  engine: string,
  selectedEngine: string,
  confidence: number,
  qualityScore: number,
  comparisonInfo: string
}

release()

释放 OCR 引擎资源。建议在页面 onUnload 中调用。

onUnload() {
  release();
}

快速示例

完整示例以 pages/native-plugin/ocr-test-uts.vue 为基础,包含批量测试、本地图片、网络图片、相册和识别日志。

<template>
  <view>
    <button :disabled="loading" @click="run">识别网络图片</button>
    <text v-if="loading">识别中 {{ progress }}%</text>
    <text v-else>{{ text }}</text>
    <text v-if="selectedEngine">实际引擎:{{ selectedEngine }}</text>
    <text v-if="qualityScore">质量分:{{ qualityScore }}</text>
  </view>
</template>

<script>
import { initEngine, identify, release } from '@/uni_modules/ysh-ocr-uts';

export default {
  data() {
    return {
      loading: false,
      progress: 0,
      text: '',
      selectedEngine: '',
      qualityScore: ''
    };
  },
  onUnload() {
    release();
  },
  methods: {
    run() {
      this.loading = true;
      initEngine({
        engine: 'auto',
        success: () => {
          identify({
            url: 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png',
            engine: 'auto',
            speed: 'balanced',
            progress: (p) => {
              this.progress = p.percent || 0;
            },
            success: (res) => {
              this.loading = false;
              this.text = res.text || '';
              this.selectedEngine = res.selectedEngine || '';
              this.qualityScore = res.qualityScore || '';
            },
            fail: (err) => {
              this.loading = false;
              console.error(err);
            }
          });
        },
        fail: (err) => {
          this.loading = false;
          console.error(err);
        }
      });
    }
  }
};
</script>

识别率与实测数据

1. 测试口径

本次测试使用项目内置 60 张本地图片,覆盖:

  • 中文短句、中文产品名、中文段落。
  • 英文单词、英文句子、英文邮箱、URL。
  • 日期、时间、手机号、身份证、订单号、价格、比例、重量。
  • 符号、大小写、字体颜色、手写风格。
  • 密集文段和多行长文本。

测试判定规则:

  • 短文本样本:按识别文本与期望文本的相似度判定。
  • 长文段样本:按关键片段命中率判定。
  • 只有达到业务阈值才计为通过,因此该通过率不是“字符级 OCR 准确率”,而是“业务样本通过率”。

2. 最近一次实测结果

测试模式:engine=auto,speed=balanced。

指标 结果
样本数 60
通过 53
失败 7
业务通过率 88.33%
平均识别率/匹配度 88.37%
平均单张耗时 534ms
最近一次总耗时 50684ms
FATAL EXCEPTION 0

补充性能参考:

引擎日志 平均单次耗时
PP-OCRv4 total 540ms
ML Kit OCR completed 681ms

3. 分类表现

类型 表现 说明
中文短文本 较好 如“这是一个测试句子”“你好世界”“智能手机显示器”等多数通过
英文短文本 较好 如 Hello、Practice makes perfect、www.example.com
数字与日期 较好 日期、时间、手机号、身份证、金额等多数通过
常用符号 一般 @#$%&* 可识别,复杂符号组合易错
中英标点混排 一般 中英文逗号、冒号、感叹号容易混淆
密集文段 一般 单行清晰文段表现较好,多行长文本容易漏行/串字
小字/低质量图片 不稳定 需要更高分辨率或预处理

4. 失败样本说明

本次失败的 7 个样本:

样本 主要问题
paragraph_04.png 多行混合内容,片段命中率 40.51%
paragraph_06.png 密集中文段落,片段命中率 12.06%
paragraph_07.png 复杂版面,片段命中率 3.79%
paragraph_08.png 小字和密集医疗字段,片段命中率 5.43%
price.png 价格符号/冒号附近误识别,相似度 75%
punctuation.png 中英文标点混淆,相似度 66.67%
symbol2.png 符号组合误识别,相似度 57.14%

隐私与权限

插件本身不主动采集或上传识别文本。

权限 使用场景
android.permission.INTERNET 使用 identify({url}) 下载网络图片
android.permission.READ_EXTERNAL_STORAGE 读取用户选择的本地图片
android.permission.CAMERA 调用拍照能力获取图片

注意事项

  • iOS 和 HarmonyOS 暂不提供原生实现。
  • 修改 UTS 原生代码、AAR 或远程依赖后,必须重新制作自定义调试基座。
  • 图片路径必须是 Android 可读取路径;Android 10+ 分区存储下建议先复制到应用私有目录。
  • 识别率与图片分辨率、字体、拍摄角度、背景、压缩噪声、机型性能强相关,复杂场景请结合 qualityScore 和业务规则做二次校验。
  • 本插件不承诺完全替代商业 OCR 服务。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.INTERNET:用于识别网络图片 URL。 android.permission.READ_EXTERNAL_STORAGE:用于读取开发者或用户选择的本地图片。 android.permission.CAMERA:用于拍照识别场景;如果宿主 App 未开启 camera 模块,则不触发该权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据,不上传识别文本,不主动访问第三方统计服务。 本地图片 OCR 在设备端完成;网络图片识别仅根据开发者传入的 URL 下载图片,下载目标由开发者自行决定。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无