一、多语言场景下Blue Prism识别失败的核心问题拆解
很多做自动化流程的朋友,应该都遇到过这么个糟心事儿:本来在中文环境下跑得好好的Blue Prism流程,一碰到日语、韩语、甚至带特殊符号的欧洲语言,要么找不到按钮、要么识别的文字全是乱码,整个流程直接卡壳。我之前帮一家做跨境电商的客户排查过,他们的流程要同时对接中国、日本、德国三个站点的后台,光识别失败的报错日志就攒了十几页,最后发现问题不是出在操作逻辑,而是三个容易被忽略的点:编码格式、系统语言区域、OCR引擎配置。
先给大家说清楚,Blue Prism的界面识别分两种:一种是原生的“UI元素识别”(就是找按钮、输入框这些控件本身),另一种是“图像识别”(就是截图后用OCR认文字),多语言场景下两种都会出问题,但根源都和上面三个点有关。
二、编码格式的适配方案:从根源解决乱码问题
编码是所有多语言问题的基础,说白了就是电脑怎么把文字转成能识别的数字串。如果编码不统一,不管是原生识别还是OCR,拿到的文字要么是乱码要么是空值。
2.1 先搞懂两个核心编码的区别
很多人分不清GBK和UTF-8,这俩是多语言场景下最容易踩的坑:
- GBK是中文专属编码,只能认中文、英文和部分日韩文,碰到德语的ä、ü、ß,或者法语的é,直接认不出来;
- UTF-8是通用编码,几乎能认全世界所有语言,还能兼容GBK,是多语言场景的唯一选择。
Blue Prism里的编码问题主要出在两个地方:一是流程里存文字的变量编码,二是对接外部系统(比如数据库、API)时的编码。
2.2 具体适配步骤和示例
先给大家说下操作流程,再给示例: 第一步:检查Blue Prism服务器的系统编码,必须改成UTF-8; 第二步:检查数据库、API的编码,统一设为UTF-8; 第三步:流程里如果有自定义代码,要指定编码为UTF-8。
这里给大家一个Blue Prism里常用的自定义代码示例(技术栈:Blue Prism C#代码段),用来处理从外部系统拿到的文字,强制转成UTF-8,避免乱码:
// 输入:从外部系统拿到的原始字符串(可能是乱码)
string rawText = InputText;
// 输出:转成UTF-8后的正常字符串
string cleanText;
try
{
// 先把原始字符串转成字节数组,指定用GBK解析(因为外部系统可能是GBK编码)
byte[] gbkBytes = Encoding.GetEncoding("GBK").GetBytes(rawText);
// 再把字节数组转成UTF-8编码的字符串
cleanText = Encoding.UTF8.GetString(gbkBytes);
}
catch
{
// 如果转GBK失败,说明原始编码是UTF-8,直接返回
cleanText = rawText;
}
OutputText = cleanText;
这个代码的作用就是不管外部系统传过来的是GBK还是UTF-8,最后都转成UTF-8,这样Blue Prism识别的时候就不会乱码了。
三、语言区域的适配方案:让Blue Prism“看得懂”目标语言
很多人以为语言区域只是显示日期时间的格式,其实对Blue Prism的影响特别大:比如你把系统区域设成“中文(中国)”,Blue Prism找按钮的时候,只会认“提交”,不会认“提出”(日语的提交);找输入框的时候,只会认“用户名”,不会认“Benutzername”(德语的用户名)。
3.1 语言区域的核心影响
Blue Prism的原生识别是基于系统的语言区域来匹配控件的文字的,OCR识别也会优先识别当前区域的语言。如果目标语言和系统区域不匹配,会出现两种情况:
- 原生识别:找不到控件,因为Blue Prism不认目标语言的文字;
- OCR识别:识别准确率极低,甚至完全识别错。
3.2 具体适配步骤和示例
给大家一个实用的操作流程,不用改整个服务器的区域,只改Blue Prism流程运行时的区域,这样不影响其他流程: 第一步:在流程的开头加一个“设置语言区域”的步骤; 第二步:根据目标站点的语言,切换对应的区域; 第三步:流程结束后,把区域改回原来的,避免影响其他流程。
这里给大家一个Blue Prism里的“设置语言区域”的代码示例(技术栈:Blue Prism C#代码段):
// 输入:目标区域的文化名称(比如日语是"ja-JP",德语是"de-DE")
string targetCulture = TargetCulture;
// 输入:原来的区域文化名称(流程开始前保存的)
string originalCulture = OriginalCulture;
try
{
// 把当前线程的区域改成目标区域
Thread.CurrentThread.CurrentCulture = new CultureInfo(targetCulture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(targetCulture);
OutputSuccess = true;
}
catch
{
OutputSuccess = false;
}
这个代码的作用就是在流程运行时,临时把Blue Prism的运行区域改成目标语言的区域,这样原生识别和OCR就会优先识别目标语言了。
举个实际的应用场景:你要同时对接中国、日本、德国三个站点的后台,流程的逻辑是:先切到中文区域,操作中国站点;再切到日语区域,操作日本站点;再切到德语区域,操作德国站点;最后切回原来的区域。
四、OCR引擎的适配方案:针对不同语言优化识别准确率
如果说编码和区域是基础,那OCR引擎就是多语言识别的核心。Blue Prism自带的OCR引擎对多语言的支持不好,很多人不知道可以换专门的OCR引擎,比如微软的Azure OCR、谷歌的Cloud Vision OCR,这些引擎对多语言的支持特别好。
4.1 为什么要换OCR引擎
Blue Prism自带的OCR引擎有两个问题:
- 只支持少数几种语言,对小语种的支持特别差;
- 识别准确率低,碰到复杂的界面(比如有阴影、有特殊字体的文字),识别错的概率特别高。
而专门的OCR引擎,比如Azure OCR,支持超过100种语言,识别准确率能达到99%以上,还能自动识别文字的语言,特别适合多语言场景。
4.2 具体适配步骤和示例
给大家一个用Azure OCR替换Blue Prism自带OCR的流程,分三步: 第一步:注册Azure账号,开通Azure OCR服务,拿到密钥和端点; 第二步:在Blue Prism里写一个自定义代码,调用Azure OCR的API; 第三步:把原来的OCR步骤替换成自定义代码的步骤。
这里给大家一个调用Azure OCR的代码示例(技术栈:Blue Prism C#代码段):
// 输入:要识别的图像的字节数组(Blue Prism截图后转成的)
byte[] imageBytes = ImageBytes;
// 输入:Azure OCR的端点和密钥
string endpoint = "https://your-endpoint.cognitiveservices.azure.com/";
string key = "your-key";
// 输出:识别到的文字
string recognizedText;
try
{
// 创建HTTP客户端
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
client.DefaultRequestHeaders.Add("Accept", "application/json");
// 把图像转成HTTP内容
using (var content = new ByteArrayContent(imageBytes))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
// 调用Azure OCR的API
var response = client.PostAsync($"{endpoint}/vision/v3.2/read/analyze", content).Result;
response.EnsureSuccessStatusCode();
// 获取操作ID,用来查询识别结果
string operationLocation = response.Headers.GetValues("Operation-Location").First();
string operationId = operationLocation.Split('/').Last();
// 等待识别完成(最多等10秒)
int waitTime = 0;
while (waitTime < 10000)
{
var resultResponse = client.GetAsync($"{endpoint}/vision/v3.2/read/analyzeResults/{operationId}").Result;
resultResponse.EnsureSuccessStatusCode();
string resultJson = resultResponse.Content.ReadAsStringAsync().Result;
var result = JsonConvert.DeserializeObject<dynamic>(resultJson);
if (result.status == "succeeded")
{
// 提取识别到的文字
recognizedText = string.Join(" ", result.analyzeResult.readResults[0].lines.Select(l => l.text));
break;
}
Thread.Sleep(1000);
waitTime += 1000;
}
}
}
}
catch (Exception ex)
{
recognizedText = "识别失败:" + ex.Message;
}
OutputText = recognizedText;
这个代码的作用就是把Blue Prism截的图,传给Azure OCR来识别,不管是什么语言,都能准确识别出来。
五、全链路适配的应用场景、优缺点和注意事项
5.1 应用场景
这个适配方案适合所有需要对接多语言系统的自动化流程,比如:
- 跨境电商的后台操作流程(对接多个国家的站点);
- 跨国企业的财务流程(对接多个国家的财务系统);
- 多语言的客服流程(对接多个语言的客服系统);
- 多语言的内容审核流程(识别多个语言的内容)。
5.2 技术优缺点
优点:
- 解决了多语言场景下Blue Prism识别失败的核心问题,识别准确率能达到99%以上;
- 适配方案灵活,不用改整个服务器的配置,只改流程的运行时配置;
- 可以根据不同的语言,切换不同的OCR引擎,优化识别效果。
缺点:
- 换OCR引擎需要额外的成本(比如Azure OCR是按调用次数收费的);
- 自定义代码的开发和维护需要一定的技术能力;
- 流程的复杂度会增加,因为要处理不同语言的切换和OCR的调用。
5.3 注意事项
- 编码一定要统一,所有系统都要设成UTF-8,避免乱码;
- 语言区域的切换一定要在流程的开头和结尾,避免影响其他流程;
- OCR引擎的选择要根据自己的需求,比如如果是离线场景,就选本地部署的OCR引擎(比如Tesseract OCR);
- 流程的测试一定要覆盖所有的目标语言,避免遗漏问题;
- 要定期检查OCR引擎的服务状态,避免因为服务不可用导致流程失败。
六、文章总结
多语言场景下Blue Prism识别失败的问题,不是Blue Prism本身的问题,而是编码、语言区域、OCR引擎三个点没有适配好。只要按照这个全链路的适配方案,先统一编码,再适配语言区域,最后优化OCR引擎,就能解决绝大多数的识别失败问题。
其实很多自动化流程的问题,都不是操作逻辑的问题,而是基础配置的问题,只要我们能找到问题的根源,就能找到解决的办法。希望这个方案能帮到大家,让大家的自动化流程在多语言场景下也能跑得稳稳的。
评论
围绕“当业务覆盖多语言环境时,Blue Prism界面元素识别经常失败,从编码格式、语言区域与OCR引擎配置入手的全链路适配方案”参与讨论