在 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 之间二选一时,请遵循以下 “决策剪刀”:
- 场景:全球化 App(多语言混合)
- 👉 选 Google。如果一张图里同时有中文、韩文和法文,Google 的混合处理能力最强。
- 场景:医疗、教育、会议记录(手写体)
- 👉 选 Azure。在手写英文识别上,Azure 目前没有对手。
- 场景:表格提取
- 👉 选 Azure (Form Recognizer)。虽然两家都有表格服务,但 Azure 的 Form Recognizer 在处理复杂表格结构(合并单元格)时,API 的设计更符合开发者直觉。
- 场景:PDF 文档解析
- 👉 选 Google (Document AI)。Google 对 PDF 内部元数据的解析更透彻。
一句话总结: 如果你的数据是“打字机打出来的”,Google 是最稳的百科全书;如果你的数据是“人手写出来的”,Azure 是唯一的笔迹专家。