【听见课堂 HarmonyOS NEXT 实战系列 35】OCR 返回空文本怎么办:可恢复错误态而不是伪造结果

OCR 返回空字符串时,最危险的做法不是显示错误,而是为了“让演示继续”自动填入一段预置公式,然后把页面标成识别成功。用户会把示例内容当作真实板书,后续复盘、任务提取和课堂证据都会被污染。

听见课堂把空文本主动抛为错误,P06 保留原图临时预览并允许人工录入;本地示例则通过独立入口和来源标签明确隔离。本文拆解这套恢复路径,并把已有模拟器证据与仍未验证的真图路径分开记录。

OCR 空结果进入人工复核而不是生成虚假文字

一、空字符串也是一种失败

const recognizedText: string = result.value.trim();
if (recognizedText.length === 0) {
  throw new Error('Core Vision OCR returned empty text.');
}

接口成功返回对象不代表业务成功。结果只有空格、换行或空字符串时,没有可交付文字,必须进入错误分支。

二、为什么不能显示“成功 0 字”

“OCR 成功 · 0 字”会让用户怀疑图片丢失,也让测试报表把空结果统计成成功调用。业务成功条件应包含可用非空文本,而不只是 Promise fulfilled。

服务层主动抛错后,页面可以统一进入人工复核状态。

三、页面先保留真实图片上下文

在识别前,页面已经保存:

this.scanImageUri = uri;
this.scanSourceLabel = sourceLabel;

即使 OCR 失败,P06 仍能显示用户刚拍摄或选择的图片。恢复过程以真实输入为依据,不会让用户重新回忆原图内容。

四、失败时清空 ocrText

} catch (error) {
  this.ocrText = '';
  this.scanError = '自动识别未完成,原图仍可在本页临时预览。' +
    '请手动录入文字,或返回重新扫描。';
}

清空文本可以避免上一次识别结果残留到新图片。若继续显示旧公式,用户可能误以为它来自当前照片。

五、错误文案提供两个可执行动作

用户可以在 P06 手工录入,也可以返回 P05 重新拍摄/选图。错误不是终点,而是把自动能力降级为人机协作。

若原图严重模糊,重拍更合适;若只是少量专业符号未识别,人工修正成本更低。

六、本地示例必须走独立入口

useLocalScanDemo() 会加载 Δx = λL / d 或数据库中的示例记录,并把来源设为 P05 本地扫描演示。它不会在 OCR 异常的 catch 中悄悄执行。

这条隔离非常关键:示例用于验证 UI 和保存闭环,不是错误兜底的“假答案”。

七、人工保存仍要校验非空

const normalizedText: string = this.ocrText.trim();
if (normalizedText.length === 0) {
  this.notice = '识别文字不能为空';
  return;
}

OCR 失败后允许人工输入,不代表允许保存空记录。页面在 Repository 写入前再次执行非空校验。

八、来源标签区分自动与人工

保存真实图片时,来源根据 scanError 选择:

source = this.scanError.length > 0 ?
  '人工复核 · ' + sourceBase :
  'Core Vision Kit · ' + sourceBase;

后续课堂回顾能知道这段文字是自动识别后确认,还是自动失败后由用户录入。来源证据比一个模糊的“已扫描”更诚实。

初始化失败、格式错误、空结果与系统异常的恢复动作矩阵

九、成功后也要提示复核

成功分支的状态是“真实图片 OCR 成功,请复核后保存”,不是“已自动保存”。OCR 输出可能有专业名词、公式和上下标错误,用户仍需在 P06 对照原图。

可编辑 TextArea 和原图/对照模式让自动结果始终处于可校正状态。

十、错误类型要在能力层和页面层分工

Service 区分初始化失败、空文本和底层异常;页面统一展示对普通用户可理解的恢复说明。技术日志保留错误细节,UI 不直接暴露堆栈。

若未来需要更精细提示,可定义结构化错误枚举,而不是依赖英文字符串 includes()

十一、重试不能无限循环

用户可以返回重新选择图片,但系统不应在空结果后自动反复调用 OCR。相同输入和相同条件下无限重试只会增加等待、功耗和资源压力。

更合理的是给出拍摄建议、允许旋转原图、手工输入,并让用户主动决定是否重试。

十二、清晰图片成功路径仍需单独验证

已有模拟器环境没有真实图库图片,因此真实 Core Vision OCR 成功、空结果和异常都没有运行证据。不能因为代码里写了异常分支,就声称它已经在所有设备上通过。

最小补证应包含测试图、返回 URI、识别文字、人工修改、保存后回读和资源释放。

十三、空白图和模糊图是两类测试

空白图验证空结果处理;模糊图可能返回错误文本而不是空字符串。后者更需要用户复核,因为系统看起来“成功”但内容不可靠。

QA 不应只看是否抛错,还要对照人工标注检查内容质量,并避免把一次演示结果写成准确率。

十四、原图不持久化带来的取舍

当前保存后清空 scanImageUri,数据库只保留文字和来源。这符合本地最小数据原则,但也意味着重启后不能继续对照原图。

若未来需要保留原图,必须明确存储位置、生命周期、删除、加密、迁移和用户授权,不能偷偷把临时 URI 写进数据库。

十五、恢复态的无障碍要求

错误文案不能只靠黄色背景;读屏应能朗读“自动识别未完成”和可执行动作。TextArea 要有清晰占位,完成按钮在空文本时应给出可理解反馈。

大字号下还要保证原图、错误卡和输入区可滚动,不让按钮遮住正文。

十六、验收矩阵

输入/故障期望
清晰板书图得到非空文字,进入复核,不自动保存
空白图片进入人工复核,不显示预置公式
损坏或不支持格式保留可理解错误与重新选图入口
OCR 初始化失败释放 PixelMap/ImageSource,页面可继续
用户手工输入非空后保存,来源标记为人工复核
本地示例明确显示示例来源,不计入真实 OCR

还应验证连续失败后内存稳定、退出页面不回写过期状态、数据库没有图片 URI。

当前能对外怎么描述

可以写:“已实现真实图片 OCR 链路、空结果保护、原图临时预览、人工复核和本地示例降级,契约与构建通过。”

不能写:“真实板书 OCR 已在真机全部通过”或“识别准确率达到某个百分比”,因为当前证据不支持。

总结

一个可信的 OCR 产品不会掩盖空结果,而会保护真实输入、允许人工修正并清楚标记来源。听见课堂已经把示例、自动识别和人工复核分成三种证据等级;下一步仍需用真机清晰图、空白图和异常图补齐运行证据。

下一篇将从 P05 走到 P06,拆解扫描材料、OCR 校对、来源时间与本地保存之间的双页面状态流。

参考:华为 Core Vision 文本识别指南、项目 recognizeText()recognizeSelectedPhoto() 与扫描 OCR 复验报告。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐