Open Voice Input Linux v0.1.0-alpha.9
Pre-releaseOpen Voice Input Linux v0.1.0-alpha.9
面向 Ubuntu / IBus 用户的补丁更新:修正火山 BigModel ASR 2.0 原始 WebSocket 请求中的动态上下文位置,以本地、有界、可回放的终稿阶段落实用户明确确认过的术语纠错,并增加不会阻塞录音启动的私有音频信号质量审计工具。
alpha.9 重点解决“词表或纠错已经保存,但云端仍然偶发忽略”的可靠性问题。correct_words 继续作为服务端 best-effort 提示;手工规则与用户明确确认的 adaptive 规则还会在权威终稿到达后本地执行一次。这个补丁不增加 LLM、额外 ASR 请求、启动质量门、音频过滤或增益调整,也不会改变既有 IBus、远程桌面剪贴板、麦克风路由和播放输出边界。
这次更新
- 修正火山请求协议层:动态 JSON context 现在位于原始 WebSocket 请求的
request.corpus.context;经过代码审核的boosting_table_*/correct_table_*托管表 selector 仍与它同处corpus。非空上下文合并hotwords与correct_words,空上下文则省略,避免发送错误层级。 - 纠错获得本地确定性后盾:服务端
correct_words不再被当作一定执行的命令。手工规则和用户明确确认的 active adaptive 规则会在 provider authoritative final 后、本地 clean/faithful 风格之前执行一次。自动激活但未经人工确认的强证据仍只作为 provider hint,不会直接重写终稿。 - 有界且保护词界:本地阶段采用 leftmost-longest、非重叠、非级联替换;ASCII source 区分大小写并要求词法边界,常见 URL、dotted name、identifier 和 Markdown code 上下文会跳过。因此可把独立的
Elas改成ILaaS,而不应改动Elastic、Elasticsearch、URL 路径或代码 token。 - 热词预算更保守:已确认纠错的 canonical 会先于普通显式词汇加入去重后的识别热词。由于火山公开了 100-token 上限却没有公开该端点 tokenizer,本客户端不把“一个词条”错误地当作“一个 token”,而是同时限制完整词条数、Unicode codepoint 和 UTF-8 byte;放不下的完整词条会被跳过而不是切断。
- 交付流水线可重放:新 opt-in
record.json升级为 schema v5。delivery.pipeline依次记录 confirmed-correction 与 faithful/clean 阶段;原始provider_final、实际交付文本、冻结的caret/clipboard目标和两个人工标签继续彼此分离。 - 增加不含正文的火山结果诊断:每个连接只累计
result.text帧、包含 definite utterance 的帧以及两者选择结果不一致的次数。日志只记录固定事件名,不记录任一 transcript、长度、纠错规则或 provider payload。 - 增加私有、signal-only 音频质量审计:
scripts/audit_audio_quality.py可在录音结束后检查用户已经明确 opt-in 保存的不可变 WAV/JSON 对,计算时长、响度、削波、DC offset、数字静音/掉音及首秒污染等信号证据,并按high、usable、low、reject给出启发式分档。
延迟、失败回退与安全边界
- 所有 live partial 仍保持 provider 原样;纠错与 clean 只在权威终稿到达后运行。
- confirmed-correction 是纯本地、确定性的字符串阶段,不调用模型或网络;输入和输出分别限制为 4,096 codepoints / 16 KiB,最多执行 64 次替换。验证、边界、处理器或可回放检查失败时,该阶段保留原始 provider final。
- clean 是后续独立的、本地、deletion-only 阶段。它最多执行 64 次删除,失败时回退到纠错阶段的输入;faithful 模式不做口头表达清理,但仍允许明确确认过的术语纠错。
- 任一终稿阶段实际改变文本后,本条不会把后续编辑自动当作原始 ASR span 的学习证据。
--review-last仍始终从原始provider_final开始,机器交付文本只读展示。 - 没有新增开麦前音质门、warm-up、自动拒绝、音频过滤、降噪、增益修改或中途切换麦克风。DJI/耳机/内置麦克风选择仍只影响新的一条听写,且从不改变播放 sink。
- 默认交付仍是当前 IBus 光标;远程桌面 clipboard 目标仍明确 opt-in、只写一次权威终稿、从不自动粘贴或模拟按键。
音频质量审计的含义
- 审计不会播放或听取音频,不检查 transcript 语义,也不联系 ASR 或其他网络服务;它只读取用户已经选择保存的数据集。
- 原始
audio.wav和record.json不会被改写。可选输出使用私有quality-v1/<utterance-id>/{quality.json,complete}sidecar;只有完整 manifest 才代表一次已提交的快照,中断后未被完整 manifest 引用的内容必须忽略。 high / usable / low / reject是固定阈值下的信号启发式,不是人工听感判断、转录正确率、人工 gold label 或自动训练准入。training_label_status明确保持non-gold-signal-audit-only。- 一个信号较好的样本仍可能转录错误;一个低档样本也不能在未经人工复核时直接删除。此工具用于筛查和后续审核排序,不用于静默改变输入体验。
数据格式与留存
- 数据采集仍然默认关闭,只有用户明确选择现有的本地或挂载目录后才保存音频和记录。
- schema v5 仍把
labels.provider_final标为teacher-unreviewed,把实际delivery标为machine-derived-unreviewed,并让spoken_verbatim/preferred_output保持null / unreviewed,直到未来进行真正的人工听音审核。 delivery.pipeline从原始 final 开始按顺序重放纠错和 faithful/clean 阶段;旧 schema v1/v2/v3/v4 记录保持不可变且继续可读。usage schema v2 继续按实际交付文本计数。- 本版本仍没有应用自带的 Orange 登录/挂载、resumable transfer、Google Drive 上传器、应用层静态加密、数据集审核/删除 UI、模型训练/微调/蒸馏或断线 fallback spool。用户自行挂载的文件系统仍是独立存储信任边界,正常关闭只给后台 writer 有界 drain。
当前验证与已知限制
- 受保护的 exact-main CI 已完成
security、engine、voice和preview-bundle四项检查;PR 验证包括 810 个 voice tests、38 个 engine tests、165 个 scripts/installer/packaging tests 和 25 个音频质量 adversarial tests,以及 Ruff、compileall、可重现构建和 secret scan。 - 协议、纠错和质量工具使用 fake/offline transport 与合成测试数据验证;本次发布准备没有启动真实麦克风,也没有使用真实 provider key 发起 ASR 请求。
- 火山 BigModel ASR 2.0 仍是默认且唯一曾在维护者机器上用真实 Key 验收的后端,但这不表示每个 hotword/correction 都会被服务端采纳;alpha.9 的本地终稿阶段只保证明确允许的规则能够在既定边界内执行。
- 音频分档不测转录内容、语义、口音适配或人工听感,不能替代真正的听音标注和独立验证集。
- 支持的正式包目标仍是 Ubuntu 24.04 x86_64 + IBus + CPython 3.12。这是公开 alpha 补丁版本,不宣称广泛 Linux 兼容、完全离线 ASR 或生产就绪。
安装与升级
下载本 Release 的 Debian 包后运行:
sudo apt install ./open-voice-input-linux_0.1.0-alpha9-1_amd64.debDebian 内部版本仍使用可正确参与 Debian 排序的 0.1.0~alpha9-1;Release 文件名沿用既有惯例写作 0.1.0-alpha9-1。两者是同一份逐字节相同的包。
也可以使用离线 preview archive:
tar -xzf openVoiceInput_linux-preview-e2a1847a49f7-ubuntu-24.04-x86_64-py3.12.tar.gz
cd openVoiceInput_linux-preview-e2a1847a49f7-ubuntu-24.04-x86_64-py3.12
./scripts/install-user.sh升级和卸载继续保留用户私有的 provider key、显式词表、手工纠错、adaptive ledger、输出风格、输出目标、交互与麦克风策略、留存选择及外部 dataset。公开 preview / Debian artifact gate 会拒绝打包这些用户配置、音频、transcript 或质量 sidecar。
验证与供应链信息
- Release URL: v0.1.0-alpha.9
- Release tag:
v0.1.0-alpha.9 - Signed annotated tag:
v0.1.0-alpha.9— GitHub verification:valid - Source commit:
e2a1847a49f7707915e5c2f6b0c946cc7efa0a50(GitHub commit verification:valid) - Feature pull request: #25
- Release-link correction: #26
- Exact-main CI: run 33854484449
- Required checks:
security✅ ·engine✅ ·voice✅ ·preview-bundle✅ - CI artifact ID:
9929644414 - CI artifact ZIP SHA256:
e8a808f31b36a314af07b748605862b0f954f67a7c9dbdeec09e6ddf4d86a7af - Preview archive:
openVoiceInput_linux-preview-e2a1847a49f7-ubuntu-24.04-x86_64-py3.12.tar.gz - Preview archive SHA256:
a62d48fb1120fa07aa4aff66bed3524be74329e94a96cba2691deb5db90f94a8 - Debian package:
open-voice-input-linux_0.1.0-alpha9-1_amd64.deb - Debian package SHA256:
dd72b26fa644a4c06076cdf619f5bb26265e5092464a8ce216afaa9171123a82 - Debian package size / Installed-Size:
474120 bytes / 3140 KiB - Preview SBOM serial:
urn:uuid:ce497340-8e59-50fa-839b-94688ea04fd1- Scope: project wheel + hash-locked runtime wheelhouse
- Package SBOM serial:
urn:uuid:080f291d-7e2f-5209-9daf-057ca8f52258- Scope: packaged application/source commit + four bundled Python runtime wheels; Ubuntu system dependencies remain external
- Immutable release: repository policy is enabled; after draft-asset verification and publication, this release and its assets are locked and corrections require a new version.
English release notes
Open Voice Input Linux v0.1.0-alpha.9 is a patch update for terminology reliability and post-hoc dataset quality review on Ubuntu/IBus. It fixes the raw Volcengine BigModel ASR 2.0 request hierarchy by carrying dynamic context at request.corpus.context, adds a bounded local terminal stage for corrections the user has explicitly authorized, and introduces a private signal-only quality auditor for already retained opt-in recordings. It adds no LLM, extra ASR request, startup quality gate, audio filtering, gain adjustment, or microphone-to-playback routing change.
What changed
- Dynamic
hotwordsandcorrect_wordsnow share the compact context JSON at raw-wirerequest.corpus.context; reviewed managed-table selectors remain sibling fields incorpus, and empty context is omitted. - Provider-side
correct_wordsremains best-effort guidance. Manual rules and explicitly confirmed active adaptive rules are also applied once locally after the authoritative provider final and before faithful/clean output-style processing. Strong automatically activated evidence that has not been explicitly confirmed remains provider guidance only. - The local pass is leftmost-longest, non-overlapping, non-cascading, bounded to 4,096 codepoints / 16 KiB and at most 64 replacements. ASCII sources are case-sensitive and require lexical boundaries; common URL, dotted-name, identifier and Markdown-code contexts are protected. Validation, limit, processor or replay failure preserves the provider final for that stage.
- Confirmed correction canonicals receive priority in the deduplicated request hotword view. Because Volcengine publishes a 100-token cap without exposing the endpoint tokenizer, the client does not equate entries with tokens: it conservatively limits complete terms, Unicode codepoints and UTF-8 bytes, skipping rather than splitting a term that does not fit.
- New opted-in records use schema v5.
delivery.pipelinereplayably records the confirmed-correction stage followed by faithful identity or clean deletion-only processing. Rawprovider_final, actualmachine-derived-unrevieweddelivery, frozencaret/clipboardtarget, and null human labels remain separate; existing v1/v2/v3/v4 records are not rewritten. - Volcengine result selection now keeps content-free per-connection counts for
result.text, definite utterance frames and selection mismatches. A mismatch log includes only a fixed event name, never either transcript representation, its length, correction content, or provider payload. scripts/audit_audio_quality.pyvalidates immutable WAV/JSON pairs after recording and computes signal evidence for duration, level, clipping, DC offset, digital silence/dropout and first-second contamination. It classifies each record ashigh,usable,low, orrejectunder a deterministic heuristic policy.
Latency, privacy, and failure boundaries
Live partials remain raw. Both terminal stages are local and add no model or network call. Confirmed correction fails open to the raw provider final; the separate clean deletion-only stage fails open to its previous-stage input. Faithful mode performs no expression cleanup but still permits explicitly authorized terminology corrections. If either stage changes the terminal text, later field edits are not treated as safe automatic evidence about the original ASR span; explicit review continues to begin with raw provider_final.
The quality auditor does not play or listen to audio, interpret transcript semantics, or contact an ASR/network service. It never rewrites original audio.wav or record.json. Optional private output uses deterministic quality-v1/<utterance-id>/{quality.json,complete} sidecars, and only a complete manifest commits a snapshot. Its tiers are signal heuristics—not listening judgments, transcription correctness, gold labels, or automatic training admission—and are explicitly marked non-gold-signal-audit-only.
There is no new pre-recording gate, warm-up, automatic rejection, denoising, filtering, gain change, or mid-utterance microphone handoff. The default remains native IBus caret delivery. Clipboard output remains explicit opt-in, authoritative-final-only, manual-paste delivery with no simulated keys or automatic paste. DJI/headset/built-in microphone policy continues to affect only a new capture stream and never changes the playback sink.
Collection remains off by default and requires a user-selected existing local or mounted directory. Provider final remains teacher-unreviewed; delivery remains machine-derived-unreviewed; spoken_verbatim and preferred_output remain null/unreviewed pending real human listening review. There is still no application-owned Orange authentication/mount, resumable transfer, Google Drive uploader, application-level at-rest encryption, dataset review/delete UI, training/fine-tuning/distillation pipeline, or offline fallback spool. A user-mounted filesystem remains a separate storage trust boundary, and normal shutdown provides only a bounded writer drain.
Validation and limitations
The protected exact-main run completed all four required checks: security, engine, voice, and preview-bundle. PR validation included 810 voice tests, 38 engine tests, 165 scripts/installer/packaging tests, 25 adversarial quality-auditor tests, Ruff, compileall, reproducible builds, and a clean secret scan. Protocol, correction and quality-audit paths were exercised with fake/offline transport and synthetic fixtures; this release preparation did not start a real microphone or call a real provider key.
Volcengine BigModel ASR 2.0 remains the default and the only backend previously accepted with a real key on the maintainer machine. That history does not imply that the service honors every hint or that the new path received fresh real-provider acceptance. The local stage guarantees only explicitly authorized rules within its documented bounds. Quality tiers do not measure transcript semantics, accent adaptation, or human listening quality and cannot replace listening review plus an independent evaluation set.
The supported package target remains Ubuntu 24.04 x86_64 + IBus + CPython 3.12. This is a public alpha patch, not a claim of broad Linux compatibility, fully offline ASR, or production readiness.