资讯动态

深入 Xime 手写叠写识别:过分割 + 动态规划,如何在连笔中切出多个字

发布时间:2026/10/14 18:00:49 来源:尧图企业网站定制
【免费下载链接】Xime我的自用安卓输入法基于Rime 构建部分功能由本人设计的本地AI模型驱动支持五笔/拼音/自定义方案。项目地址https://gitcode.com/gh_mirrors/xi/Xime点击查看免费下载Xime 是一款基于 Rime 构建的开源安卓输入法部分功能由作者自研的本地 AI 模型驱动。它的手写叠写识别模块有一个很有代表性的难题用户连笔写你好时一整串笔画没有天然的字边界输入法必须自己决定从哪几笔切成一个字。本文深入拆解 Xime 用**过分割 动态规划DP**解决连笔切字的完整思路以及它如何防止把张错切成弓 长。一、从单字到连写一个绕不开的陷阱Xime 的手写引擎底层是单字识别模型给它一段笔画它返回最像的汉字。这在逐字书写时工作良好——但在手写输入场景中用户往往一口气连写两三个字笔画流是一整条长龙。真正棘手的是一个经典陷阱部件成字。比如张 弓 长而弓和长本身都是合法汉字。当你写到第 3 笔时弓恰好成段模型会非常自信地输出弓等你写完剩下 4 笔正确结果应该是张算法却可能已经固化为弓 长两个字。Xime 的答案不是让模型更聪明而是在模型之上加一层切分决策引擎核心类 OverlappedHandwritingRecognizer.kt 只有 230 行却包含了整套算法的灵魂。二、过分割 动态规划把切分变成搜索问题过分割枚举所有可能的切法传统思路是先检测边界、再逐段识别但手写笔画里边界信号很弱。Xime 反其道而行——不过早决策先把所有可能的切分段都试一遍笔画序列有 n 笔任何一个位置都可以是切分点每两个相邻切分点之间就是一个候选段段内笔画数不超过 20DEFAULT_MAX_STROKES_PER_SEGMENT每个候选段都送单字 ONNX 模型识别一次取 Top 1 分数作为该段的识别分。这一步是过分割它宁可多算把问题从猜边界转化为在所有切法中挑最优。动态规划在指数级切法里找全局最优n 笔画的切法数量随笔画数指数增长逐个枚举不可行。DP 把它压到多项式复杂度核心是一张二维表best[k][i]见 recognize() 主循环best[k][i] 前 i 笔切成 k 段时的最大识别分总和转移时枚举第 k 段的起点 j用best[k-1][j] 该段 Top1 分 时间偏置更新表格同时记录back[k][i] j作为回溯指针。填完表后从back[bestK][n]一路回溯就还原出全局最优的切分序列。复杂度上有个关键护栏同时最多叠写 5 个字DEFAULT_MAX_SEGMENTS 5所以 DP 表只有 5 层每追加一笔的增量推理被段缓存压到个位数次 ONNX 调用后台线程即可跑完。三、两把筛子决定哪些切法能胜出单纯比分段分数总和会踩两个坑Xime 用两个机制分别堵上。段均分 切分惩罚防止多一刀白赚分数两段低分字的总和可能虚高过单段高分字0.9 0.6 0.95所以段间比较不用总和而是用比较逻辑归一化分 总分 ÷ 段数 − 0.02 × (段数 − 1)均分让平均每个字像不像字成为比较基准每多切一刀再扣 0.02 的惩罚SEGMENT_PENALTY让合并在打平时占优——这正是部件成字能自愈的原因写完张后合并段 0.95/1 高于[弓][卜]的 (0.90.6)/2 − 0.02DP 自动切回单段已上屏内容随之替换纠正。时间偏置停顿是最强的分字信号 笔间时间间隔是手写数据里几乎免费的强特征。gaps[j]记录第 j 笔起笔与上一笔收笔的间隔DP 转移时叠加偏置gapBias笔间间隔判定偏置≥ 500ms明显停顿倾向在此切分0.15≤ 150ms连笔压制切分−0.08其余无信号0于是 2 笔笔画、间隔 600ms 会被切成两段间隔 80ms 则保持单段——这个停顿分裂 / 连笔不分裂的行为被单元测试逐一钉死见 测试用例。四、一个字先验为什么在不会被拆成 [一][丿][丨]DP 再强也敌不过一个现实汉字中途的任意几笔往往都能被识别成某个简单字。连笔写在到第 2 笔时[一][一]的均分0.88甚至能打过合并段。如果照单全收输入框会先蹦出两个一再变回在体验崩坏。Xime 加了一道换字停顿先验hasPauseBoundary用相对阈值而非绝对阈值窗口内笔间间隔的中位数 ×2下限 250ms才构成显著停顿有显著停顿 → 信任 DP 的多段切分真换字了无显著停顿 → 回退把整个窗口当一个字识别合并段只要合并段分数 ≥ 0.35MERGED_CHAR_MIN_SCORE就强制按单字处理输入框始终只显示一个字。相对阈值的设计很巧妙慢写者字内间隔本身偏高绝对阈值会把匀速书写的复杂字如 17 笔的赢拆碎快写者字间间隔虽小但相对中位数依然突出照样能被检出。两个方向的误切都被这条先验挡住对应测试用例慢写复杂字匀速笔迹不拆分和连笔单字中途不被拆分。五、工程侧缓存、滑窗与固化算法要丝滑靠的是三层工程配合段缓存segCache笔画只允许尾部追加前缀不变所以[j,i)段的识别结果跨笔画复用每追加一笔真正新增的 ONNX 推理只有含新笔画的尾部少数段。窗口头部裁剪时onStrokesTrimmed把缓存 key 整体平移被裁笔画之外的段零重推理。滑窗固化UI 层scheduleRecognition维护一个识别窗口超过 25 笔HW_RECOGNIZE_WINDOW_LIMIT就把 DP 选出的最早一段固化上屏循环至不超限——正常分字仍交给停顿窗口只是兜底。推理隔离ONNX 模型ochwpro.onnx与笔画预处理全部跑在独立的:inference进程里HandwritingInference.kt键盘主进程只通过 IPC 传原始笔画、收回候选HandwritingEngine.kt进程被系统回收后还能按需自愈重载。视觉细节也服务于这个机制完成字的笔画只是淡出而非消失因为识别窗口全程保留——单字中途写完部件后的停顿如中写完口不会清窗后续笔画落下时全窗口重识别自动把口纠正为中。六、小结与延伸阅读Xime 的叠写识别没有追求花哨的端到端模型而是把工程问题拆干净过分割负责不遗漏动态规划负责选最优段均分 惩罚负责防虚高时间偏置 单字先验负责防误切段缓存负责不卡顿。每层都小到可以单元测试15 个用例覆盖了从两字连写切两段到慢写复杂字不拆分的关键路径。想动手验证从这几个入口读起模块路径叠写识别核心过分割 DPOverlappedHandwritingRecognizer.kt单字模型 IPC 客户端HandwritingEngine.kt推理进程管线HandwritingInference.kt手写键盘与固化调度HandwritingKeyboardLayout.kt算法单测15 个用例OverlappedHandwritingRecognizerTest.kt如果对手写输入中的切分与识别感兴趣这套先过分割、再全局打分的框架也很值得借鉴到语音、OCR 等一切连续流切单元的问题上。赞分享【免费下载链接】Xime我的自用安卓输入法基于Rime 构建部分功能由本人设计的本地AI模型驱动支持五笔/拼音/自定义方案。项目地址https://gitcode.com/gh_mirrors/xi/Xime点击查看免费下载相关推荐moonlight-vplus 串流手写笔与本地输入法手写识别隔离StreamView 动态输入连接设计与 API 33 自动手写关闭方案moonlight vplus 串流手写笔与本地输入法手写识别隔离StreamView 动态输入连接设计与 API 33 自动手写关闭方案 导读 本文基于移动开发音视频如何用ML Kit实现终极移动手写识别从入门到精通的完整指南如何用ML Kit实现终极移动手写识别从入门到精通的完整指南 ML Kit数字墨水识别是Google提供的强大移动AI工具能够在Android和iOS设备上示例工程移动开发Eidos手写识别笔迹数据数字化Eidos手写识别笔迹数据数字化 在数字化时代手写内容的价值依然不可替代。无论是会议笔记、创意草图还是个人日记手写记录承载着独特的个人风格和思维过程。Ei创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑