直接回答
ML Kit Text Recognition V2 返回的是层级结构,而不只是一个字符串:Text 包含 TextBlock,block 包含 Line,line 包含 Element,Element 还可以包含 Symbol。各层提供识别文本和几何信息,包括轴对齐框和四个角点。应把原始结果、库返回顺序和应用自己生成的顺序分开保存。下游动作使用的字段要能追溯到原始 OCR element 或 line,而不能只留一个重新排序的字符串。 API 确实文档化了阅读顺序。Text.getText() 会按该语言的 reading order 拼接 block 文本;对拉丁文本,参考文档说明 TextBlock 内自上而下、Text.Line 内自左向右。这应作为识别器契约尊重。它不证明每种多栏文章、表格、旁注、脚注或表单的分组和顺序都符合产品任务。不要声称所有 OCR 列表都没有顺序,也不要说所有识别结果天然就是用户想要的顺序;应针对具体页面类别和配置脚本测试。 几何可以说明识别区域,却不会自动给出阅读逻辑。TextBlock、Line、Element 暴露轴对齐框和角点;角点按左上开始顺时针排列,但透视下不一定构成矩形,部分点也可能在图像外。轴对齐矩形可能与其他列或表格单元重叠。不能把所有区域按左上角 y 再 x 排序后称为自然阅读顺序:跨列表头、行交错、表格值、脚注和旁注都会让该启发式出错。保留原始角点以及它们对应的图像坐标基准。 定义产品所需阅读顺序前,先说明文档任务。两栏页面可以先读左栏再读右栏;另一个任务可能需要按行跨栏。表单可能要构建标签与值的配对,而不是输出一段线性转录。保留识别器原文,再生成带稳定区域 ID 和规则版本的独立投影;几何不能确定时允许用户复核。派生顺序不得覆盖原始识别,也不能补造未识别标点或单元格关系。 建立带人工参考结果的夹具:单栏段落、清晰双栏、跨栏标题、表格、页边注、倾斜/透视文字、空区域,以及所选识别器确实支持的混合脚本。比较原始 Text.getText、每个 TextBlock/Line/Element、预期区域归属和任务阅读顺序。分别记录源图身份、库版本、脚本选项、返回层级、角点和应用投影。如果某脚本没有列入该配置或其输出未验证,就记录不支持/未知;不要只靠几何推断 RTL 行为。 Android ML Kit Text Recognition V2 指南要求 API 23 或更高,并提供 bundled 与 unbundled 模型交付方式。锁定依赖和 recognizer 选项,因为已安装模型和支持脚本会影响真实路径。不要编造 block confidence API,也不要把缺失或零值当成替代证据。本文验证阅读顺序和区域归属,不主张超出配置 recognizer 的准确率、语言覆盖或通用阅读能力。 正确顺序取决于任务。阅读报纸、提取收据合计、供人工审核表单有不同验收规则。保留区域几何与原始识别文本,让审核者能找到每个投影项来源。当区域重叠或版面有歧义时,保持 API 原始顺序并请求修改,而不是静默重排字段。测试记录应注明每次顺序变化以及支持它的夹具。 本文是 Android ML Kit 集成方法,不是 Cove 功能报告。当前 Cove OCR 事实描述多模态模型生成的结构化可见文本字段,并不证明存在 ML Kit recognizer、TextBlock 树或多栏排序实现。明确记录识别提供方、语言选项、图像变换和应用投影,避免未来更换库后误以为行为完全相同。
双栏通知被识别出来,但顺序不适合后续任务
Android 文档工具读取一页内容:跨两栏的标题、正文段落、框选表格和页脚注释。OCR 文本可读,但后续字段动作按一个序列消费区域,导致两列交错并把值关联到了错误标签。
决策
保留 ML Kit 原始层级和文档化的语言顺序,再用区域几何与人工审核夹具验证针对该页面任务的独立排序投影。
预期结果
用户可以查看每个投影项对应的原始区域;含糊版面保留原始顺序或要求复核,不静默改变含义。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- MLKIT-READING-ORDER-2026-10:拟新增事实卡,记录 Text API 层级、文档化语言阅读顺序和角点语义;待 Codex source/editorial review。
- OCR-DEDICATED-01:ML Kit Text Recognition 提供 block、line、element 等结构;不表示任意版面投影都符合任务语义。
- COVE-OCR-01:Cove Photo 当前事实描述多模态 Text 字段,不证明集成 ML Kit 或实现多栏排序。
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 固定识别器和脚本契约. 记录 ML Kit Text Recognition V2 依赖、Android API 级别、bundled/unbundled 交付方式、脚本选项、输入路径和图像变换版本。仅测试该准确配置声明支持的语言和版面行为。
- 保留完整原始层级. 保存 Text.getText 以及每个返回的 TextBlock、Line、Element、原始列表位置、文本、boundingBox 和 cornerPoints。原始结果不可变;不要用重新排序的拼接串覆盖它。
- 记录区域几何而不假定矩形. 只在可取得时使用文档定义的角点和边界框。API 在没有结果时可返回 null,应保留为几何不可用,不创建假零矩形或解引用缺失角点。保留图像外的点,将重叠、跨栏标题和透视记录成证据,不自动决定顺序。
- 为任务定义阅读规则. 为目标文档编写版本化规则:按列、按行、标签/值或人工复核顺序。规则消费原始区域 ID 并生成单独投影。不要把拉丁语 Text.getText 规则外推到未支持脚本或所有多栏页面。
- 与审核版版面夹具比较. 覆盖单栏/多栏、跨栏标题、表格、页边注、倾斜文字、部分文本及配置支持的混合脚本。分别比较 API 原始顺序、区域几何和预期任务顺序;将识别错误与投影错误分开。
- 在执行动作前处理不确定性. 区域重叠或标签和值无法确定时,展示原文并在保存、搜索或自动动作前请求纠正。日志记录夹具和规则 ID,不保存私人页面内容,也不静默覆盖原识别结果。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 记录准确 ML Kit 依赖、Android API 级别、交付选项和脚本配置;不支持的脚本或结果保持 unknown。
- 原始 Text/TextBlock/Line/Element 和几何输出与应用生成的排序或字段投影分开保留。
- 阅读顺序测试注明使用了哪条 API 保证并验证任务版面;不把通用 y/x 排序当成人类阅读顺序。
- 歧义或重叠区域可供复核,投影保留源区域 ID,不宣称 OCR 准确率或 Cove 集成。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 原始 Text.getText 输出 | 保留配置 API 返回的语言阅读顺序 | ML Kit 对语言顺序有文档说明,包括拉丁文本在 block/line 内的规则;这仍是识别器输出,不等同所有版面的任务顺序。 |
| 基于几何的投影 | 对区域 ID 与角点应用文档化规则 | 可支持栏目/表格工作流,但简单 y/x 排序可能交错区域或拆散标签与值。 |
| 字段抽取 | 将已审核区域映射到命名字段 | 额外引入任务 schema 和校验,不等于 OCR 返回的行顺序。 |
| 人工复核版面 | 版面含糊时保留原顺序并请求纠正 | 避免静默语义改变,但需要清晰的审核状态和源区域追溯。 |
需要避免的失败模式
- 把 API 返回的字符串、列表顺序直接当成每种多栏文档的人工任务阅读顺序。
- 按全部 boundingBox 的 y/x 坐标简单排序,把表头、栏标题和旁注混在一起。
- 把角点当成永远为矩形、完全落在图像内的坐标。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- ML Kit text recognition
- Google ML Kit:Android Text Recognition V2、层级和脚本选项
- ML Kit Text API:文本层级与阅读顺序
- ML Kit Text.TextBlock API:行、边界框和角点
- ML Kit Text.Line API:行内顺序与元素
- ML Kit Text.Element API:词元几何
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
ML Kit 会按阅读顺序返回文本吗?
API 说明 Text.getText 会按语言阅读顺序返回,并明确了拉丁文本在 TextBlock/Line 内的顺序。应将该契约对照实际多栏或表格任务验证;不能假设每种产品投影都等于识别结果字符串。
能按 boundingBox 的 y 坐标排序所有 TextBlock 吗?
不能将其当作通用规则。双栏、跨栏标题、表格、页边注、透视和混合脚本都会让简单的从上到下排序出错。保留 API 顺序,用审核夹具验证单独定义的投影。
cornerPoints 总是图像内的矩形吗?
不是。API 定义四个顺时针角点,但透视下区域可能非矩形,角点也可能位于图像边界外。保留原点坐标,并把裁切或变换作为独立几何契约处理。
这能证明 Cove 使用 ML Kit 或支持所有脚本吗?
不能。Cove 当前 OCR 事实描述的是多模态 Text 字段。本文仅适用于明确集成了固定版本 ML Kit 与经测试脚本选项的应用,不是 Cove 集成或广泛语言支持主张。