代码全部公开
源码、词库和构建脚本都在仓库里。不放心的话,可以自己读一遍,或者干脆自己编译一份来用。
言泉是一个开源的 Windows 拼音输入法。没有广告,不捆绑软件, 也不会上传你的输入记录——词库、设置和学习数据都只存在本机。 代码全部公开,它做了什么,你随时可以查证。
代码、词库、构建脚本都在 GitHub 上,任何人都能查看,也能自己编译。
输入内容全部在本机处理,没有云端联想,也没有遥测上报。
安装时不带别的软件,不改浏览器首页,卸载后不留东西。
功能不求多,但每一项行为都摆在明处。
源码、词库和构建脚本都在仓库里。不放心的话,可以自己读一遍,或者干脆自己编译一份来用。
没有捆绑安装,没有弹窗和推送,也不会动你的浏览器和系统设置。它只做输入法该做的事。
所有处理都在本地完成,不联网也照常工作。你打过的字,只有你自己知道。
基于 TSF(文本服务框架)开发,同时支持 64 位和 32 位程序,在 Windows 10 和 11 上原生运行,并针对部分旧式应用和游戏补充兼容注册与候选窗定位回退。候选窗口适配高分屏和多显示器,常用切换快捷键可以自行设置;首次切换时先提供基础候选,再在后台接入完整模型,避免冷启动拖慢或影响当前应用。
你常打的词会排得越来越靠前,刚上屏的前文也会用于调整候选顺序。v1.20.0 还能在安全可读的编辑窗口中参考光标前的文档内容,为当前文档反复出现的术语、人名和相邻表达提供有限加分;临时缓存按文档隔离,只留在内存中,密码框和受保护区域不会读取。不管是全拼、简拼、混着打,还是分几段确认出来的词组,它都记得住;本地学习数据也可以在设置中一键清空。
除了全拼,还内置六种双拼:微软、小鹤、自然码、搜狗、紫光和拼音加加,并可分别启用 11 组常见声母、韵母模糊规则。不管用哪种方案,简繁词库、候选排序和学习数据都是同一套;长句还没打完时,词库里对得上的词和单字也会继续留在候选里。
言泉原创设计了候选窗一键补全:输入至少两个完整音节后,底部会在证据足够明确时只给出一个续写方案,可用 Tab 或反引号直接接受。短词补全会结合用户偏好、已上屏前文、词库流行度和语料转移证据,从内部多条方案中选出一个;长句在末尾形成稳定词锚点时,也可由受词库约束的本地模型补出一小段可靠后续。方向不明确时宁可不提示,学习结果只用于补全,不会改变普通用户词和单字权重。
现在的输入法功能越来越多,但很多人想要的其实很简单:
打字准一点,别弹广告,别偷偷传数据。
言泉就是照着这个想法做的。
同样的拼音可以拆出很多种结果:yanquan 是「言泉」,也可以是「眼圈」「烟圈」。 句子越长,可能的组合越多,引擎要在几十条路径里挑出你想说的那条。 这部分工作完全在本地完成,历次版本的改进可以概括为四个阶段。
第一阶段是统计语言模型。v1.1.0 引入用语料训练的本地统计模型,除单个词的词频外, 还建模词与词、字与字之间的接续关系;v1.2.0 扩展字符语言模型,使其更早参与长句路径保留和完整候选排序。
第二阶段引入神经网络复核。v1.3.0 加入首个可部署的神经残差重排器:先由原有引擎生成完整候选, 再由微型神经网络复核一遍;v1.4.0 将这套离线训练能力扩展到短词,v1.5.0 又为长句和短词上下文排序加入独立的残差复核阶段,只在新候选优势足够明确时才调整顺序。
第三阶段让模型进入搜索和最终裁决。v1.6.0 首次将训练模型前移到长句路径搜索;v1.9.0 建立结构多样的完整候选池,并用语言模型、N-best 共识和残差信号统一复核;v1.13.0 以后进一步加入双向精确词锚定、高置信词库边保留、上下文差异感知排序和统一最终裁决, 让模型既能保住容易被切碎的合理路径,也能谨慎处理长句、短词和一键补全中的真实竞争候选。
第四阶段从 v1.18.0 开始,引入受约束的运行时 Transformer。拼音对齐模型只在长句基础排序存在明显歧义时复核内部完整候选; v1.19.0 又把拼音条件序列评分器接入最终裁决,并扩展长句一键补全的多级后缀召回。v1.20.0 进一步从“复核已有候选”走向“受约束地补充候选”: 直接拼音模型可以生成严格对齐、能由词库词组成的完整路径,局部续写模型则在静态索引不明确时补充一至三个词的短后续;文档级临时上下文也为当前文档中的术语和接续关系提供有限加分。 所有新结果仍要经过统一排序与置信门控,证据不足时主动弃权,不取代原有词库、搜索和用户学习。短词一键补全则将 nc-gpt 的离线判断蒸馏为静态先验,运行时不加载大模型。 详细改动见各版本发布说明。
所有模型都在发布前完成训练:先从清洗后的中文语料学习词与词、字与字的接续规律,再以词库实际能生成的候选做对比训练,得到长句多阶段模型、短词重排器、直接拼音候选生成器和受约束的局部续写模型。训练产物不保存语料原文,基准测试语料也不参与训练。
全部模型随安装包一并提供:统计先验写入本地 SQLite 词库,大部分紧凑重排器转换为引擎原生参数;需要神经复核的长句排序和局部续写采用量化 ONNX 模型,由外部 Host 进程加载。无需另装模型或推理环境,使用时也不联网、不下载数据。
长句先在受控搜索中保留高置信词库词和结构多样的完整路径,直接拼音模型只在需要时补充严格对齐的候选,再由统计模型、N-best 共识、残差模型和歧义门控的 Transformer 统一复核;短词按有无前文进入各自独立的排序路径。模型证据不足时不强行改动,仍按精确匹配、词频和用户学习顺序给出候选。
大部分排序模型仍是引擎内的原生计算;需要 ONNX 推理的可选模型只在外部 Host 进程中使用随安装包提供的 ONNX Runtime, 后台加载、仅用 CPU,未就绪或推理失败时立即沿用原有结果。运行时不会启动 PyTorch 或外部模型服务,照旧不联网、不需要 GPU。 以下各套基准测试的语料都与训练数据隔离,成绩里没有「背题」的水分。
长句、短词与一键补全测试语料都取材于开发者自己的小说《永恒的舞动》, 并与模型训练数据保持隔离。测试方法、案例构造和指标定义见 BENCHMARK.CN.md。
从 v1.11.0 起,同一位置的“他”和“她”按拼音输入无法区分,基准测试将二者视为等价;表中斜体数字为严格区分二者的旧口径结果。 后续版本统一使用新口径,不再重复公布旧口径数据。
对 16300 条长句一次性设置完整拼音,检查完整候选的准确率与引擎解码耗时。
| 版本 | Top1 | Top2 | Mean (ms) | P95 (ms) | Max (ms) |
|---|---|---|---|---|---|
| v1.20.0 | 11065 / 16300 67.88% | 12376 / 16300 75.93% | 59.53 | 110 | 406 |
| v1.19.0 | 10917 / 16300 66.98% | 12248 / 16300 75.14% | 55.99 | 94 | 437 |
| v1.18.0 | 10731 / 16300 65.83% | 12128 / 16300 74.40% | 51.78 | 93 | 454 |
| v1.17.0 | 10595 / 16300 65.00% | 12023 / 16300 73.76% | 42.68 | 78 | 406 |
| v1.16.0 v1.15.0 |
10553 / 16300 64.74% | 11921 / 16300 73.13% | 41.5 | 78 | 484 |
| v1.14.0 | 10345 / 16300 63.47% | 11903 / 16300 73.02% | 58.78 | 172 | 766 |
| v1.13.0 | 10131 / 16300 62.15% | 11320 / 16300 69.45% | 65.94 | 203 | 1047 |
| v1.12.0 | 9767 / 16300 59.92% | 10996 / 16300 67.46% | 63.03 | 187 | 1062 |
| v1.11.0 |
9760 / 16300 59.88% 旧口径 9340 / 16300(57.30%) |
10990 / 16300 67.42% 旧口径 10773 / 16300(66.09%) |
59.82 | 187 | 1031 |
| v1.10.0 | 9279 / 16300 56.93% | 10708 / 16300 65.69% | 60.39 | 188 | 1046 |
| v1.9.0 | 9121 / 16300 55.96% | 10685 / 16300 65.55% | 59.65 | 187 | 1172 |
| v1.8.1 | 8285 / 16300 50.83% | 9067 / 16300 55.63% | 72.44 | 281 | 1594 |
| v1.7.0 | 7940 / 16300 48.71% | 8642 / 16300 53.02% | 71.55 | 235 | 2047 |
| v1.6.0 | 7936 / 16300 48.69% | 8637 / 16300 52.99% | 66.99 | 219 | 1687 |
| v1.5.0 | 7459 / 16300 45.76% | 7966 / 16300 48.87% | 63.42 | 203 | 2140 |
| v1.4.0 | 7168 / 16300 43.98% | 7617 / 16300 46.73% | 66.23 | 218 | 2578 |
| v1.3.0 | 7155 / 16300 43.90% | 7601 / 16300 46.63% | 64.54 | 203 | 2188 |
| v1.2.0 | 6895 / 16300 42.30% | 7303 / 16300 44.80% | 59.89 | 188 | 2078 |
| v1.1.0 | 6677 / 16300 40.96% | 7067 / 16300 43.36% | 73.18 | 234 | 2750 |
| v1.0.0 | 6106 / 16300 37.46% | 6857 / 16300 42.07% | 71.49 | 219 | 5344 |
| v0.8.5 | 6097 / 16300 37.40% | 6847 / 16300 42.01% | 520.05 | 1203 | 13297 |
| v0.7.0 | 5368 / 16300 32.93% | 6110 / 16300 37.48% | — | — | — |
| v0.6.0 | 4905 / 16300 30.09% | 5378 / 16300 32.99% | — | — | — |
| v0.5.0 | 4834 / 16300 29.66% | 5243 / 16300 32.17% | — | — | — |
| v0.4.0 | 4371 / 16300 26.82% | 4744 / 16300 29.10% | — | — | — |
| v0.3.1 | 3845 / 16300 23.59% | 4651 / 16300 28.53% | — | — | — |
| v0.2.0 | 2671 / 16300 16.39% | 2863 / 16300 17.56% | — | — | — |
Top1:整句首选即正确的比例;Top2:前两个候选中含正确结果的比例。Mean、P95、Max 为引擎整句直设解码耗时(ms),不代表逐键输入到候选窗口显示的端到端延迟。
65000 个二至四字词案例保留输入位置之前已经上屏的文本,用于评估短词精确候选和上下文消歧。 Contested 是同一拼音对应至少两个目标词的歧义子集。
| 版本 | Top1 | Top2 | Contested Top1 | Contested Top2 | Mean (ms) | P50 (ms) | P95 (ms) | Max (ms) |
|---|---|---|---|---|---|---|---|---|
| v1.20.0 v1.19.0 v1.18.0 |
61827 / 65000 95.12% | 63517 / 65000 97.72% | 9596 / 11728 81.82% | 10775 / 11728 91.87% | 4.584 | 3.985 | 9.653 | 39.36 |
| v1.17.0 v1.16.0 v1.15.0 |
61827 / 65000 95.12% | 63516 / 65000 97.72% | 9596 / 11728 81.82% | 10775 / 11728 91.87% | 3.817 | 3.239 | 8.376 | 39.881 |
| v1.14.0 | 61782 / 65000 95.05% | 63516 / 65000 97.72% | 9560 / 11728 81.51% | 10775 / 11728 91.87% | 3.998 | 3.132 | 8.665 | 68.147 |
| v1.13.0 | 61515 / 65000 94.64% | 63516 / 65000 97.72% | 9384 / 11728 80.01% | 10775 / 11728 91.87% | 4.748 | 3.652 | 10.337 | 103.689 |
| v1.12.0 | 61343 / 65000 94.37% | 63474 / 65000 97.65% | 9304 / 11728 79.33% | 10745 / 11728 91.62% | 4.400 | 3.417 | 9.462 | 104.316 |
| v1.11.0 |
61343 / 65000 94.37% 旧口径 61227 / 65000(94.20%) |
63474 / 65000 97.65% 旧口径 63461 / 65000(97.63%) |
9304 / 11728 79.33% 旧口径 9191 / 11728(78.37%) |
10745 / 11728 91.62% 旧口径 10732 / 11728(91.51%) |
4.217 | 3.284 | 9.110 | 75.503 |
| v1.10.0 | 61214 / 65000 94.18% | 63448 / 65000 97.61% | 9191 / 11728 78.37% | 10732 / 11728 91.51% | 4.425 | 3.446 | 9.591 | 84.68 |
| v1.9.0 | 61215 / 65000 94.18% | 63448 / 65000 97.61% | 9191 / 11728 78.37% | 10732 / 11728 91.51% | 4.214 | 3.268 | 9.113 | 71.004 |
| v1.8.1 | 61206 / 65000 94.16% | 63430 / 65000 97.58% | 9182 / 11728 78.29% | 10725 / 11728 91.45% | 4.85 | 3.721 | 10.413 | 107.714 |
| v1.7.0 | 61053 / 65000 93.93% | 63424 / 65000 97.58% | 9154 / 11728 78.05% | 10723 / 11728 91.43% | 4.668 | 3.468 | 10.013 | 158.471 |
| v1.6.0 | 61043 / 65000 93.91% | 63414 / 65000 97.56% | 9154 / 11728 78.05% | 10723 / 11728 91.43% | 4.455 | 3.295 | 9.580 | 160.817 |
| v1.5.0 | 61045 / 65000 93.92% | 63364 / 65000 97.48% | 9159 / 11728 78.10% | 10677 / 11728 91.04% | 5.033 | 4.113 | 9.968 | 142.372 |
| v1.4.0 | 60676 / 65000 93.35% | 63251 / 65000 97.31% | 8993 / 11728 76.68% | 10602 / 11728 90.40% | 5.573 | 4.521 | 11.157 | 158.687 |
| v1.3.0 | 59078 / 65000 90.89% | 62881 / 65000 96.74% | 8326 / 11728 70.99% | 10386 / 11728 88.56% | 5.460 | 4.396 | 10.939 | 176.912 |
延迟为启用上下文轨道后的引擎单次完整查询耗时,不包含 TSF 调用、候选窗口渲染和真实按键间隔。
从固定短词语料构造 12831 个逐音节拼音前缀机会,读取候选窗实际显示的唯一补全方案,评估补全是否准确、能节省多少按键,以及继续输入时是否保持稳定。
| 版本 | 补全命中率 | 平均节省按键 | 逐键稳定率 | P95 (ms) |
|---|---|---|---|---|
| v1.20.0 v1.19.0 v1.18.0 |
9419 / 12831 73.41% | 2.549 | 1691 / 1749 96.68% | 2.026 |
| v1.17.0 | 9273 / 12831 72.27% | 2.554 | 1652 / 1718 96.16% | 1.880 |
| v1.16.0 | 8752 / 12831 68.21% | 2.570 | 1649 / 1676 98.39% | 1.509 |
| v1.15.0 | 7265 / 12831 56.62% | 2.542 | 1278 / 1323 96.60% | 0.777 |
补全命中率按唯一参考目标严格统计;平均节省按键已扣除一次接受补全的按键。P95 只统计本地补全查询与排序耗时,不包含候选窗口渲染和实际按键间隔。
固定保留每条长句末尾四个完整拼音音节不输入,评估候选窗实际显示的唯一局部续写。正确结果必须扩展目标前缀,并且仍是参考句的前缀。
| 版本 | 局部续写命中率 | 提示覆盖率 | 总节省按键 | P95 (ms) |
|---|---|---|---|---|
| v1.20.0 | 357 / 16300 2.19% | 6475 / 16300 39.72% | 861 | 42.672 |
| v1.19.0 | 202 / 16300 1.24% | 3834 / 16300 23.52% | 571 | 38.452 |
| v1.18.0 | 143 / 16300 0.88% | 3957 / 16300 24.28% | 478 | 40.329 |
该测试采用单参考答案评分,其他合理但不同于原文的续写仍计为未命中。v1.17.0 与 v1.16.0 使用旧的整句严格命中口径,仅保留为历史结果,不能与当前局部续写口径直接比较。
Cassotis 是古希腊德尔斐(Delphi)神庙旁的一眼圣泉。 传说女祭司皮媞亚在颁布神谕之前,会先饮下这眼泉水, 人们相信预言便是从这泉中来的。
这个名字里还藏着一点巧合:言泉是用 Delphi 语言写的。泉眼与工具,恰好同出一地。
中文名取自「言如泉涌」——话语像泉水一样自然涌出,不必费力。 做输入法,想达到的也就是这种状态:想到什么,打出来就是什么。
一个是预言之泉,一个是言语之泉,说的其实是同一件事。
项目还在早期,更新比较频繁。
想跟进进展或者提建议,欢迎到 GitHub 仓库来。
Windows 10 / 11 x64 安装包,装上就能用:TSF 服务自动注册,词库自动初始化, 不用再配置什么。旧版本用户直接运行新版安装包就能升级,不用先卸载;安装程序会检查并替换仍在运行的旧版后台进程,并同步更新随包模型和推理组件。