手写识别(HandwritingRecognizer)使用指导:在画布上写字识别成文字

« 返回

机器学习套件(ML Kit)组件在在线版和教育版中提供,离线版(含机房版)不包含。

它能做什么

手写识别把用户在画布上写的字识别成文字,支持 300 多种语言,也能识别表情涂鸦和基本几何图形。把「书写画布」设成一块画布后,用户照常在画布上画线,笔迹会被自动记录,写完调用「开始识别」即可。

准备工作

  • 语言包:每种语言第一次识别时自动下载(需联网,从 Google 服务器下载,国内网络可能失败),下载后离线可用。
  • 语言代码:zh-Hani 中文(默认,简繁都认)、en-US 英文、ja 日文,emoji 表情、shapes 几何图形。
  • 联机调试:安卓上用 AI 伴侣调试需要安装 MLKit 版 AI 伴侣(应用宝,包名 cn.fun123.appinventor);普通版伴侣不含识别引擎,调用时会触发「屏幕.出现错误时」(错误码 4722)。直接打包 APK 安装测试不受影响。
  • 安装包体积:只有用到本组件的 App 才会打包它的识别引擎与模型,体积以编译结果为准。
  • 鸿蒙:暂不支持:鸿蒙系统没有开放手写文字识别接口,调用会触发「识别失败时」并说明原因。

案例一:写字并识别

初始化时把画布交给手写识别;识别前用「笔画数」判断画布上有没有笔迹:

when Screen1.Initialize() {
  手写识别1.DrawingCanvas = 画布_书写
}
when 按钮_识别.Click() {
  if 手写识别1.StrokeCount == 0 {
    标签_状态.Text = "画布上还没有笔迹,先写几个字"
  } else {
    手写识别1.Recognize()
  }
}
when 按钮_清除.Click() {
  手写识别1.Clear()
}
when 手写识别1.GotText(文本, 候选JSON) {
  标签_结果.Text = 文本
}

案例二:候选结果与语言包管理

把候选 JSON 解析成列表,点选即可替换结果;「检查模型」异步返回当前语言包是否已下载:

when 手写识别1.GotText(文本, 候选JSON) {
  var 候选 = list()
  foreach 项 in Web客户端1.JsonTextDecodeWithDictionaries(候选JSON) {
    listAdd(候选, dictget(项, "text", ""))
  }
  列表显示框_候选.Elements = 候选
}
when 列表显示框_候选.AfterPicking() {
  标签_结果.Text = 列表显示框_候选.Selection
}
when 按钮_模型.Click() {
  手写识别1.CheckModel()
}
when 手写识别1.GotModelState(已下载) {
  标签_详情.Text = choose(已下载, "语言包已下载", "语言包还没下载")
}

结果数据说明

「候选JSON」是数组,每项含 text、score,按可能性从高到低排列,个数受「最多结果数」控制。「清除」同时清空已采集的笔迹和画布画面。

常见问题

现象 原因与处理
识别失败提示下载语言包 首次识别要联网下载;网络不通时换网络或提前用「下载模型」
识别结果总是空 没设「书写画布」,或写字时画布被其它组件挡住
切换语言后结果怪 切换语言后清除画布重写

完整 .aia 源码与操作指导

下载 .aia 源码

导入 HandwritingRecognizerDemo.aia 后可以直接打包 APK 运行;用 AI 伴侣联机调试请安装 MLKit 版 AI 伴侣。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机识别效果请以实际设备为准。

功能 操作 预期结果
写字识别 在白色画布上写「你好」,点「识别」 结果区显示识别文字,候选列表列出多个结果
选择候选 点候选列表中的一项 结果替换为所选文字
切换语言 下拉框选 en-US 后写英文 识别英文;首次会先下载英文语言包
检查语言包 点「检查语言包」 显示当前语言包是否已下载
清除 点「清除」 画布与笔迹都被清空

案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/HandwritingRecognizerDemo/,SHA-256:0aaa94a154ed3e3415260c79f5f106d6ec26cf9baa2273b5c2a609062ddea153。

文档反馈