Skip to content

Open Voice Input Linux v0.1.0-alpha.8

Pre-release
Pre-release

Choose a tag to compare

@SidUParis SidUParis released this 01 Sep 22:37
· 2 commits to main since this release
Immutable release. Only release title and notes can be modified.
v0.1.0-alpha.8
7a86ac5

Open Voice Input Linux v0.1.0-alpha.8

面向 Ubuntu / IBus 用户的公开技术预览:默认仍把实时识别通过 IBus 直接送到当前光标;只有用户明确启用远程桌面目标时,才把一条已经完成的终稿写入本机剪贴板,等待用户自己确认远端输入框并手动粘贴。

alpha.8 为 Remmina/RDP 等无法接收本机 IBus preedit 的画布增加了一条明确、默认关闭的兼容路径。它不是自动粘贴,也不是远端输入法桥接:没有 partial、没有自动 Ctrl+V、没有模拟按键,也不会猜测远端焦点。缺少新配置时仍使用原生光标模式,升级不会静默改变交付位置。

这次更新

  • 原生光标仍是默认路径:缺少私有 output-target.json 时选择 caret。它继续使用 IBus focus token、private-purpose 检查、实时 preedit 和 final-once 提交;默认路径不读取或写入剪贴板。
  • 远程桌面终稿复制是明确 opt-in:在设置的“远程桌面”页选择“同步剪贴板”并保存后,下一条听写才使用 clipboard。目标在每条听写开始时冻结;录音中修改设置只影响下一条,不会从失败的 caret 提交静默回退到剪贴板。
  • 只复制权威终稿:clipboard 模式不获取 IBus preedit,也不把 provider partial 写入剪贴板或远端;partial 只在守护进程的有界内存中更新。只有 provider 发出连接级权威 final、可选清爽表达处理完成且终稿仍满足 4,096 codepoints / 16 KiB 边界后,才尝试写入一次。
  • 始终由用户手动粘贴:程序不会发送 Ctrl+V、模拟逐字输入、选择远端窗口、读取现有剪贴板或自动重试粘贴。用户必须先确认远端光标位置,再自行按 Ctrl+V。取消、缺少 final、无效或超限结果、helper 不可用、复制失败都不会产生一个可误认为成功的复制或自动输入。
  • 状态语义明确clipboard-armed 只说明用户已选择该目标,下一次开始仍需 preflight;clipboard-ready 只证明上一条在写入当时成功,不保证当前剪贴板尚未被其他应用覆盖;clipboard-unavailable 表示开麦前无法建立可信 helper/display 路径;clipboard-copy-failed 表示终稿未成功写入,用户不应粘贴旧内容。
  • 1.6.1+ 兼容控制器可见:本仓库之外单独维护的兼容控制器代码线 1.6.1+ 可以在悬浮按钮与托盘显示上述 content-free 状态,并保持“错误 > 录音/收尾 > 剪贴板提示 > 普通空闲”的优先级。控制器不接收 transcript,也没有剪贴板、麦克风、网络、provider 或 host-spawn 权限;它不随本仓库 .deb 分发。未运行兼容控制器时可使用 murmur-voice-daemon status,而设置窗口并不是实时录音浮层,需要重新打开后才刷新。

剪贴板暴露与信任边界

RDP 剪贴板同步会把终稿暴露给本机图形会话、Remmina/FreeRDP、远端图形会话、两边同一用户的应用、剪贴板历史工具和远端主机策略。不要使用 clipboard 模式输入密码、PIN、API Key、一次性验证码、恢复码或其他秘密。

项目不会用定时覆盖来假装能够撤回已经同步的内容。粘贴后如需清理,应使用本机、远端桌面和剪贴板管理器实际提供的清除能力;即使界面仍显示 clipboard-ready,剪贴板也可能已经被其他应用覆盖或写入历史。

实现对本机 helper 和显示连接采用以下有界检查:

  • 只允许固定绝对路径 /usr/bin/xclip(X11)或 /usr/bin/wl-copy(Wayland);helper 必须是系统 root 所有的普通可执行文件,并且不能被 group/other 写入。
  • 终稿只通过 helper 的标准输入发送;不进入命令参数、环境变量、shell 字符串、stdout/stderr 或日志。子进程只收到当前 backend 所需的有界 display 认证环境。
  • 开始听写前验证与当前会话匹配的本地 Unix display socket 元数据,并执行一次 250 ms 上限的 connect/close;preflight 本身不执行 helper、不打开麦克风、不联系 provider,也不改写剪贴板。
  • 对处在 user namespace 内的进程,固定系统文件的 root 身份会结合 /proc/self/uid_map 与 kernel overflow UID 解释;元数据缺失或畸形时 fail closed。overflow UID 绝不会被当作每会话 X socket 的可信所有者,display socket 必须属于实际桌面用户。
  • systemd 继续使用 PrivateTmp=yes,只把存在的 /tmp/.X11-unix 只读暴露给 voice service;Wayland 仍使用当前用户私有的 XDG_RUNTIME_DIR socket。

这些检查降低了路径替换和错误会话写入风险,但不是同一 UID 内的强隔离。用户 session D-Bus、mode-0600 本地控制 socket、图形服务与同一用户进程仍是信任边界;恶意的同 UID 程序可能与它们交互或读取剪贴板。

纠错学习与数据格式

  • clipboard 模式没有可信的远端 IBus focus token、private-purpose、committed-span anchor 或 surrounding text,因此不会观察远端修改,也不会从剪贴板学习。本条会记录 content-free 原因 clipboard-output-no-surrounding-text,并跳过自动 adaptive extraction。
  • --review-last 仍然从 raw provider_final 开始,实际 delivery 只读展示。用户可以显式提交自己实际说出的逐字文本;去口头词或润色结果不会自动成为 ASR 金标。
  • 可选数据留存开启时,新 record.json 使用 schema v4。原始 provider_final 仍是 teacher-unreviewedspoken_verbatim / preferred_output 仍为 null / unreviewedmachine-derived-unrevieweddelivery 现在额外记录本条冻结的 caretclipboard target,并保留 mode、processor/outcome 与可重放删除项。
  • 只有终稿成功到达冻结目标后,才可能发布一次成功 record/review。clipboard 写入失败、取消、空终稿或 provider 失败会丢弃可选记录;旧 schema v1/v2/v3 记录保持不可变且继续可读。
  • usage schema v2 继续按实际交付文本计数;首页只读不含正文的 usage 摘要,不打开音频或 record.json transcript。

数据采集仍然默认关闭。本版本仍没有应用自带的 Orange 登录/挂载、resumable transfer、Google Drive 上传器、应用层静态加密、数据集审核/删除 UI、模型训练/微调/蒸馏或断线 fallback spool;用户自行挂载的文件系统仍是独立存储信任边界,正常关闭只给后台 writer 有界 drain。

源码安装与 Debian helper 的区别

  • 源码/preview 安装xclipwl-copy 保持可选,以免一个明确未启用的远程功能阻断默认 caret 路径。选择 clipboard 后,用户必须自行安装与当前会话匹配的 helper;缺失时下一次开始会在开麦和 provider 连接前返回 clipboard-unavailable
  • 正式 .deb:同时声明 Ubuntu 的 xclipwl-clipboard 为外部系统依赖,使支持的 X11 与原生 Wayland 环境都有确定的候选 helper。运行时仍根据当前会话与 live Unix socket 选择,绝不因为已安装两个工具就跳过 preflight。
  • 两个 helper 都不是项目 vendored Python wheel。Preview SBOM 的范围仍是项目 wheel 加 hash-locked Python wheelhouse;Package SBOM 的范围仍是应用/source commit 加四个 bundled Python runtime wheels,不是 Ubuntu 系统依赖的文件级清单。

当前验证与已知限制

  • 代码路径使用 fake/offline provider、fake audio、私有 Xvfb/D-Bus/IBus 以及独立 Xvfb 中的真实 xclip 往返验证;这些测试没有触碰用户真实桌面剪贴板。
  • 本版本没有用真实麦克风、真实 provider Key 或代表性的真实 Remmina/RDP 会话对 clipboard 路径做端到端验收,因此不能把测试结果描述成物理设备、云端识别或所有远程桌面环境已经验证。
  • clipboard 模式没有 inline partial、远端 private-field 拒绝、远端焦点证明或同输入框自动学习;要获得这些边界,需要在远端会话运行完整 IBus/voice 服务,或未来实现经过认证、绑定远端焦点的原生 helper 协议。
  • 火山 BigModel ASR 2.0 仍是默认且唯一曾在维护者机器上用真实 Key 验收的后端;这不代表 alpha.8 新 clipboard 路径进行了真实 provider 验收。Qwen/OpenAI 仍只有 fake-transport 协议测试,MiniMax 仍不可选择。
  • 默认 caret、忠实/清爽终稿、动态麦克风与数据留存的既有边界不变;clipboard 只改变终稿交付位置,不增加 LLM、额外 ASR 请求、音频过滤、增益修改或录音启动质量门。

因此本版本适合作为明确标注的社区 alpha 测试,不应据此宣称安全等价于原生远端输入法、广泛 Linux/RDP 支持、完全离线或生产就绪。

安装与使用

目标环境是 Ubuntu 24.04 x86_64 + IBus。下载本 Release 的 .deb 后运行:

sudo apt install ./open-voice-input-linux_*_amd64.deb

然后打开 Open Voice Input Linux → 远程桌面

  1. 默认保持“当前光标”可继续获得本机 inline partial;
  2. 只有在 Remmina/RDP 画布需要时才选择“同步剪贴板”并保存;
  3. 听写完成且看到上一条复制成功状态后,确认远端字段,再手动粘贴;
  4. 使用完毕后切回“当前光标(默认)”。

升级和卸载会保留私有 Key、词表、纠错账本、output style、output-target.json、麦克风策略、留存选择与外部 dataset。公开 preview / Debian artifact gate 会拒绝打包用户的 output target 与其他私有配置。

验证与供应链信息

  • Release URL: v0.1.0-alpha.8
  • Source commit: 7a86ac5e2c2e765da6f164e02f575090697c70c9
  • Pull request: #24
  • Signed annotated tag: v0.1.0-alpha.8 — GitHub verification: valid
  • Exact-main CI: run 33566479555
  • CI transparency: the final PR head and the exact-main push each completed all four protected checks. The artifact below is the only artifact attached to the successful exact-main push; no pull-request artifact is reused for release preparation.
  • Required checks: security ✅ · engine ✅ · voice ✅ · preview-bundle
  • CI artifact ID: 9823323994
  • CI artifact ZIP SHA256: 7626c0884c6fa72e213e9fa1a2937e8d95895ab087af60809265348813e8dc94
  • Preview archive: openVoiceInput_linux-preview-7a86ac5e2c2e-ubuntu-24.04-x86_64-py3.12.tar.gz
  • Preview archive SHA256: bc0298e5b7b7414291dd0f0010ad67da7082e85f7fab6004d2ddf1d93967c303
  • Debian package: open-voice-input-linux_0.1.0-alpha8-1_amd64.deb
  • Debian package SHA256: 8434a4f414641a85c11fa663f5a1f8287b48b04befc21c4338951838b44b8c8a
  • Debian package size / Installed-Size: 469888 bytes / 3112 KiB
  • Preview SBOM serial: urn:uuid:a6f168d1-0db7-5a6d-86d6-ec7504cc6c6c
    • Scope: project wheel + hash-locked runtime wheelhouse
  • Package SBOM serial: urn:uuid:154a2e68-9f33-5a01-bf94-17f4d2b36a04
    • Scope: packaged application/source commit + four bundled Python runtime wheels; Ubuntu system helpers remain external dependencies
  • Immutable release: enabled; GitHub locks this release on publication after draft-asset verification

English summary

Open Voice Input Linux v0.1.0-alpha.8 adds an explicit, default-off clipboard output target for remote-desktop canvases that cannot receive local IBus preedit. Native caret delivery remains the missing-config default. The target is frozen when each utterance starts; clipboard mode bypasses IBus acquisition, keeps provider partials only in bounded daemon memory, and writes exactly one authoritative final after optional local clean processing. It never copies partials, reads the existing clipboard, chooses a remote window, auto-pastes, sends Ctrl+V, or simulates typing. The user must confirm the remote field and paste manually.

Clipboard synchronization exposes the final to the local graphical session, Remmina/FreeRDP, the remote session, same-user applications on both sides, clipboard-history tools, and remote policy. It must not be used for passwords, PINs, API keys, one-time codes, recovery codes, or other secrets. clipboard-armed means only that the target was selected; clipboard-ready is only the historical fact that the last write succeeded and does not prove the clipboard still contains that value. Controller 1.6.1+ can surface these content-free notices without transcript or clipboard access; it remains a separate compatibility component rather than part of this repository's Debian package.

Before microphone or provider startup, the daemon accepts only fixed /usr/bin/xclip or /usr/bin/wl-copy helpers that appear as root-owned, non-group/world-writable regular executables and are paired with a live, session-matched local Unix display socket. Transcript bytes travel only on stdin. User-namespace UID mapping is considered only for fixed system ownership; an overflow UID is never trusted as a per-session X-socket owner, and malformed namespace metadata fails closed. PrivateTmp=yes remains enabled, with only /tmp/.X11-unix exposed read-only when present. These checks do not isolate mutually untrusted applications running under the same Unix UID.

Clipboard delivery has no authenticated remote focus, private-purpose flag, committed-span anchor, or surrounding text. It therefore skips automatic adaptive extraction with clipboard-output-no-surrounding-text; explicit review still starts from raw provider_final. Opted-in records advance to schema v4: raw provider and null human-review labels retain their meanings, while machine-derived delivery separately records the frozen caret or clipboard target. A record or review is offered only after the final reaches that target successfully; existing v1/v2/v3 records remain immutable and usage v2 continues counting delivered text.

Source installs keep xclip/wl-copy optional so default caret delivery is unaffected; users who select clipboard must install the helper matching their session. The Debian package depends on both Ubuntu xclip and wl-clipboard, while runtime still performs the same session/socket preflight. These external system helpers are not vendored Python wheels and are outside the file-level scope of the preview/package SBOMs.

The clipboard path has fake/offline coverage plus real xclip Unicode/emoji/newline round trips inside an isolated Xvfb session, but alpha.8 has not been accepted end-to-end with a real microphone, real provider key, the user's actual desktop clipboard, or a representative real Remmina/RDP session. Collection remains off by default. There is still no local/offline ASR, integrated Orange/Google Drive transport, at-rest encryption, dataset review/deletion UI, training pipeline, or fallback spool. The supported package target remains Ubuntu 24.04 x86_64 + IBus, and this alpha does not claim broad Linux/RDP or production-ready support.