Windows 10 / 11 · TSF 原生 · GPL-3.0 开源

言如泉涌,
数据留在自己手里。

言泉是一个开源的 Windows 拼音输入法。没有广告,不捆绑软件, 也不会上传你的输入记录——词库、设置和学习数据都只存在本机。 代码全部公开,它做了什么,你随时可以查证。

Cassotis IME 状态浮窗与候选列表截图
状态浮窗与候选列表:输入状态、拼音方案和候选配色,一目了然。

开源

代码、词库、构建脚本都在 GitHub 上,任何人都能查看,也能自己编译。

本地

输入内容全部在本机处理,没有云端联想,也没有遥测上报。

干净

安装时不带别的软件,不改浏览器首页,卸载后不留东西。

它做了什么,没做什么

功能不求多,但每一项行为都摆在明处。

01

代码全部公开

源码、词库和构建脚本都在仓库里。不放心的话,可以自己读一遍,或者干脆自己编译一份来用。

02

不带多余的东西

没有捆绑安装,没有弹窗和推送,也不会动你的浏览器和系统设置。它只做输入法该做的事。

03

输入内容不出本机

所有处理都在本地完成,不联网也照常工作。你打过的字,只有你自己知道。

04

Windows 原生集成

基于 TSF(文本服务框架)开发,同时支持 64 位和 32 位程序,在 Windows 10 和 11 上原生运行。候选窗口适配高分屏和多显示器,常用切换快捷键可以自行设置;输入法激活和冷启动尽量在独立后台进程中完成,避免拖慢或影响当前应用。

05

越用越顺手

你常打的词会排得越来越靠前,刚上屏的前文它也会看在眼里,用来调整候选顺序。不管是全拼、简拼、混着打,还是分几段确认出来的词组,它都记得住。这些学习数据只存在本机,设置里一键就能清空。

06

全拼、双拼与模糊拼音

除了全拼,还内置六种双拼:微软、小鹤、自然码、搜狗、紫光和拼音加加,并可分别启用 11 组常见声母、韵母模糊规则。不管用哪种方案,简繁词库、候选排序和学习数据都是同一套;长句还没打完时,词库里对得上的词和单字也会继续留在候选里。

现在的输入法功能越来越多,但很多人想要的其实很简单: 打字准一点,别弹广告,别偷偷传数据。
言泉就是照着这个想法做的。

长句和短词是怎么变准的

同样的拼音可以拆出很多种结果:yanquan 是「言泉」,也可以是「眼圈」「烟圈」。 句子越长,可能的组合越多,引擎要在几十条路径里挑出你想说的那条。 这部分工作完全在本地完成,历次版本的改进大致分三个阶段。

第一阶段是统计语言模型。v1.1.0 引入用语料训练的本地统计模型,除单个词的词频外, 还建模词与词、字与字之间的接续关系;v1.2.0 扩展字符语言模型,使其更早参与长句路径保留和完整候选排序。

第二阶段引入神经网络复核。v1.3.0 加入首个可部署的神经残差重排器:先由原有引擎生成完整候选, 再由微型神经网络复核一遍;v1.4.0 将这套离线训练能力扩展到短词,v1.5.0 又为长句和短词上下文排序加入独立的残差复核阶段,只在新候选优势足够明确时才调整顺序。

第三阶段让模型进入搜索过程本身。v1.6.0 把模型前移到长句路径搜索,由第二阶段和最终候选模型逐级复核, 并复用中间计算控制延迟;v1.7.0 依据语料训练的词路径转移证据识别四音节输入中的双词组合, 只有两段都是完整词库词且接续证据足够强时才生成完整候选,词组前缀和单字选择保持不变;v1.8.0 为完整长句增加成对比较、局部差异和最终可见候选的残差复核,并为没有可用前文的短词建立独立排序, 模型证据不足时仍以高置信度的精确匹配为准;v1.9.0 将多种完整路径汇入统一候选池, 再结合语言模型、N-best 共识和残差信号统一复核;v1.10.0 将语料转移证据扩展到三音节 1+2 / 2+1 精确词组合,并为长句首两项加入保守复核;v1.11.0 进一步利用小说、聊天和大规模中文语料训练转移证据, 覆盖 1+2、2+1、2+2、2+3 和 3+2 精确词组合;v1.12.0 又将语料证据扩展到受控的 1+1 单字组合, 只保留具有多来源支持和常用读音的结果,词库精确匹配仍然优先,在长句中则只用于区分分数接近的路径;v1.13.0 加入双向精确词锚定的长句路径恢复和短词上下文差异感知重排,结合正反向语言模型与更长的已上屏前文,只在证据明确时调整真正存在竞争的候选。 详细改动见各版本发布说明

01

发布前:分阶段离线训练

所有模型都在发布前完成训练:先从清洗后的中文语料学习词与词、字与字的接续规律,再以词库实际能生成的候选做对比训练,得到长句多阶段模型和短词的两类重排器(带前文与不带前文)。训练产物不保存语料原文,基准测试语料也不参与训练。

02

安装时:轻量本地部署

全部模型随安装包一并提供:统计模型量化后写入本地 SQLite 词库,神经重排器转换为编译进引擎的原生参数。无需另装模型运行环境,使用时也不联网、不下载数据。

03

打字时:分轨本地排序

长句先保留结构多样的完整路径,再由统计模型、N-best 共识和残差模型统一复核;短词按有无前文进入各自独立的排序路径。模型证据不足时不强行改动,仍按精确匹配、词频和用户学习顺序给出候选。

长句多阶段模型与两类短词重排器均已转换为引擎内的原生计算,不会启动 PyTorch、ONNX 或任何外部模型服务,照旧不联网、不需要 GPU。下面两套基准测试的语料都与训练数据隔离,成绩里没有「背题」的水分。

基准测试

长句与短词测试语料都取材于开发者自己的小说《永恒的舞动》, 并与模型训练数据保持隔离。测试方法、案例构造和指标定义见 BENCHMARK.CN.md

从 v1.11.0 起,同一位置的“他”和“她”按拼音输入无法区分,基准测试将二者视为等价;表中斜体数字为严格区分二者的旧口径结果。 后续版本统一使用新口径,不再重复公布旧口径数据。

长句基准测试-16300

对 16300 条长句一次性设置完整拼音,检查完整候选的准确率与引擎解码耗时。

版本 Top1 Top2 Mean (ms) P95 (ms) Max (ms)
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

65000 个二至四字词案例保留输入位置之前已经上屏的文本,用于评估短词精确候选和上下文消歧。 Contested 是同一拼音对应至少两个目标词的歧义子集。

版本 Top1 Top2 Contested Top1 Contested Top2 Mean (ms) P50 (ms) P95 (ms) Max (ms)
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 调用、候选窗口渲染和真实按键间隔。

名字的由来

Cassotis

Cassotis 是古希腊德尔斐(Delphi)神庙旁的一眼圣泉。 传说女祭司皮媞亚在颁布神谕之前,会先饮下这眼泉水, 人们相信预言便是从这泉中来的。

这个名字里还藏着一点巧合:言泉是用 Delphi 语言写的。泉眼与工具,恰好同出一地。

言泉

中文名取自「言如泉涌」——话语像泉水一样自然涌出,不必费力。 做输入法,想达到的也就是这种状态:想到什么,打出来就是什么。

一个是预言之泉,一个是言语之泉,说的其实是同一件事。

开发计划

项目还在早期,更新比较频繁。

正在做的

  • 继续训练本地语言模型和紧凑重排器,提高长句与短词上下文准确率
  • 扩充词库覆盖,打磨简体、繁体两套词库
  • 让本地学习的结果更容易查看和管理
  • 在更多编辑器、浏览器和 IDE 里测试兼容性

之后想做的

  • 更细分领域的专业词库
  • 扩充独立基准,弄清各类出错的原因,再校准模型门槛和回退策略
  • 强化用户词库的质量控制和配套工具
  • 保持项目能被任何人检查、构建和接手维护

想跟进进展或者提建议,欢迎到 GitHub 仓库来。

下载安装

Windows 10 / 11 x64 安装包,装上就能用:TSF 服务自动注册,词库自动初始化, 不用再配置什么。旧版本用户直接运行新版安装包就能升级,不用先卸载;安装程序会检查并替换仍在运行的旧版后台进程。