Open Voice Input Linux v0.1.0-alpha.6
Pre-releaseOpen Voice Input Linux v0.1.0-alpha.6
面向 Ubuntu / IBus 用户的公开技术预览:按下自选快捷键说话,识别文字通过 IBus 直接出现在当前光标;主路径不读取剪贴板、不发送
Ctrl+V,也不模拟逐字输入。
alpha.6 聚焦两件事:在不增加录音启动质量门、不牺牲开口体感的前提下,为今后的训练数据留下可信的麦克风来源与事后质量证据;同时为 Chromium/Electron 等无法提供 IBus surrounding text 的应用补上一条显式、ID 绑定的纠错学习闭环。它仍是 alpha,不是稳定版、生产就绪声明或“支持所有 Linux”的承诺。
这次更新
- 不增加启动质量门:没有预热等待、开头静音裁剪、自动拒绝、滤波、自动增益或输入流改写。普通听写与发送给 ASR 的 PCM 路径保持不变;质量统计只在用户明确开启留存、一次听写已经完成并被接受之后,由后台 writer 事后计算。
- 记录“策略选择”与“实际路由”:新记录分别保存本次按用户策略选择的麦克风类别,以及捕获期间实际观察到的 Pulse source-output。实际路由未观察到时明确记为
unknown,不会拿“选择结果”冒充实际来源;观察异步运行、逐步退避至五秒且不阻塞录音。 - 隐私安全的麦克风元数据:只保留宽泛类别、非唯一的型号/类别指纹、选择依据、DJI 链路状态和有界路由变化;不保存原始 Pulse source 名称、USB 序列号、蓝牙地址或用户自定义设备名。
- 事后音频质量证据:为整体与第一秒记录削波比例、RMS/峰值 dBFS、直流偏移、零值比例及样本数。它们是之后筛选训练候选的数值证据,不会判定“好/坏”,也不会修复、丢弃或修改录音。
review-last显式纠错:运行open-voice-input-settings --review-last,可复核最近一次已接受的 provider final,并把副本修改为自己实际说出的逐字内容。适用于 Chromium/Electron 等不暴露可信 surrounding text 的应用。- 更准确的纠错统计:设置页区分显式词表、手工纠错、有效自适应规则以及下一次 provider 请求实际可用的合并纠错总数。确认候选后会重新加载账本,只有规则确实进入有界、冲突安全的 provider view 才报告成功。
- 与原录音 ID 绑定的 feedback:显式复核必须匹配仍然最新且未过期的 utterance ID,并且只能消费一次。数据留存开启时,同一有界纠错结果会排入该 utterance 的 append-only
feedback/sidecar;界面明确区分“留存未启用”“入队失败”和“已入队、尚未证明落盘”。
为什么 vocabulary.json / corrections.json 可以不存在
这两个文件是用户显式维护的可选提示:没有显式词表或手工纠错时,文件不存在就准确代表 0 条,而不是后台故障。自动学习只写独立的私有 adaptive-corrections.json;它不会创建空的手工文件,也不会把整段供应商输出复制成规则。
设置页现在同时显示:
- 显式词表条数;
- 手工纠错条数;
- 自适应账本中的候选、有效、冲突或暂停状态;
- 经过手工优先级、冲突/重叠/级联抑制和 50 对上限后,下一次识别请求真正能收到的有效规则数。
Chromium / Electron 下的复核边界
守护进程只在内存中保留最近一条已接受的 provider final 与 utterance ID,最长十分钟;新结果会替换旧结果,服务退出即清空。设置程序通过主机专用的私有 Unix socket 读取它:父目录为 0700、socket 为 0600,并且位于 Flatpak 控制器可见的 runtime 子树之外。原文在界面中只读;提交时只发送当前 review ID 与用户明确修改的逐字复核。
过期、已被新听写替换、重复提交或 ID 不匹配都会被拒绝。成功更新自适应账本后,该 review 会被消费;即使可选 feedback sidecar 入队失败,也不会让同一修改重复增加支持次数。
本流程不读取剪贴板、AT-SPI 树、全局键盘、Rime 历史或 Chrome 的后续编辑,也不会把复核全文写进日志、命令行参数或持久 review 文件。去口头词、改写和表达润色不是“实际逐字说出”,不能静默当作 ASR 金标。Chromium 明确报告 surrounding text 不可用时,输入法会立即恢复之前的 IBus engine,不再无意义地占用五秒观察窗口。
数据格式:v1 与 v2 共存
数据集目录和 marker 仍为 openvoiceinput-dataset-v1,不可变的 utterances/<id>/audio.wav + record.json 两文件契约也保持不变。已有 schema-v1 record.json 不移动、不重写,仍然有效;同一个数据集可以同时包含旧 v1 和新 v2 记录。
新生成的 schema v2 只增加可选的顶层 microphone 对象与 audio.quality 数值摘要,原有 audio、provider 和 labels 字段语义不变。读取器应接受 v1/v2,并把旧记录中缺失的麦克风/质量字段解释为“未观察”,不能根据文件名或当前桌面状态反推历史来源。
可选数据留存与 SSHFS 边界
数据采集默认关闭。明确开启并选择现有本地目录或操作系统已经挂载的兼容 POSIX 目录后,成功且被当前 IBus 上下文接受的听写才可能发布:
utterances/<id>/audio.wav:精确捕获的 16 kHz 单声道 WAV;utterances/<id>/record.json:不可变的 v1/v2 元数据与标签角色;usage/<id>.json:不含转写正文的统计摘要;feedback/<id>/<event_id>.json:append-only 的有界纠错决定。
为兼容 owner-mapped SSHFS/FUSE,feedback 发布校验现在接受用户所有、具备 owner 读写且 group/other 无权限的 0600 或 0700 普通文件。符号链接、外部 UID、缺少 owner 读写权限、任何 group/other 权限仍会 fail closed。这个兼容规则只承认文件系统实际暴露的 owner-private 状态,不会把不执行 POSIX 权限的远程存储变安全。
provider_final 仍是 teacher-unreviewed 伪标签;不可变记录中的 spoken_verbatim 和 preferred_output 仍为 null / unreviewed。review-last 更新的是自适应账本和可选 append-only feedback,不会倒写原 record.json,也不等于已经完成逐条听音审核。
本版本仍然没有应用自带的 Orange 登录/挂载、resumable transfer、Google Drive 上传器、应用层静态加密、数据集审核/删除 UI、模型训练/微调/蒸馏或断线 fallback spool。用户自行挂载的 SSHFS/Orange/POSIX 文件系统是独立的存储信任边界;共享、备份、权限和静态保护由该文件系统决定。远程挂载卡住或断开不会中断普通听写,但尚未发布的可选记录可能丢失;正常关机只给 writer 有界 drain。
在线 ASR 与麦克风的既有边界
- 火山引擎 BigModel ASR 2.0 仍是默认且唯一在维护者机器上用真实 Key 实机验收的后端。
- Qwen 实时 ASR 与 OpenAI 批量转写有 fake-transport 协议测试,但本版本没有真实用户 Key 验收;MiniMax 仍是不可选择的计划项。
- 所有可运行云端后端均为 BYOK,音频、费用、地域处理、服务端留存和账户政策遵循用户选择的供应商;没有本地/完全离线 ASR,也没有训练流水线。
- 麦克风优先级完全由用户保存。每次新听写重新选择与回退,只作用于本应用的 capture stream,不修改播放 sink、系统默认输入、增益或静音;一句话已经开始后不会 mid-utterance handoff。
- 点按模式保持可用;真正的按住说话仍要求外部集成发送独立
press/release边沿。本项目不扫描全部/dev/input,也不宣称解决通用 Wayland 全局 key-up。
当前支持范围与已知缺口
- 明确目标:Ubuntu 24.04 x86_64、IBus、CPython 3.12、支持标准 IBus preedit 的应用。
- 自动同输入框学习仍依赖应用提供可信 IBus surrounding text;Chromium/Electron 需要在十分钟内显式打开
--review-last。 - 事后质量统计不会决定记录是否适合训练,也不会修复已经削波或损坏的音频。
- 首页统计只读取新发布的
usage/*.json,不会打开旧record.json来回填历史 transcript;挂载不可用时显示未知/不可用而不是 0。 - Qwen/OpenAI 尚无真实 Key 验收;全物理 DJI/耳麦/内置组合、断连重连、真实挂载与代表性应用矩阵仍不完整。
- CI 的 fake-device、fake-transport、Xvfb/D-Bus/IBus smoke 和无 Key package lifecycle 不等于上述物理验收。
因此本版本适合作为明确标注的社区 alpha 测试,不应据此宣称广泛 Linux 支持、完全离线或生产就绪。
安装与升级
目标环境是 Ubuntu 24.04 x86_64 + IBus。下载本 Release 的 .deb 后运行:
sudo apt install ./open-voice-input-linux_*_amd64.deb然后从应用菜单打开 Open Voice Input Linux,或运行:
open-voice-input-settings卸载/升级会保留用户私有 Key、词表、纠错账本、麦克风策略、留存选择与外部 dataset。
验证与供应链信息
- Release URL: v0.1.0-alpha.6
- Source commit:
929be47e10699d76e698b028f3b044cacffe1582 - Pull request: #22
- Signed annotated tag:
v0.1.0-alpha.6— GitHub verification:valid - Exact-main CI: run 33451916005
- CI transparency: attempt 1 hit one runner-side 20-second timeout while invoking
the packagedmurmur-voice-daemon --help; the same exact commit was rerun,
completed the package lifecycle, and produced the verified attempt-2 artifact. - Required checks:
security✅ ·engine✅ ·voice✅ ·preview-bundle✅ - CI artifact ID:
9780200412 - CI artifact ZIP SHA256:
29261f5d88e63011521c160d9772e7f100776bbecadfbe032e8cd28736683c16 - Preview archive:
openVoiceInput_linux-preview-929be47e1069-ubuntu-24.04-x86_64-py3.12.tar.gz - Preview archive SHA256:
ad5021f626d3a905155b9de85bdea2ac13f00e583cc2ba40ef7d7059d3c4eaae - Debian package:
open-voice-input-linux_0.1.0-alpha6-1_amd64.deb - Debian package SHA256:
37eea6d5c4f87c625c9fe7acbac7c96a3e381835945d217d9e4d235fae99b0d4 - Debian package size / Installed-Size:
453104 bytes / 3024 KiB - Preview SBOM serial:
urn:uuid:89049faa-6e20-5d7a-8419-3f2cebf534f7- Scope: project wheel + hash-locked runtime wheelhouse
- Package SBOM serial:
urn:uuid:972acf4e-e5ce-5f9f-b485-0a9380625750- Scope: packaged application/source commit + four bundled Python runtime wheels
- Immutable release:
enabled; GitHub locks this release on publication after draft-asset verification
English summary
Open Voice Input Linux v0.1.0-alpha.6 adds privacy-preserving microphone provenance and post-capture PCM diagnostics without a startup quality gate, warm-up delay, filtering, rejection, gain change, or provider-stream modification. New schema-v2 records distinguish the microphone selected by policy from the actual Pulse source-output observed during capture and add whole-record/first-second clipping, RMS/peak, DC-offset, and zero-fraction evidence. Existing schema-v1 records remain immutable and valid in the same openvoiceinput-dataset-v1 tree; readers should treat missing v2 fields as unobserved.
For Chromium/Electron and other applications without trustworthy IBus surrounding text, open-voice-input-settings --review-last provides an explicit correction path. The daemon retains only the latest accepted final and utterance ID in memory for ten minutes and exposes it over a host-only private socket; submission is current-ID-bound and one-shot. When collection is enabled, the same bounded decision is queued under that utterance's append-only feedback sidecar. Queue acceptance is not claimed as durable publication. Missing vocabulary.json and corrections.json files correctly mean zero user-managed entries; automatic learning lives only in the private adaptive ledger, and the UI now reports the exact conflict-safe correction count compiled for the next provider request.
Collection remains off by default. Provider finals are teacher-unreviewed; immutable spoken_verbatim and preferred_output labels remain unset. Owner-private 0700 files exposed by owner-mapped SSHFS/FUSE are accepted alongside 0600 for feedback validation, while symlinks, foreign ownership, missing owner read/write, and any group/other permissions still fail closed. There is no application-owned Orange authentication/mount, resumable transfer, integrated Google Drive uploader, at-rest encryption, dataset review/delete UI, training pipeline, or fallback spool. User-mounted storage remains a separate trust boundary.
Volcengine remains the default and only real-key-validated backend on the maintainer workstation. Qwen streaming and OpenAI batch transcription are fake-transport-tested without a real-key acceptance claim; MiniMax is planned and not selectable. There is no local/offline ASR or model training. Microphone selection remains per dictation and app-scoped with no mid-utterance handoff or playback-sink change; push-to-talk still requires an external integration that emits separate press/release edges. The supported package target remains Ubuntu 24.04 x86_64 + IBus, and broad physical-device/provider/application validation is still incomplete.