在 aardio 中提供了 process.wxOcr 可以非常方便地调用微信 OCR。
在微信 3.x 版本下运行下面的 aardio 代码可以将微信 OCR 自动打包为绿色版本:
import process.wxOcr;
var ocr = process.wxOcr();
ocr.portable();
运行上面的代码以后,微信 OCR 就会被自动提取到 "/WeChatOCR-Portable" 目录。
调用微信 OCR 的方法或代码仅供技术研究与测试,勿作任何不当用途。实际软件开发可使用基于开源组件的 string.ocrLite 或基于系统自带 OCR 组件的 dotNet.ocr 。
使用的时候用下面的代码创建 OCR 对象:
import process.wxOcr;
var ocr = process.wxOcr();
这个用起来比较省事,一般不需要指定任何参数,扩展库会自动找到微信 OCR 并配置好所有的参数(自动支持绿化版,暂不支持微信 4.x 测试版)。
process.wxOcr 已经将多线程的 OCR 组件转换为了更简单的单线程异步接口,所以我们必须创建一个窗口,在界面线程中调用它。
下面的示例截屏并调用微信 OCR 识别文本,然后找到需要的文本,并将鼠标移动到该位置。
全部代码如下:
import mouse;
import gdip.snap;
import process.wxOcr;
import string.fuzzyMatching;
import win.ui;
/*DSG{{*/
var winform = win.form(text="微信 OCR 演示")
/*}}*/
//截屏并保存图像
var bmp = gdip.snap();
bmp.save("/~~~~ocr.png")
//创建微信 OCR 组件
var ocr = process.wxOcr();
//识别图像
ocr.sendRquest("/~~~~ocr.png",
function(mmojoOcrResponse){
//识别结果
var singleResult = mmojoOcrResponse.ocrResult.singleResult;
//获取所有文本块
var textBlocks = table.map(singleResult, lambda(sr){
//单个识别块的文本
text = sr.singleStrUtf8,
//单个识别块所在位置(left,top,right,bottom)
rect = ::RECT(sr.lx, sr.ly, sr.rx, sr.ry)
});
//创建模糊匹配对象
var fuzzyMatching = string.fuzzyMatching("界面设计");
//遍历文本块
for(k,block in textBlocks ){
//匹配目标文本
if( fuzzyMatching.match(block.text)>0.5 ){
//找到了,鼠标移过去
mouse.moveTo(block.rect);
//退出程序
return winform.close();
}
}
}
)
win.loopMessage();
mmojoOcrResponse 是一个 protobuf 消息对象。
mmojoOcrResponse.ocrResult.singleResult 则是识别结果,这个结构有点复杂,所以我们用下面的代码简化了一下:
//获取所有文本块
var textBlocks = table.map(singleResult, lambda(sr){
//单个识别块的文本
text = sr.singleStrUtf8,
//单个识别块所在位置(left,top,right,bottom)
rect = ::RECT(sr.lx, sr.ly, sr.rx, sr.ry)
});
这就比较好理解了,textBlocks 是识别得到的文本块数组,每个数组元素的 text 字段为识别得到的文本,而 rect 为文本所在位置。
上面这个 textBlocks 转换为 JSON 。
var json = web.json.stringify(textblocks);
这个 JSON 传给 AI,AI 直接就可以理解,当然加上一些描述会更好。
下面我们用 aardio 写一个程序,先截屏再调用微信 OCR 识别并转换为为JSON,然后将 JSON 发送给 AI 大模型。
先看一下程序的运行截图,效果还是相当好的:
完整 aardio 代码:
import mouse;
import gdip.snap;
import process.wxOcr;
import string.fuzzyMatching;
import win.ui;
/*DSG{{*/
var winform = win.form(text="微信 OCR 演示")
/*}}*/
import web.form.chat;
var chatUi = web.form.chat(winform);
//截屏并保存图像
var bmp = gdip.snap();
bmp.save("/~~~~ocr.png")
//创建微信 OCR 组件
var ocr = process.wxOcr();
//识别图像
ocr.sendRquest("/~~~~ocr.png",
function(mmojoOcrResponse){
//识别结果
var singleResult = mmojoOcrResponse.ocrResult.singleResult;
//获取所有文本块
var textblocks = table.map(singleResult, lambda(sr){
//单个识别块的文本
text = sr.singleStrUtf8,
//单个识别块所在位置(left,top,right,bottom)
rect = ::RECT(sr.lx, sr.ly, sr.rx, sr.ry)
});
var json = web.json.stringify(textblocks);
winform.show();
chatUi.showLoading("AI 正在分析数据");
//创建聊天线程
thread.invoke(
function(chatUi,json){
//创建 AI 客户端
import web.rest.aiChat;
var aiClient = web.rest.aiChat(
key = '\0\1\96';
url = "https://ai.aardio.com/api/v1/";
model = "test-model-id";
)
//创建对话消息
var msg = web.rest.aiChat.message();
//添加提示词
msg.prompt('下面是对当前系统屏幕截图进行 OCR 识别返回的 JSON 数据\r\n```json\r\n'+json+'\r\n```\r\n' + '\r\n上面的 JSON 数据包含识别出来的文本以及文本所在屏幕位置,要注意 OCR 可能会有部分的识别错误,例如 OCR 可能将复选框控件识别为“日”字,你要尝试推测与更正信息。\n\n根据以上屏幕 OCR 数据你能分析得到些什么信息?');
//启动对话
aiClient.messages(msg,
function(deltaText,reasoning){
chatUi.writeDelta(deltaText)
})
},chatUi,json)
}
)
win.loopMessage();
当 AI 可以直接阅读屏幕与图像,可以做的事其实很多,大家可以继续发挥。