Autox.js PaddleOCR v4 让脚本看懂屏幕上的文字
让脚本不仅能"点",还能"读"
上两组学了:
- 选择器 API → "哪个按钮"(精准但依赖控件树)
- 图像识别 → "长什么样"(灵活但要准备模板图)
OCR 文字识别解决的是第三个问题:"上面写了什么"。屏幕上有一段话、一个数字、一个名字,脚本能不能读懂它的内容?
答案是能——Autox.js v7 内置了 PaddleOCR 引擎(v7.2.3 升级到 v4 版本),让手机端也能跑离线的 OCR。
PaddleOCR 是什么
PaddleOCR 是百度 PaddlePaddle 深度学习平台的文字识别工具,在移动端通过 Paddle Lite 推理引擎运行。Autox.js 把它内置进 App,脚本可以直接调用。
| 特性 | 说明 |
|---|---|
| 模型版本 | PaddleOCR v4(v7.2.3 升级) |
| 运行方式 | 本地离线(不需要网络) |
| 模型大小 | slim 模型约 10~20MB |
| 支持语言 | 中文(简体/繁体)、英文、数字为主 |
初始化 OCR 引擎
console.show();
// 方式一:用默认配置初始化
paddle.initOcr();
// 方式二:自定义配置
paddle.initOcr({
modelPath: null, // null = 使用内置模型
labelPath: null, // 标签文件路径
cpuThreadNum: 4, // CPU 线程数(默认 4)
cpuPowerMode: 2 // 性能模式(0=低功耗, 1=均衡, 2=高性能)
});
console.log("OCR 引擎初始化完成");
v7.2.3 新增了 paddle.initOcrWithConfig() 方法,可以传入一个 OcrConfig 字典:
paddle.initOcrWithConfig({
model_path: "/sdcard/脚本/ocr_models/v4/",
cpu_threads: 4,
use_gpu: false, // 移动端一般不用 GPU
lang: "ch" // ch=中文, en=英文
});
基础识别
// 先截屏
let img = captureScreen();
// 识别整张图
let texts = paddle.ocr(img);
// texts 是一个数组,每个元素包含文本和位置
texts.forEach(t => {
console.log("文字:" + t.text + " 位置:" + t.bounds);
});
// 释放图片
img.recycle();
带区域的识别
// 只识别屏幕上的某个区域(更快、更准)
let region = [0, device.height * 0.5, device.width, device.height * 0.4];
let texts = paddle.ocr(img, { region: region });
限定区域和图像识别里的 region 一样——只在你关心的那个区域做 OCR,速度快很多。
识别结果里有什么
let result = paddle.ocr(img);
// 每个 result 元素长这样:
{
text: "立即领取", // 识别出来的文字
confidence: 0.98, // 置信度 0~1
bounds: [ // 文字在屏幕上的位置
{ x: 100, y: 500 },
{ x: 200, y: 500 },
{ x: 200, y: 550 },
{ x: 100, y: 550 }
]
}
实战:自动识别按钮文字并点击
console.show();
// 初始化 OCR
paddle.initOcr();
console.log("OCR 就绪");
// 要查找的目标文字列表
const TARGET_TEXTS = ["确定", "确认", "同意", "允许", "是", "OK", "Confirm"];
// 主循环
setInterval(() => {
let img = captureScreen();
let results = paddle.ocr(img);
for (let r of results) {
if (TARGET_TEXTS.includes(r.text)) {
let center = getBoundsCenter(r.bounds);
console.log("找到:" + r.text + " @ (" + center.x + "," + center.y + ")");
click(center.x, center.y);
sleep(1000);
break;
}
}
img.recycle();
}, 2000);
// 辅助:从 bounds 计算中心
function getBoundsCenter(bounds) {
let totalX = bounds.reduce((s, p) => s + p.x, 0);
let totalY = bounds.reduce((s, p) => s + p.y, 0);
return { x: totalX / bounds.length, y: totalY / bounds.length };
}
释放模型资源
OCR 模型比较占内存,脚本结束或长时间不用时记得释放:
// 立即释放
paddle.release();
// 延迟释放(默认 3 分钟,v7.2.3 新增)
paddle.releaseDelayed(180000);
常见坑
| 问题 | 原因 | 解决 |
|---|---|---|
| 第一次识别很慢 | 模型加载需要时间 | 脚本开头初始化,不是每次识别都 init |
| 识别准确率低 | 图片模糊、文字太小、模型不对应 | 先 zoom 放大图片、换对应语言模型 |
| OCR 闪退 | 内存不足 | 释放后重新 init、用 releaseDelayed |
| v2 模型参数不生效 | v7.2.3 移除了旧版 | 用 paddle.initOcr() 而非 v2 的 API |
OCR vs 找图 vs 找色
| 方案 | 优点 | 缺点 |
|---|---|---|
| 找色 | 最快、最轻 | 只识别纯色,信息太少 |
| 找图 | 最精准、结果确定 | 要提前准备模板图 |
| OCR | 能读文字、自适应大小 | 最慢、准确率有波动 |
实战中通常组合使用:先用 OCR 读关键字、再用找图定位、最后用坐标点击。