OmniType 是一个以 Rust 为核心的跨平台输入法项目,目标是在 Android、iOS/iPadOS、HarmonyOS、Windows、Linux 和 macOS 上复用同一套输入法核心。
当前阶段只做核心,不急着做平台壳。平台壳后续放在 platforms/ 目录下,只负责系统输入法框架接入、键盘面板、候选栏和文本提交;候选生成、词库查询、排序、分页、输入状态机都应该调用 Rust 核心。
- Rust workspace 已搭建;
- 支持基础词库加载;
- 已接入 AOSP PinyinIME 基础拼音词库;
- 支持英语和技术词种子词库;
- 支持候选词生成与频率排序;
- 支持用户选择频率加权雏形;
- 支持输入会话状态;
- 支持候选分页;
- 支持平台壳未来共用的输入事件模型;
- 支持拼音音节切分;
- 支持拼音前缀候选;
- 提供 CLI 用于调试核心引擎。
crates/
omnitype-cli/ 命令行调试入口
omnitype-config/ 核心配置结构
omnitype-core/ 输入会话、事件流、分页和提交状态
omnitype-dict/ 词库加载、精确查询和前缀查询
omnitype-engine/ 候选生成、排序、拼音切分和用户频率加权
omnitype-userdb/ 用户词库持久化
docs/ 架构和平台说明
shared/dictionaries/ 基础词库数据
third_party/ 第三方来源数据和授权文件
tools/dict-builder/ 词库构建工具
查询完整拼音:
cargo run -p omnitype-cli -- zhongguo查询拼音前缀:
cargo run -p omnitype-cli -- b查看分页候选:
cargo run -p omnitype-cli -- ba回放输入事件:
cargo run -p omnitype-cli -- --events next,select:1 ba指定外部词库文件:
cargo run -p omnitype-cli -- --dict shared/dictionaries/base.tsv nihao使用用户词库文件记录选词频率:
cargo run -p omnitype-cli -- --user-dict local-data/userdb.tsv --events select:2 nihao覆盖候选页大小:
cargo run -p omnitype-cli -- --page-size 5 ba当前基础词库位于:
shared/dictionaries/base.tsv
中文基础词库来自 AOSP PinyinIME,并保留在:
third_party/aosp-pinyinime/
词库格式为:
locale<TAB>reading<TAB>text<TAB>frequency<TAB>source
字段含义:
locale:语言或区域标识;reading:输入串,中文为无声调拼音,英语为小写输入形式;text:候选文本;frequency:基础频率,数值越大排序越靠前;source:数据来源,用于授权审计和重建。
修改 Rust 代码后至少运行:
cargo fmt --all
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo build --workspace我认为接下来仍然应该继续做核心,优先级如下:
-
用户词库持久化
- 当前已支持 TSV 文件加载和保存;
- 下一步应支持删除、降权、迁移和按平台目录自动选址;
- 后续可以再引入更紧凑的二进制格式。
-
简拼支持
- 支持
nh -> 你好、zg -> 中国; - 这会明显提升真实输入体验。
- 支持
-
更强的拼音切分
- 处理
xian这类多切分歧义; - 后续需要对不同切分路径打分。
- 处理
-
候选去重和排序策略优化
- 当前已有基础去重和频率排序;
- 后续需要综合基础词频、用户频率、候选长度、输入匹配质量。
-
核心 FFI 边界设计
- 为 Android、HarmonyOS、iOS、Windows、Linux、macOS 的平台壳准备稳定接口;
- 平台层不应直接依赖内部复杂结构。
-
词库构建流水线增强
- 记录词库生成版本、来源、授权和时间;
- 后续再考虑领域词库和临时学习词库。
见 AGENTS.md。本项目要求 Git 提交信息、代码注释、文档注释和脚本说明使用中文;协议字段、命令参数、crate 名称、API 名称和第三方项目名称可以保留英文。