一个自用的 Windows 输入法项目:打字时在候选栏后面显示另一种语言的释义,帮助语言学习。 底座是 rime/weasel(小狼毫) 的个人分支,外加一个自研的 PySide6 托盘设置应用。
- 上游 Weasel 的原始说明已原样保留 →
README-weasel.md- 哪些是我们的、哪些是开源的、各自什么许可 →
ATTRIBUTION.md- 每个目录归谁、版本号口径 →
REPO-STRUCTURE.md
输入拼音,候选栏每位候选后面跟一条目标语言释义(中→英 / 日 / 西)。
英语可以选**固定词典(CC-CEDICT,197,865 条)**或本地 QuickMT;日语和西班牙语使用 AI。两种来源不会自动互相回退。AI 释义在候选窗中只显示正文;词典释义默认带 〔en·词〕 标签,开启设置中的「简洁译注」后也只显示正文。下例使用简洁译注:
da zi
1. 打造 Build; Build up
2. 打字 Typing; Typography
3. 搭子 companion
…
| 归属 | 内容 |
|---|---|
| 上游 rime/weasel(GPL-3.0) | 整个 Windows 前端:TSF 输入法、常驻服务、候选窗、部署器、构建系统。仓库根目录绝大多数文件 |
| 上游 rime/librime(BSD-3-Clause) | librime/ —— 输入法引擎核心(submodule) |
| 我们写的 | settings-app/(设置应用)、tools/(构建与安装脚本)、patches/(librime 敏感域补丁等)、language-input/(译注功能的 schema / Lua / 词典清单)、RimeWithWeasel/LanguageInput*、本套文档 |
| 第三方数据/模型 | CC-CEDICT 词典(CC-BY-SA-4.0)、QuickMT 模型(CC-BY-4.0)、M2M100(MIT)—— NOTICE 见 language-input/licenses/ |
我们的改动可用
git log a57d7f0..HEAD精确区分(a57d7f0= 个人 fork 的基点)。
langInput/
├─ WeaselTSF/ WeaselServer/ WeaselUI/ WeaselIPC/ WeaselDeployer/ WeaselIME/ WeaselSetup/
│ ← 上游 Weasel(含我们的 language-input 改动)
├─ RimeWithWeasel/ ← librime 桥接 + 译注/AI 后端(我们改过)
├─ language-input/ ← 译注功能:Rime schema、Lua 过滤器、词典/模型清单、设计文档
├─ scripts/ ← 模型宿主 Python 源码 + 打包/评测脚本
├─ patches/ ← librime 敏感域补丁、Boost 补丁
├─ librime/ · plum/ ← submodule(官方 rime/librime、rime/plum)
├─ settings-app/ ← ★ 自研设置应用(PySide6)
│ ├─ src/language_input_settings/ · assets/ · packaging/ · docs/
├─ tools/ ← ★ 构建编排 / 模型宿主 / 引擎替换
├─ ATTRIBUTION.md · REPO-STRUCTURE.md · README-weasel.md
└─ third-party/ · deps/ · output/ · msbuild/ (已忽略:本地/构建产物)
GitHub Actions 的 Package Language Input 可以手动运行:在仓库的 Actions 页选择该工作流,点 Run workflow 并选 main。完成后从该次运行的 Artifacts 下载 LanguageInput-…-Windows;里面有单个安装程序、SHA256 校验和及说明。创建并推送 v1.0.0 这类标签会自动构建,并建立待审核的 GitHub Release 草稿;确认安装包后再发布草稿。
一个安装包包含小狼毫输入法、按需启动的本地翻译宿主和设置应用。 安装完成页默认勾选“打开 Language Input 设置”,开始菜单和小狼毫托盘的“输入法设定”也可打开新版设置。安装时可选择是否让设置应用开机最小化到托盘。QuickMT 模型权重不在安装包里,安装后从设置界面下载或导入。
引擎需要 Visual Studio(C++ 桌面)+ CMake + Boost;模型宿主/设置应用需要 Python 3.11。
git clone --recursive <repo> # 1. 取 librime / plum 子模块
git -C librime apply ../patches/librime-sensitive-mode.patch # 2. 打引擎补丁
.\build.bat release rime # 3. 构建 librime
.\build.bat release data opencc weasel # 4. 构建数据和小狼毫
.\tools\model-host\build.ps1 # 5. 重建模型宿主
.\settings-app\packaging\build.ps1 # 6. 打包设置应用
.\scripts\package_release.ps1 -Version 0.1.0 # 7. 暂存组件并生成同一个安装包“clone 就能编译”指源码齐全、步骤明确;引擎构建仍需要上述工具链。 本机已验证的路径是:复用已构建好的
librime(dist_x64\lib\rime.dll+rime.lib+ 头文件), 只单独编WeaselServer.exe,详见tools/engine/。
- 引擎:安装后由 TSF 自动挂载。模型宿主
LanguageInputModelHost.exe由WeaselServer.exe按需拉起,空闲 600 秒自动退出 —— 不需要常驻、不需要开机自启。 QuickMT 热请求 9 候选 p95 为 39–207ms;首次冷请求仍可能超过 1 秒(详见language-input/MODEL.zh-CN.md)。 - 设置应用:安装包中的
settings\LanguageInputSettings.exe(开始菜单,或托盘图标 → 设置窗口)- 若没有设置托盘图标,从开始菜单搜索 Language Input 设置;设置应用启动后才会出现它的托盘图标。
- 小狼毫托盘默认显示;用户若在
weasel.custom.yaml中设了patch: {"style/display_tray_icon": false},仍会隐藏小狼毫图标。此项与 GitHub 构建 YAML 中的false无关。 ⚠️ 首次运行 Windows 会把新托盘图标放进溢出区(点任务栏^才看得到),需手动拖到任务栏固定- 可选开机自启:
settings-app\packaging\autostart.ps1 -Enable
- 引擎二进制替换(改了 C++ 之后):
tools\engine\apply-weaselserver.ps1(备份 + 提权替换 + 重启)
| 文档 | 回答什么问题 |
|---|---|
ATTRIBUTION.md |
哪些是我们的、哪些是开源的、各自什么许可 |
REPO-STRUCTURE.md |
每个目录归谁、构建顺序、版本号口径、与个人 fork 的关系 |
README-weasel.md |
上游 Weasel 的原始说明 |
settings-app/README.md |
设置应用怎么用、怎么打包、CLI 有哪些命令 |
settings-app/docs/2026-09-20-…-design.md |
设置应用的完整设计 + 三轮独立审阅记录 + 风险表 |
settings-app/docs/ENGINE.md |
引擎溯源、已实测的引擎行为、冻结二进制哈希 |
settings-app/docs/MODEL-HOST-LIFECYCLE.md |
模型服务何时起/退、实测延迟、"每次请求重算哈希"的发现与修复 |
tools/model-host/README.md |
模型宿主的构建/安装/回滚 + A/B 证据 |
language-input/README.zh-CN.md |
译注功能本身的说明(schema / 词典 / 模型包) |
个人自用、持续开发中。完整的风险与未验证项清单见
settings-app/docs/2026-09-20-…-design.md 的 §11 / §13。要点:
- 模型权重不在仓库(每个约 400MB);内网无外网时需手动导入
.limodel。 - M2M100 不随仓库分发;现有安装仍可兼容运行,但冷请求实测超过 1 秒,不作为打字场景推荐模型。
- 设置应用里"从 HF 下载"的能力已通过真实端到端验证:下载
quickmt-zh-en全部 409MB → 装进沙盒模型根 → 被冻结宿主接受 → 篡改一字节被拒绝。实测 209 秒 / 409MB(≈2MB/s);链路抖动时靠自动重试 + 断点续传自愈(单次尝试会在 ~70MB 处断掉,这是修复前的实测行为)。 - 设置界面中的"词频列表"是有意不做的(LevelDB 无法在纯 Python 下安全读取)。
本仓库含 GPL-3.0(Weasel)代码,整体按 GPL-3.0 提供源码。第三方组件的许可与署名要求见
ATTRIBUTION.md。