Skip to content

[windows][android][vocab] 词典手改学习仅 macOS:扩展宿主观察与替代入库 #1127

Description

@HKLHaoBin

背景

词典「自动添加」不是随使用默默攒词,而是:

听写成功落字 →(可选)短时观察目标 App 内对手改 → 建议卡确认 → 写入词典(note = 从手改中自动收集)。

今日完整宿主手改观察 仅 macOS AX。watch_for_edits 在非 macOS 直接返回 None。Windows / Android 上「自动添加」筛选会长期为空,与 README「dictionary that learns」的产品叙述不对齐(文案已写 macOS-only,但 Win/Android 用户仍会看到空的「自动添加」筛选项)。

现状(源码)

环节 现状
Core arm_edit_observation + EditObservationAdapter + PendingCorrection + accept_pending_correction 已抽象
macOS AX 手改观察约 60s;需 cursor_context_enabled;确认卡约 10s
Windows host_document 明确无 UIA;watch_for_edits → None
Android 无障碍服务已有,但只做粘贴焦点缓存 / 键盘悬浮窗,不做 baseline diff;IME「编辑结果」勾选加词已存在,未统一到「自动添加」筛选语义
Linux egui Noop(L02)

锚点:host_document/mod.rs、macos.rs、api.rs(arm_edit_observation)、VocabSuggestionCard.tsx、OpenLessAccessibilityService.kt、OpenLessImeService 编辑结果流程、native_bridge.rs spawn_add_vocabulary_word。

目标

  1. Windows / Android 尽量复现「落字后短时观察宿主改词 → 建议 → 确认入库」。
  2. 宿主观察不可行或覆盖不到时,提供 不依赖读宿主 的替代入库,仍走确认,不静默加词。
  3. 保持与 macOS 相同的隐私红线:密码框不读、可关、确认前不入库。

方案摘要(调研)

A. 宿主观察(对齐 macOS)

Windows(主候选)

  • UI Automation:焦点 Edit 订 UIA_Text_TextChangedEventId(可加 Value 变更),读 Text/Value,复用 minimal_edit / is_vocab_worthy。
  • 密码:UIA_IsPasswordPropertyId 跳过。
  • 风险:不能假设所有 provider 发全套事件;Chrome / Electron / Office / 自定义控件覆盖面需真机矩阵。
  • 不推荐:TSF 作通用 60s 观察;进程注入;全局钩子。

Android(主候选)

  • 扩展现有 OpenLessAccessibilityService:武装窗口内处理 TYPE_VIEW_TEXT_CHANGED(beforeText / getText)→ Core queue_pending_correction。
  • 补强:API 33+ Accessibility getSurroundingText。
  • IME 用户:强化已有「编辑结果 → 勾选加词典」,统一 LEARNED_VOCAB_NOTE。
  • 不推荐:截屏 OCR、无节制全文轮询。

两边继续接 EditObservationAdapter,失败则学不到、不阻断主链路。

B. 看不到宿主改词时的替代

路径 说明
ASR 原文 ↔ 润色 diff 跨平台易做;学的是模型改写,须过滤 + 确认
历史页内编辑 信号明确,不依赖辅助功能
选区语音改写前后 保真度高
Android IME 编辑结果加词 已实现,统一 note 即可
显式「记住刚才的词」 兜底

建议优先级:选区/IME(有则用)→ 历史编辑 → ASR–润色 diff(严过滤)→ 显式入口。

产品开放点(需先定)

  1. 开关拆分:今日 cursor_context_enabled 同时管「读上下文给 LLM」与「手改观察」。Win 用户是否允许「只学词、不上传光标上下文」?
  2. Android 确认 UI:无桌面胶囊时,建议卡放 overlay / IME 条 / 其它?
  3. 纠正规则:accept_pending_correction 目前只写词典,不写 RuleSource::Learned;Corrections 页 learned 筛选基本空置——是否另开?
  4. 能力文案:设置 / README 是否改为「支持的平台」并写清 Win/Android 实验范围与覆盖缺口?

接受标准(草案)

阶段 1 — 设计拍板

  • 决定:做宿主观察 / 只做替代路径 / 两者分阶段
  • 决定:光标上下文与手改学词是否拆 pref
  • 隐私披露文案(无障碍 / UIA 读文本变更的范围与可关性)

阶段 2 — Windows 宿主观察(若做)

  • EditObservationAdapter Windows 实现(UIA),60s / 失焦 disarm,generation 屏障
  • 密码与敏感进程闸门
  • 至少 Notepad + 一种浏览器/Office 真机证据:改词 → 建议卡 → 确认 → 「自动添加」可见
  • 观察失败不阻断听写

阶段 3 — Android

  • 无障碍限时文本变更 → PendingCorrection(需无障碍的用户)
  • IME 编辑加词统一 LEARNED_VOCAB_NOTE / 词典筛选
  • 确认 UI 可用且 10s 级 TTL 与桌面语义一致

阶段 4 — 替代路径(可选并行)

  • 至少一条不依赖宿主观察的确认入库路径在 Win+Android 可用

非目标

  • 静默自动入库
  • 进程注入 / 全局键盘日志 / 截屏 OCR 学词
  • 本 issue 不要求 Linux egui 同期交付(现网 L02 Noop)

参考

  • README:dictionary learns + cursor context macOS-only
  • Microsoft:Edit control TextChanged / UIA events overview
  • Android:TYPE_VIEW_TEXT_CHANGED、canRetrieveWindowContent
  • 本地调研草稿(若合入可链 docs):docs/win-android-vocab-auto-add-research.md

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions