Mar 29, 2026
1 min read
Android,

我实现了自己的手机输入法

因找不到满足需求的输入法,基于 rime 引擎开发了自己的 Android 输入法,支持五笔拼音混输和显示字根功能。

2007 年的某一天,我突然受不了网吧电脑里的拼音输入法的重码问题。于是脑子一热,决定花点时间学习五笔输入法。

当时的手机,哪怕是塞班系统,都有百度五笔输入法。百度的五笔输入法有一个特点,就是允许五笔和拼音混输。

然而,人的天性就是懒惰的,由于我过早地依赖五笔和拼音混输,导致我五笔有很多次到现在还是不太会打,另一边又已经完全忘记了五笔的字根口诀,于是,奇怪的受害者出现了。

直到现在,我这个坏习惯还是无法修正,无法摆脱拼音的依赖。虽然我曾经多次强制过自己,要么完全五笔,要么完全拼音。

在手机上,我切换过的输入法路径是: 百度输入法 -> 系统默认五笔输入法 -> 同文输入法 -> 微信输入法-> 小企鹅输入法 。

没错,我现在一直在避免使用商业的输入法,因为他们真的会收集打字内容,然后用于广告。

我的需求:

  1. 支持拼音和五笔混输。
  2. 纯本地功能,不依赖网络。
  3. 支持显示五笔字根。

最初的想法

我目前使用的是小企鹅输入法,我最初的想法是在小企鹅输入法上添加一个上滑按键显示五笔字根的功能。因为我对小企鹅输入法的使用是比较满意的,并且它是开源的,添加这个功能的话应该问题不大。

但是我无意中看了小企鹅输入法的 issue,发现小企鹅输入法在做键盘自定义功能,只是这个功能一做就做了三年,到现在还没有完成。我看了源代码,发现它并没有实现上滑按键的功能。

同样地,同文输入法也是开源的,那我能不能使用它来修改?这个我没有仔细研究,因为同文输入法的输入界面做得太丑了,完全不符合我的审美。我如果要修改,首先得对它的 UI 动刀子。

同样都是使用 rime 作为输入引擎,那我为什么不自己写一个输入法呢?只服务于我自己的输入法,不需要考虑其他人的感受和配置的话,那输入法的功能并不会很复杂。

无论在电脑上,还是手机上,其实我使用的输入法都基于 rime 的配置文件。我一直在使用的是fork 自别人的五笔输入法配置。

实现

很自然地,我创建了这个只服务于我自己的输入法项目。这个项目同样基于 rime 引擎开发,并且默认配置使用的是我一直在同文、小企鹅、鼠须管的配置。

困难

理论上,要显示五笔字根,只需要在配置里打出字根再通过上滑显示出来就可以了。 但是,其实我没有办法完全打出所有的字根。我翻看了很多资料,也没有讲出怎么打出字根的方法。目前只能打出部分字根,再加上微信输入法可以显示一部分字根。但是还是无法集齐所有字根。

这意味着,我需要动用设计软件来绘制字根。

因为不可能真的显示口诀:

王旁青头戋(兼)五一
土士二干十寸雨
...

手写输入

我之前有训练过一个手写输入法的模型,并做了web 版本的手写输入法demo : https://ochw.pages.dev/(项目在这里:https://github.com/ximeiorg/ochw)。为了满足自己的成就感,我特地把这个模型集成进来。

由于模型需要非常大的推理运行时,转换成 onnx 集成后我发现,整个输入法的安装包直接上到100mb去了。于是又换成了ncnn 框架做推理,发现还是很大。我认真想了一下,我有必要使用这个手写功能吗?

最后决定不做这个功能。

语音转文字

语音转文字是有时候非常必要的功能,开源输入法有一个问题就是无法获得很好的 ASR 能力。原因是 好用的 ASR 模型太大了,根本无法做到边侧部署。 而能部署在移动端的 ASR 小模型,对于我这种普通话水平来说,不够实用,错误率过高了。

因此最好的办法是通过接入外部的asr模型来获得更好的asr能力。

当前,目前这个功能尚未实现。

效果

下滑g显示的效果: 下滑g显示的效果:

其他效果: 其他效果:

总结

对我来说,这个项目基本实现了我想要的功能。