在 OCR 的“世界杯”赛场上,Google 和 Azure 属于那是种“降维打击”的存在。

国内厂商(如百度、腾讯)在中文、身份证、发票识别上做得极深,但在 小语种覆盖(如泰语、阿拉伯语、希伯来语)英文草书(Cursive Handwriting) 上,Google 和 Azure 拥有绝对的数据统治力。

1. Google (Document AI):用“搜索”来做 OCR

Google 的 OCR 强项在于它不仅仅是看图,它背后站着 Google Search 的知识图谱

  • 纠错能力(Correction):当 OCR 模型把一个模糊的地名识别错时,Google 能利用地图数据自动修正它。比如把 “San Fruncisco” 自动纠正为 “San Francisco”。
  • 语种霸权:支持 200+ 种语言。如果你的 App 要发往中东(从右向左写的阿拉伯语)或者东南亚(只有一行却像三行的泰语),Google 是最稳的选择。

Google Document AI 是它们最新的产品形态,不再只是吐出文字,而是直接针对 Invoice (发票)ID (证件) 提供预训练好的 Parser,开箱即用。

2. Azure (AI Vision):手写体识别的 SOTA

如果说 Google 是通才,Azure 就是手写体领域的专才。

微软在 2020 年后的 OCR 更新(Read API v3.2 及以后)震惊了业界。它对 自由手写体(Free-style Handwriting) 的识别率达到了恐怖的“人类水平(Human Parity)”。

  • 连笔字:老外写英文最喜欢连笔,单词之间没有间隙。Azure 能精准切分。
  • 白板/笔记:拍一张会议后的白板,上面画满箭头、圈圈和歪斜的字,Azure 能把它们还原得井井有条。
  • 医疗场景:这是 Azure 的杀手锏。它能看懂医生那著名的“狂草”处方。

3. 技术原理差异

  • Google:侧重 Dense OCR。在检测密集文本(如报纸、扫描文档)时,Google 的召回率极高,漏检很少。
  • Azure:侧重 Spatial Reasoning(空间推理)。它在处理非结构化、甚至旋转、倒置的文本时,采用了更先进的 Transformer 架构,关注字符之间的空间关系,而不仅仅是序列关系。

4. 代码实战:调用 Azure Read API 识别手写笔记

Azure 的调用稍微复杂一点,因为它的 Read API 是 异步(Async) 的。你需要先提交图片,拿到一个 Operation-Location,然后轮询结果。

这是为了处理大图或复杂手写图设计的,防止 HTTP 连接超时。

Python

import os
import time
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from msrest.authentication import CognitiveServicesCredentials

# 环境变量配置
KEY = "YOUR_AZURE_KEY"
ENDPOINT = "YOUR_AZURE_ENDPOINT"

def recognize_handwriting(image_path):
    # 1. 初始化客户端
    client = ComputerVisionClient(ENDPOINT, CognitiveServicesCredentials(KEY))

    # 2. 读取图片流
    with open(image_path, "rb") as image_stream:
        # 3. 提交请求 (Read in Stream)
        # 这一步是非阻塞的,返回一个 response object
        print("提交图片,开始异步识别...")
        recognize_handwriting_results = client.read_in_stream(image_stream, raw=True)

    # 4. 获取 Operation ID
    # Azure 不会直接返回结果,而是给你一个 URL 去查进度
    operation_location = recognize_handwriting_results.headers["Operation-Location"]
    operation_id = operation_location.split("/")[-1]

    # 5. 轮询等待结果
    while True:
        result = client.get_read_result(operation_id)
        if result.status not in ['notStarted', 'running']:
            break
        print("正在分析手写体... (Waiting)")
        time.sleep(1)

    # 6. 解析结果
    if result.status == OperationStatusCodes.succeeded:
        print("\n=== 识别成功 ===")
        for text_result in result.analyze_result.read_results:
            for line in text_result.lines:
                # 打印每一行识别出的文本
                print(f"Text: {line.text}")
                # print(f"Box: {line.bounding_box}")
    else:
        print("识别失败")

if __name__ == "__main__":
    # 找一张那种连笔严重的英文笔记图
    img = "doctors_note.jpg" 
    recognize_handwriting(img)

5. 选型建议

在 Google 和 Azure 之间二选一时,请遵循以下 “决策剪刀”

  1. 场景:全球化 App(多语言混合)
    • 👉 选 Google。如果一张图里同时有中文、韩文和法文,Google 的混合处理能力最强。
  2. 场景:医疗、教育、会议记录(手写体)
    • 👉 选 Azure。在手写英文识别上,Azure 目前没有对手。
  3. 场景:表格提取
    • 👉 选 Azure (Form Recognizer)。虽然两家都有表格服务,但 Azure 的 Form Recognizer 在处理复杂表格结构(合并单元格)时,API 的设计更符合开发者直觉。
  4. 场景:PDF 文档解析
    • 👉 选 Google (Document AI)。Google 对 PDF 内部元数据的解析更透彻。

一句话总结: 如果你的数据是“打字机打出来的”,Google 是最稳的百科全书;如果你的数据是“人手写出来的”,Azure 是唯一的笔迹专家。