一口气打完一句话
整句拼音连着打,不用逐词确认。引擎先在词库里找出完整的句子,本地语言模型从中挑选,再对照你打的拼音和前文,修正个别同音错字。一键一键打出来,和一次输完,得到的候选是一样的。
言泉是一个开源的 Linux 拼音输入法,同时支持 IBus 和 Fcitx 5。没有广告,不需要登录,也不会上传你的输入记录——词库、设置和学习数据都只存在本机。代码全部公开,它做了什么,你随时可以查证。
v2.0.0 · 一个本地语言模型,管全部选词
代码、词库、构建脚本都在 GitHub 上,任何人都能查看,也能自己编译。
输入内容全部在本机处理,没有云端联想,也没有遥测上报。
通过 IBus 和 Fcitx 5 各自的原生适配器接入桌面,两个框架共用一个引擎服务、一套设置和词库。
不联网、不上传是底线。在这之上,每一项功能都只为把字打准、打顺。
整句拼音连着打,不用逐词确认。引擎先在词库里找出完整的句子,本地语言模型从中挑选,再对照你打的拼音和前文,修正个别同音错字。一键一键打出来,和一次输完,得到的候选是一样的。
同一个拼音对应好几个词时,语言模型会结合光标前的文字来判断该用哪个。没有前文可参考,或者把握不够,就按词库和你平时的选择来排,不乱改。
三到五个音节、词库没有收录的短语,比如 jiuguize,会由语言模型结合前文拼成「旧规则」,而不是把常用字硬凑在一起。首选不对时,选一次后面的,它就记住了。
言泉原创的候选窗补全:输入至少两个完整音节后,把握足够时,补全行只给出一个方案,按 Tab 或反引号接受。它能补完正在打的词,也能续上一小段后文;拿不准就不提示,被你拒绝过的也不会再冒出来。
常打的词会排得越来越靠前,分几段确认出来的词组也记得住,切换简繁时学过的词跟着转换。输入框架能提供光标前后的文字时,当前文档中反复出现的术语和人名会得到照顾;这些临时信息只留在内存中,从不写入磁盘。选中学过的词按 Ctrl+Delete 就能删掉它。
除了全拼和首字母简拼,还内置六种双拼:微软、小鹤、自然码、搜狗、紫光和拼音加加,并可分别启用 11 组常见声母、韵母模糊规则。不管用哪种方案,简繁词库、候选排序和学习数据都是同一套。
ufh 出符号,uxh 出序号,usx 出数学符号,urq、usj 出当前日期和时间;i123.45 转成中文数字和金额大写,双拼下按 Shift 加 U、I、V 进入。连着打数字时,句号键自动给出小数点。中文标点下,# * - 等 Markdown 符号默认保持半角,可在设置里调整。这些都由本地规则生成,不占用户词。
候选面板由 IBus 或 Fcitx 5 绘制,字体和配色跟着桌面主题走。每页显示 3 到 9 个候选,默认 9 个;翻页可以用 -/+、[/]、,/. 或 Shift+Tab/Tab,在设置里任选一组。
不用切换中英文:打 markdown、pro、Effie 这类英文单词和名字,或者带大写字母的词,原样的字母会排到候选最前面,按空格就上屏。bug、mac 这种同时也是拼音的输入,由语言模型结合前文判断你更可能要哪个;选过一次字母,下次会优先考虑。中文候选的数字编号不变,双拼仍按中文处理,不需要时可在设置里关闭。
常用的句子、签名、地址或多行模板,可以在设置里配一个字母快捷码。打完快捷码,短语出现在补全行,按 Tab 原样上屏,换行也保留。短语单独保存,不进学习数据,可以排序,也可以用 JSON 导入导出。
收入中小学课本、《唐诗三百首》《千家诗》《宋词三百首》中的 7,747 句诗词,多音字按诗意定读音。打 chunmi 就能按 Tab 补出「春眠不觉晓」;整句打完,再按 Tab 连同标点接上下一句。
IBus 和 Fcitx 5 各有原生适配器,连到同一个引擎服务,设置、词库和学习数据都是同一份。GTK 3 设置程序覆盖两种框架,每个功能快捷键都能单独关闭。从第一个按键起就有词库候选,语言模型在后台加载;停止输入五秒后,服务归还用不到的内存。
现在的输入法功能越来越多,但很多人想要的其实很简单:
打字准一点,别弹广告,别偷偷传数据。
言泉就是照着这个想法做的。
同样的拼音可以拆出很多种结果:yanquan 是「言泉」,也可以是「眼圈」「烟圈」。句子越长,可能的组合越多,引擎要在几十条路径里挑出你想说的那条。从 v2.0.0 起,这件事交给同一个本地语言模型,全程不联网。Linux 版的引擎、模型和词库与 Windows v2.2.0、Cassotis Lexicon v2.2.0 对齐。
v0.1.0 用 Free Pascal 把 Windows 版的引擎搬到 Linux 上,以 Windows v1.17.0 为基线,并为 IBus 和 Fcitx 5 各写了原生适配器。之后的 v0.2 到 v0.9 逐版跟进 Windows v1.18.0 至 v1.29.0:生成的排序模型、经 C++ 桥接库运行的 Transformer 重排器、拼音约束的局部纠错,一整套模型都随包在本机运行。
v1.0.0 对齐 Windows v1.31.0,引入基于独立中文语料训练的共享字符级语言模型,把整句连贯性和前文语境用于长句选词、上下文短词和补全。到这时,安装包里有 12 个神经模型文件,引擎里还编译进 43 组模型参数,一次选词往往要依次经过其中好几个。
v2.0.0 对齐 Windows v2.2.0,把它们清掉了:神经模型从 12 个减到 1 个,引擎里的模型参数从 43 组减到 7 组,升级时旧模型文件会被删除。留下的是一个约 1.5 亿参数的字符级语言模型,由本项目自己训练,和 Windows 版是同一个文件;长句、短词、补全和同音纠错都问它。模型加载后空闲时,引擎服务的常驻内存从约 437 MiB 降到约 311 MiB(x86_64)和 320 MiB(aarch64)。
这不是一次功能堆叠,而是一次收拾:以后的改进只需要做在一处,语言模型变好,所有输入场景一起受益。
详细改动见各版本发布说明。
语言模型在发布前训练完成:从独立的中文语料学习字与字的接续,同时学会对照拼音修正同音字。另有四个很小的决策策略,用引擎的实际运行记录拟合,决定什么时候听模型的。基准测试语料不参与训练,发布产物不附带训练语料原文。
模型随安装包一并提供,量化后由引擎服务在后台加载;统计先验写入本地 SQLite 词库,其余排序参数直接编译进引擎。无需另装模型、GPU 或推理环境,使用时不联网、不下载数据。
长句由受词库约束的搜索给出完整候选,模型从中选择,再对照拼音和前文修正。短词默认保持词库顺序,模型有明确理由时才调整。词库里没有的短语,先由词库词拼出整句方案,再交给模型挑选。字母串既像英文又像拼音时,也由模型结合前文比较两种读法。补全先显示有把握的方案,模型随后在后台重排。
模型只在引擎服务中加载,两个框架的适配器都不加载它;后台就绪、仅用 CPU,线程数等于可用的 CPU 数(x86_64 最多 6 个,aarch64 最多 8 个)。模型调用在前台限时 100 ms、后台补全限时 120 ms,未就绪或超时的时候,候选照常给出,只是不经过模型排序。以下各套基准测试的语料都与训练数据隔离,成绩里没有「背题」的水分。
长句、短词与一键补全测试语料都取材于开发者自己的小说《永恒的舞动》,与 Windows 版相同,并与模型训练数据保持隔离。测试方法、案例构造和指标定义见 BENCHMARK.CN.md。表中的版本号均为 Linux 版本。
v2.0.0 于 2026 年 10 月 17 日在两台 8 vCPU 的 Ubuntu 26.04.1 虚拟机上测量:x86_64 配 16 GiB 内存,宿主为 Intel Core i5-12600K;aarch64 配 8 GiB 内存,运行在 Apple 芯片上。两者是各自机器的结果,不是同条件的硬件对比。v2.0.0 的准确率和耗时来自同一次不设墙钟时限的运行,模型使用 8 个线程;此前各版保留发布时的实测数据,计时方式不同,耗时不能直接对比。v2.0.0 改正了 43 条测试案例中读错的多音字拼音(长句 38 条、短词 5 条,两套补全基准随之沿用),此前版本的结果基于改正前的案例。
对 16300 条长句一次性设置完整拼音,检查完整候选的准确率与引擎解码耗时。
| 版本 | 架构 | Top1 | Top2 | Mean (ms) | P95 (ms) | Max (ms) |
|---|---|---|---|---|---|---|
| v2.0.0 | x86_64 | 13397 / 16300 82.19% | 14281 / 16300 87.61% | 147.95 | 223 | 1061 |
| v2.0.0 | aarch64 | 13399 / 16300 82.20% | 14282 / 16300 87.62% | 115.22 | 185 | 536 |
| v1.0.1 v1.0.0 |
x86_64 | 12940 / 16300 79.39% | 13534 / 16300 83.03% | 114.70 | 178 | 486 |
| v1.0.1 v1.0.0 |
aarch64 | 12946 / 16300 79.42% | 13537 / 16300 83.05% | 98.10 | 159 | 472 |
| v0.9.1 | x86_64 | 11998 / 16300 73.61% | 12970 / 16300 79.57% | 173.66 | 320 | 912 |
| v0.9.1 | aarch64 | 11992 / 16300 73.57% | 12969 / 16300 79.56% | 64.52 | 118 | 416 |
| v0.9.0 | x86_64 | 11998 / 16300 73.61% | 12970 / 16300 79.57% | 160.92 | 292 | 808 |
| v0.9.0 | aarch64 | 11992 / 16300 73.57% | 12969 / 16300 79.56% | 62.13 | 118 | 414 |
| v0.8.0 | x86_64 | 11979 / 16300 73.49% | 12954 / 16300 79.47% | 195.31 | 347 | 1224 |
| v0.8.0 | aarch64 | 11975 / 16300 73.47% | 12954 / 16300 79.47% | 80.64 | 146 | 586 |
Top1:整句首选即正确的比例;Top2:前两个候选中含正确结果的比例。v1.0.0 / v1.0.1 的准确率与耗时来自同一次生产模式运行(模型期限 100 ms);v0.9.1 及更早版本的准确率来自单独的确定性运行,耗时来自生产模式运行。v1.0.1 只修改了适配器的标点处理,引擎、模型和词库与 v1.0.0 相同。Mean、P95、Max 为引擎整句一次解码的耗时(ms),不代表逐键输入到候选显示的端到端延迟。
实际安装的输入法保留前台 100 ms、后台 120 ms 的模型期限。在限时条件下,x86_64 的长句此前少过 37 条首选、36 条前两位;这个结果保留在基准测试文档中,不因测试口径改变而视为已修复。
65000 个二至四字词案例保留输入位置之前已经上屏的文本,用于评估短词精确候选和上下文消歧。Contested 是同一拼音对应至少两个目标词的歧义子集。
| 版本 | 架构 | Top1 | Top2 | Contested Top1 | Contested Top2 | Mean (ms) | P50 (ms) | P95 (ms) | Max (ms) |
|---|---|---|---|---|---|---|---|---|---|
| v2.0.0 | x86_64 | 63364 / 65000 97.48% | 64292 / 65000 98.91% | 10533 / 11728 89.81% | 11244 / 11728 95.87% | 8.637 | 5 | 25 | 113 |
| v2.0.0 | aarch64 | 63361 / 65000 97.48% | 64291 / 65000 98.91% | 10532 / 11728 89.80% | 11244 / 11728 95.87% | 7.909 | 5 | 21 | 84 |
| v1.0.1 v1.0.0 |
x86_64 | 63036 / 65000 96.98% | 64104 / 65000 98.62% | 10491 / 11728 89.45% | 11196 / 11728 95.46% | 8.286 | 8 | 20 | 42 |
| v1.0.1 v1.0.0 |
aarch64 | 63038 / 65000 96.98% | 64104 / 65000 98.62% | 10489 / 11728 89.44% | 11197 / 11728 95.47% | 6.638 | 6 | 16 | 31 |
| v0.9.1 | x86_64 | 61971 / 65000 95.34% | 63568 / 65000 97.80% | 9675 / 11728 82.49% | 10776 / 11728 91.88% | 13.568 | — | 38 | 91 |
| v0.9.1 | aarch64 | 61975 / 65000 95.35% | 63568 / 65000 97.80% | 9677 / 11728 82.51% | 10776 / 11728 91.88% | 5.405 | — | 14 | 29 |
| v0.9.0 | x86_64 | 61971 / 65000 95.34% | 63568 / 65000 97.80% | 9675 / 11728 82.49% | 10776 / 11728 91.88% | 12.791 | 8 | 36 | 88 |
| v0.9.0 | aarch64 | 61975 / 65000 95.35% | 63568 / 65000 97.80% | 9677 / 11728 82.51% | 10776 / 11728 91.88% | 5.281 | 4 | 14 | 31 |
| v0.8.0 | x86_64 | 61860 / 65000 95.17% | 63549 / 65000 97.77% | 9596 / 11728 81.82% | 10775 / 11728 91.87% | 11.819 | 9 | 29 | 73 |
| v0.8.0 | aarch64 | 61860 / 65000 95.17% | 63549 / 65000 97.77% | 9596 / 11728 81.82% | 10775 / 11728 91.87% | 6.552 | 5 | 16 | 36 |
上表为带前文的结果;不带前文时,v2.0.0 在两种架构上均为 Top1 61173、Top2 63618。延迟为启用上下文轨道后的引擎单次完整查询耗时,不包含输入框架通信、候选面板绘制和真实按键间隔。表中“—”表示该版本未按相应口径公布这一项。
从固定短词语料构造 12831 个逐音节拼音前缀机会,读取候选窗实际显示的唯一补全方案,评估补全是否准确、能节省多少按键,以及继续输入时是否保持稳定。
| 版本 | 架构 | 补全命中率 | 平均节省按键 | 逐键稳定率 | 按键 P95 (ms) | 最终显示 P95 (ms) |
|---|---|---|---|---|---|---|
| v2.0.0 | x86_64 | 10456 / 12831 81.49% | 2.632 | 2131 / 2193 97.17% | 2.137 | 58.125 |
| v2.0.0 | aarch64 | 10458 / 12831 81.51% | 2.632 | 2133 / 2195 97.18% | 2.137 | 59.205 |
| v1.0.1 v1.0.0 |
x86_64 | 10336 / 12831 80.55% | 2.638 | 2123 / 2185 97.16% | 1.441 | 16.180 |
| v1.0.1 v1.0.0 |
aarch64 | 10336 / 12831 80.55% | 2.638 | 2122 / 2185 97.12% | 1.306 | 12.302 |
| v0.9.1 v0.9.0 |
x86_64 | 9420 / 12831 73.42% | 2.548 | 1691 / 1749 96.68% | 2 | 2 |
| v0.9.1 v0.9.0 |
aarch64 | 9420 / 12831 73.42% | 2.548 | 1691 / 1749 96.68% | 1 | 1 |
| v0.8.0 | x86_64 | 9420 / 12831 73.42% | 2.548 | 1691 / 1749 96.68% | 3 | 3 |
| v0.8.0 | aarch64 | 9420 / 12831 73.42% | 2.548 | 1691 / 1749 96.68% | 2 | 2 |
补全命中率按唯一参考目标严格统计;平均节省按键已扣除一次接受补全的按键。v2.0.0 的最终显示 P95 计入每次后台评估完成的耗时,即使提示没有改变;实际输入时,初始的词库提示不必等待后台完成。此前版本只在后台更换提示时计入这段耗时;v1.0.0 之前没有后台重排,两项延迟相同,计时精度为整数毫秒。均不包含候选面板绘制和实际按键间隔。
固定保留每条长句末尾四个完整拼音音节不输入,评估候选窗实际显示的唯一局部续写。正确结果必须扩展目标前缀,并且仍是参考句的前缀。
| 版本 | 架构 | 局部续写命中率 | 预测提示覆盖率 | 总节省按键 | P95 (ms) |
|---|---|---|---|---|---|
| v2.0.0 | x86_64 | 3766 / 16300 23.10% | 16121 / 16300 98.90% | 9271 | 251 |
| v2.0.0 | aarch64 | 3778 / 16300 23.18% | 16114 / 16300 98.86% | 9298 | 194 |
| v1.0.1 v1.0.0 |
x86_64 | 3514 / 16300 21.56% | 15814 / 16300 97.02% | 7479 | 196 |
| v1.0.1 v1.0.0 |
aarch64 | 3536 / 16300 21.69% | 15816 / 16300 97.03% | 7508 | 164 |
| v0.9.1 | x86_64 | 421 / 16300 (2.58%) | — | 977 | 277 |
| v0.9.1 | aarch64 | 423 / 16300 (2.60%) | — | 979 | 101 |
| v0.9.0 | x86_64 | 423 / 16300 (2.60%) | — | 979 | 244 |
| v0.9.0 | aarch64 | 423 / 16300 (2.60%) | — | 979 | 90 |
| v0.8.0 | x86_64 | 425 / 16300 (2.61%) | 6758 / 16300 41.46% | 987 | 286 |
| v0.8.0 | aarch64 | 425 / 16300 (2.61%) | 6770 / 16300 41.53% | 982 | 107 |
预测提示覆盖率表示出现预测补全的比例,并非提示准确率,不包含仅转换已输入拼音的词库拼接结果。该测试采用单参考答案评分,其他合理但不同于原文的续写仍计为未命中。v2.0.0 不限时等待每次评估完成,提示没有改变时的工作也计时;此前版本保留当时的生产后台期限(v1.0.0 起为 120 ms,此前为 50 ms),实际安装的输入法仍使用 120 ms。
从 v1.0.0 起,本项基准将相同位置的“他”和“她”视为等价。v0.9.1 及更早版本的斜体数字为严格区分二者的旧口径结果,不能与之后的结果直接比较;预测提示覆盖率与延迟不受影响。
下载与系统架构相符的 .deb,用 APT 安装就行。词库和语言模型都在包里,不用另外下载模型,也不用配置推理环境。SteamOS 等系统目录只读的环境,请用下方的用户目录安装。
用 dpkg --print-architecture 查看系统架构,下载对应的 .deb,再与发布页的 SHA256SUMS 核对。
运行下面的安装命令,依赖会一并处理。安装器会刷新当前的 IBus 和 Fcitx 5 会话,不用重启,也不用重新登录。
GNOME 下按 Super+Space,选择「Cassotis 言泉拼音输入法」;Fcitx 5 用户在配置工具中添加 Cassotis。输入 nihao 后按空格,就能打出「你好」。
arch="$(dpkg --print-architecture)" # amd64 或 arm64
package="cassotis-ime_2.0.0_${arch}.deb"
sha256sum "${package}"
sudo apt install "./${package}"
IBus:在 GNOME 桌面中,安装器会把 Cassotis 加入输入源列表,但不会切换当前输入源。安装时没有图形会话的话,下次登录后就能找到它。
Fcitx 5:先把桌面的输入法框架切换为 Fcitx 5,再从配置工具添加 Cassotis。用 Shift 在言泉里切换中英文时,不要再把 Shift 设成框架的输入法切换键。IBus 和 Fcitx 5 可以同时安装,但一个桌面会话只用其中一种。
设置与升级:设置可以从 GNOME 输入源中 Cassotis 的「首选项」或 Fcitx 5 配置工具打开,可以调整拼音方案、候选数量、翻页与补全按键和各项快捷键。旧版本用户用同样的命令安装新包就能升级,个人设置和学习记录都会保留,退役的旧模型文件会被删除。完整用法见配置说明。
卸载:运行 sudo apt remove cassotis-ime。卸载会保留个人设置和学习记录。
切换到桌面模式,下载与 uname -m 输出相符的便携包,Steam Deck 用 x86_64。在当前桌面用户的终端里解压、预检并安装,不要加 sudo 或 su,也不需要关闭系统只读保护。
arch="$(uname -m)" # x86_64 或 aarch64
archive="cassotis-ime-linux-2.0.0-${arch}.tar.gz"
sha256sum "${archive}"
tar -xzf "${archive}"
cd "cassotis-ime-linux-2.0.0-${arch}"
./install.sh --user --check &&
./install.sh --user
依赖与启用:桌面需已启用兼容的 IBus 或 Fcitx 5。预检不修改文件,也不会自动安装依赖,通过后才安装。程序放在 ~/.local/libexec/cassotis-ime,词库放在 ~/.local/share/cassotis-ime,不写入 /usr。安装后在当前框架中选择 Cassotis;列表没有刷新时,重启框架或重新登录。
升级与卸载:升级时解压新版便携包,以同一用户再次预检并安装;卸载用 ./uninstall.sh --user,同样不要加 sudo,用户词库和设置会保留。不要混用系统安装与用户目录安装。
两个框架都装了的话,可以在预检和安装命令里都加上 --framework ibus 或 --framework fcitx5。预检提示运行库不兼容时,需要用适配该发行版的构建,改用 root 解决不了。系统目录可写的其他发行版,也可以用 sudo ./install.sh 做系统安装。完整步骤见安装文档。
GNOME · Wayland · x86_64 / aarch64
两种架构上,安装包在 IBus / Fcitx 5、GTK 3 / 4、Wayland / XWayland 的八种组合中逐项验证了输入。KDE · X11 · IBus 1.5.32 · x86_64
用户目录安装、升级、卸载、设置和实际输入已验证,不需要写入系统目录。游戏模式和 SteamOS 上的 Fcitx 5 未验证。APT 安装
需满足运行库依赖;不同硬件、发行版和桌面环境的组合仍需分别验证。便携包预检或源码构建
便携包依赖系统运行库,不是通用静态包。先运行安装预检;运行库不兼容时,在对应系统中从源码构建。桌面和 SteamOS 的安装验证在 v2.0.0 开发期间完成,最终对齐 Windows v2.2.0 的安装包另经过引擎、框架适配器和打包检查,范围见兼容性文档。Chromium/Electron、混合 DPI 和 SteamOS 游戏模式不在验证范围内。遇到问题或者想提建议,欢迎到 GitHub 仓库来。
amd64 与 arm64 的 Debian 安装包约 290 MB,便携包约 365 MB,IBus 和 Fcitx 5 适配器、词库和语言模型都在里面,装上就能用,不用再下载或配置什么。旧版本用户直接安装新版就能升级,设置和学习记录都会保留。SteamOS 等只读系统请选便携包,按用户目录安装操作。