万普插件库

jQuery插件大全与特效教程

AI 大模型调用微信 OCR 阅读屏幕(有一云ai微信公众号编辑器)

在 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 可以直接阅读屏幕与图像,可以做的事其实很多,大家可以继续发挥。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言