一、多语言场景下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引擎,就能解决绝大多数的识别失败问题。

其实很多自动化流程的问题,都不是操作逻辑的问题,而是基础配置的问题,只要我们能找到问题的根源,就能找到解决的办法。希望这个方案能帮到大家,让大家的自动化流程在多语言场景下也能跑得稳稳的。