# Changelog ## v2.1.27 (2026-06-03) ### QA 候选包 - **关于页审核信息补全**:关于页显示 `私语输入法 (PrivateVoice Dictation)`、离线识别说明、数据不出设备声明、开源项目归属、版权许可、隐私政策和支持反馈链接。 - **苹果审核链接更新**:版权许可、隐私政策、支持反馈统一指向 `privatevoice-dictation-support` 支持站点;保留 VoiceSnap 原项目地址入口。 - **英文界面同步**:English 关于页同步展示等价隐私与许可说明,避免系统语言为英文时仍显示旧审核信息。 ### 构建 - build: `20260603.2238` - 说明: 本版本为关于页审核信息补全后的用户验收候选包。 --- ## v2.1.26 (2026-06-03) ### 修复 - **macOS App 名称按系统语言本地化**:中文系统显示 `私语输入法`,英文系统显示 `PrivateVoice Dictation`。 - **麦克风权限提示本地化**:中文系统下麦克风授权文案改为中文。 - **macOS 构建脚本复制本地化资源**:本地、正式、App Store POC 和 Developer ID sandbox 构建都会把 `*.lproj/InfoPlist.strings` 打入 `.app/Contents/Resources`。 ### 构建 - build: `20260603.2151` --- ## v2.1.25 (2026-06-03) ### QA 候选包 - **中文界面品牌文案本地化**:中文语言版本下,侧栏和关于页显示 `私语输入法`、`永远离线·稳定极速`。 - **关于页中文卖点调整**:中文关于页卖点改为 `私密离线 · 自定义词库 · 保护隐私` 和 `真正属于你的语音输入法`。 - **英文正式名保留**:macOS App 正式包名和英文界面仍保持 `PrivateVoice Dictation`。 ### 构建 - build: `20260603.2102` - 说明: 本版本为中文界面品牌文案修正后的用户验收候选包。 --- ## v2.1.24 (2026-06-03) ### QA 候选包 - **品牌命名调整**:App 正式名称从 `PrivateVoice Input` 改为 `PrivateVoice Dictation`,同步 macOS App bundle、DMG 文件名、Info.plist、Wails 构建配置和用户可见文案。 - **侧栏 Logo 区调整**:左侧品牌区只显示 `PrivateVoice`,下方小字显示 `Private. Offline.`。 - **升级兼容保护**:本轮不迁移用户数据目录,继续使用既有 `Application Support/PrivateVoice Input`,避免影响历史记录、模型文件和系统权限。 ### 构建 - build: `20260603.1934` - 说明: 本版本为 Round 5 后追加的 UI/品牌命名验收候选包。 --- ## v2.1.23 (2026-06-03) ### QA 候选包 - **Round 5 Qwen3-ASR 中文高级模型**:中文语言版本新增 `qwen3-asr-0.6b` 可选高级模型,默认模型仍保持 `sensevoice-zh`。 - **Qwen3-ASR backend**:升级 `sherpa-onnx-go*` 到 `v1.13.2`,接入 `OfflineQwen3ASRModelConfig`,支持 `conv_frontend.onnx`、`encoder.int8.onnx`、`decoder.int8.onnx` 和 `tokenizer/` 目录结构。 - **大模型下载稳定性**:模型下载增加重试和 Range 断点续传,降低大文件下载被连接重置或 TLS 超时打断后的失败概率。 - **模型状态同步修复**:engine reload 后主动向前端推送 `engine:status`,避免设置页模型卡片和底部 Engine 信息显示不同步。 - **回归保护**:SenseVoice、Moonshine、Parakeet 三条旧模型路径均已完成加载和识别回归。 ### 构建 - build: `20260603.1904` - 说明: 本版本为 Round 5 QA 修复后的用户验收候选包,用于验证 Qwen3-ASR、模型切换和断网识别。 --- ## v2.1.22 (2026-06-03) ### QA 候选包 - **Round 4 Parakeet English 高级模型**:English 语言版本新增 `parakeet-en` 可选高级模型,默认模型仍保持 `moonshine-en`。 - **Nemo Transducer backend**:macOS sherpa-onnx 接入 Parakeet NeMo Transducer 配置,支持 `encoder.int8.onnx`、`decoder.int8.onnx`、`joiner.int8.onnx`、`tokens.txt` 四文件结构。 - **模型选择 UI**:设置页新增 English 模型选择卡片,支持 Moonshine 与 Parakeet 下载、切换、当前状态展示和进度展示。 - **语言隔离保护**:手动选择的模型必须兼容当前语言;切回中文后继续使用 SenseVoice 默认路径,不让 English 模型污染中文配置。 - **下载失败保护**:Parakeet 下载中断后不会破坏当前 Moonshine/SenseVoice;下一次同模型下载前会清理旧 partial,避免残留大体积临时目录。 - **真机 QA**:已完成 Parakeet 真实下载、加载、英文识别、断网英文识别、重启持久化、Moonshine 回退、中文 SenseVoice 回归和用户数据保护验证。 ### 构建 - build: `20260603.1608` - 说明: 本版本为 Round 4 QA 通过后的测试包候选,待生成 DMG、release manifest、验证并打 tag 后交付用户验收。 --- ## v2.1.21 (2026-06-03) ### QA 候选包 - **Round 3 Moonshine English 默认模型**:English 语言版本默认 current model 改为 `moonshine-en`,中文语言版本继续默认 `sensevoice-zh`。 - **Moonshine backend**:macOS sherpa-onnx 接入 Moonshine v1 四文件配置:`preprocess.onnx`、`encode.int8.onnx`、`uncached_decode.int8.onnx`、`cached_decode.int8.onnx`、`tokens.txt`。 - **模型选择解析**:新增 `ModelSelectionMode=auto|manual`,旧配置缺字段时按 `auto` 处理,避免 Round 2 的 `SelectedModelID=sensevoice-zh` 锁死 English 默认模型。 - **按当前模型下载**:Onboarding 改为调用 `DownloadCurrentModel()`,由后端根据 effective language 和 profile 选择下载 SenseVoice 或 Moonshine。 - **语言切换同步模型**:设置页切换中文/English 后会刷新 current model;缺模型时进入 onboarding,已安装时重载引擎。 - **安全回归保护**:Moonshine 初始化失败会清空旧引擎,避免用户实际继续使用旧模型;SenseVoice 中文路径和用户数据保持兼容。 - **QA 资料**:新增 `02-P-NBL/round-3` 下 PRD、研发拆解、QA 计划、自查、复审、QA handoff 和 QA 预检记录。 ### 构建 - build: `20260603.1327` - 说明: 本版本为 Round 3 QA 测试包候选,已完成源码级自查和 QA 预检,仍需真机验证 Moonshine 下载、加载、英文断网识别、history 写入、语言切换和中文 SenseVoice 回归。 --- ## v2.1.20 (2026-06-03) ### QA 候选包 - **Round 2 语言版本设置**:设置页新增“语言版本”,支持自动、中文、English 三种模式。 - **系统语言解析**:新增语言 profile 和 resolver,中文系统默认中文,English 系统默认 English,其他语言默认 English。 - **前端 i18n 切换**:语言切换后设置页、侧边栏、关于页等关键文案立即切换。 - **老用户兼容**:旧 `config.json` 缺少 `LanguageMode` / `LanguageID` 时可正常启动,并自动 fallback。 - **模型隔离**:本轮语言切换不引入 Moonshine / Parakeet / Qwen3-ASR,不改写或删除 SenseVoice 模型。 - **QA 资料**:新增 `02-P-NBL/round-2` 下 PRD、研发拆解、QA 计划、QA 报告和验收记录。 ### 构建 - build: `20260603.1145` - 说明: 本版本为 Round 2 QA 通过后的测试包候选,已完成老用户升级、新用户临时 HOME、语言切换、重启持久化、断网启动和断网真实语音输入复测。 --- ## v2.1.19 (2026-06-02) ### QA 候选包 - **Round 1 模型 Profile 架构基线**:将正式源码目录固定为 `privatevoice.src`,建立模型 profile、安装状态、resolver、staging 下载校验和旧 `models/sensevoice` fallback 基线,为后续 Moonshine / Parakeet / Qwen3-ASR 多模型扩展做准备。 - **模型下载安全性**:下载流程改为临时目录下载、staging 解压校验、安全替换;primary URL 下载到坏包时会继续尝试 fallback URL;失败时不删除已有可用模型。 - **启动状态可恢复**:engine 初始化区分缺模型和模型结构存在但不可加载,前端可通过 `EngineService.GetStatus()` 补查启动早期状态。 - **QA 资料**:新增 `02-P-NBL/round-1` 下 PRD、研发拆解、QA 计划、自查记录、预检记录和自动化测试日志。 ### 构建 - build: `20260602.2022` - 说明: 本版本为 Round 1 QA 测试包,尚需真机验证真实 SenseVoice 模型、麦克风权限、断网识别、replacement、历史写入、网络观察和 macOS 窗口/Dock smoke。 --- ## v2.1.18 (2026-06-01) ### 改进 - **统一权限页字体层级**:收敛权限页标题、摘要、权限项标题、按钮和状态文字的字号与字重,使其与其他设置页保持一致。 ### 构建 - build: `20260601.1905` --- ## v2.1.17 (2026-05-31) ### 改进 - **防止历史页清理菜单文案换行**:加宽底部“清理”下拉菜单,并保持清理选项单行显示,避免“清除已导出 CSV 的历史”断行。 ### 构建 - build: `20260531.1359` --- ## v2.1.16 (2026-05-31) ### 改进 - **调整历史页清理入口位置**:将“清理”菜单从顶部工具栏移动到底部分页区域左侧,减少顶部操作拥挤,并让清理确认提示跟随底部入口显示。 ### 构建 - build: `20260531.1131` --- ## v2.1.15 (2026-05-31) ### 改进 - **历史页增加基础分页与存储安全提示**:历史页改为后端分页加载,每页固定 100 条,并新增历史文件大小、打开所在文件夹、清除已导出 CSV 历史和基于全量统计的导出菜单状态。 - **用户词库列表增加基础分页**:词库页改为后端分页加载,每页固定 100 条,避免词库规则过多时一次性渲染整张列表。 ### 构建 - build: `20260531.1102` --- ## v2.1.14 (2026-05-31) ### 改进 - **统一应用内图标视觉**:设置页侧边栏、About 页和首次设置页改用与 Dock 一致的蓝色麦克风图标,移除 `P` / `V` 字母图标。 ### 构建 - build: `20260531.0120` --- ## v2.1.13 (2026-05-30) ### 改进 - **历史勘误 CSV 支持未处理增量导出**:历史记录新增 `exportedAt`,导出勘误 CSV 可选择“今天未处理 / 近 7 天未处理 / 全部未处理”,成功写入 CSV 后才标记本次历史,避免下次重复导出旧记录。 - **优化勘误表预览明细排序**:导入预览优先展示新增、冲突、无效、超限和重复等关键项,空项排到最后,摘要统计仍包含全部候选。 ### 构建 - build: `20260530.1949` --- ## v2.1.12 (2026-05-30) ### 改进 - **调整词库页导入导出按钮**:用户词库按钮改名为“导入用户词库 / 导出用户词库”并放在一起,“导入勘误表”移动到工具栏最右侧。 ### 构建 - build: `20260530.1800` --- ## v2.1.11 (2026-05-30) ### 改进 - **CSV 勘误表改为中文表头**:导出的勘误 CSV 使用 `记录ID`、`识别时间`、`识别历史文本`、`错误词/正确词` 等中文列名,样例行文案改为“正确的格式是点 CSV”,并保持导入端兼容旧版英文表头。 ### 构建 - build: `20260530.1757` --- ## v2.1.10 (2026-05-30) ### Bug 修复 - **修复历史保留时长不生效**:移除后端固定最多 50 条历史的硬截断,识别历史现在会按用户选择的 7 天、30 天、90 天或永久真实保留。 - **修复历史文件清理不及时**:新增历史、读取历史和切换保留时长时都会按当前保留规则清理过期记录,并同步保存到 `history.json`。 ### 改进 - **展示历史保存位置**:历史页面新增 `history.json` 保存路径展示,长路径单行省略但可复制完整路径,避免撑坏页面布局。 - **新增历史勘误 CSV 流程**:历史页可导出勘误 CSV,词库页可导入勘误表并先预览新增、重复、冲突、无效、空项和超限统计,确认后只追加新增规则。 - **增强词库写入安全**:CSV 勘误导入采用批量追加和写入失败整体回滚,避免半写入;新写入的 `history.json` 和 `userdict.json` 权限收紧到 `0600`。 ### 构建 - build: `20260530.1640` --- ## v2.1.9 (2026-05-28) ### 改进 - **产品改名为 PrivateVoice Input / 私语输入**:更新应用可见名称、窗口标题、打包元数据、启动项名称、单实例锁和系统数据目录。 - **更新 About 信息**:关于页展示“永远离线·稳定极速 / Private.Offline”以及 MIT License 二次开发声明和支持页面链接。 - **保留旧用户数据迁移**:新数据目录会从旧 `VoiceSnap` 应用支持目录迁移配置、词库、历史和模型文件,已存在的新文件不会被覆盖。 ### 构建 - build: `20260528.1206` --- ## v2.1.8 (2026-05-19) ### Bug 修复 - **修复长按松手后悬浮窗可能停在录音态**:松手后立即切到“识别中”,音频设备停止和采样转换改为后台执行,避免底层音频 stop 偶发卡住导致浮窗假死。 - **修复右 Alt 状态可能残留**:macOS 侧按键检测会用系统实时 Option flags 校正旧事件态,防止 release 事件异常时误判为仍在按住。 ### 构建 - build: `20260519.1818` --- ## v2.1.7 (2026-05-19) ### Bug 修复 - **修复多屏输入时悬浮动效跑到别的屏幕**:macOS 录音动效现在优先跟随当前辅助功能焦点窗口,其次跟随前台 App 窗口,再兜底鼠标所在屏幕。 ### 构建 - build: `20260519.1603` --- ## v2.1.6 (2026-05-18) ### Bug 修复 - **优化点按结束手感**:录音中第二次按下热键即刻停止,不再等到松开;“完成”状态自动隐藏缩短到 250ms。 - **修复 macOS 长按启动不稳**:右 Alt 的事件态不再 250ms 后过期,长按启动阈值调整为 180ms。 ### 构建 - build: `20260518.2229` --- ## v2.1.5 (2026-05-18) ### 改进 - **重做 macOS 录音悬浮动效**:从黑色胶囊改为透明无边界的蓝粉光波样式,保留中心跳动元素与录音计时。 - **优化多显示器定位**:拖拽保存、启动还原和默认显示位置按对应屏幕处理,避免副屏或垂直排列屏幕下悬浮窗跳回主屏。 ### 构建 - build: `20260518.2205` --- ## v2.1.4 (2026-05-18) ### 改进 - **更新 macOS App 图标**:采用最终确认的 B 版白底蓝色麦克风矢量图标,并保留轻微麦克风层次阴影,重新生成 PNG、iconset 和 `icon.icns`。 ### 构建 - build: `20260518.1748` --- ## v2.1.3 (2026-05-18) ### 新功能 - **语音输入方式可选**:设置页新增“点按 / 长按”模式。点按模式下,点一下快捷键开始说话,再点一下结束并输入;长按模式下,按住快捷键开始说话,松开后结束并输入。 ### 改进 - 热键状态机拆分为清晰的点按与长按逻辑,避免短按/长按自动判断造成交互不确定。 ### 构建 - build: `20260518.1651` --- ## v2.1.2 (2026-05-18) ### Bug 修复 - **全屏窗口下悬浮指示器不显示**:macOS 悬浮指示器从普通 `NSWindow` 调整为非激活 `NSPanel`,窗口层级提升到状态栏级别,并补充 `Transient` / `IgnoresCycle` / `FullScreenAuxiliary` / `CanJoinAllSpaces` 行为,确保任意 App 全屏 Space 下也能显示录音胶囊。 ### 构建 - build: `20260518.1623` --- ## v2.1.1 (2026-02-27) ### Bug 修复 - **设置开关闪烁错误值**:开机自启动、音效反馈、自动隐藏等开关在后端数据加载完成前不渲染,避免先显示默认值再跳变 - **开机自启动开关重启后显示未开启**:开关区域加 loading 守卫,后端返回真实状态后才渲染 - **历史保留天数重启后回退默认**:保留天数选择器同样加 loading 守卫 - **热键显示为"Ctrl"而非"R-Ctrl"**:启动时从后端加载真实热键名称,默认右 Ctrl 正确显示为 R-Ctrl --- ## v2.2.0 (2026-02-26) ### 新功能 - **macOS 支持** — 跨平台正式支持 macOS,与 Windows 功能对齐 - 原生 AppKit + CoreGraphics 浮动指示器(胶囊样式,与 Windows 一致) - NSEvent 全局监听 + CGEventSource 修饰键轮询实现全局热键 - CGEvent 模拟按键实现文字粘贴 - 兼容 macOS 26,首次启动引导授予辅助功能权限 - **关于页添加 GitHub 链接** — 点击可直接跳转项目仓库 ### 改进 - 移除旧版 C# 项目(VoiceSnap.Engine、VoiceSnapWPF),仓库仅保留 Go 版本 - README 更新为跨平台文档 --- ## v2.1.0 (2026-02-26) ### Bug 修复 - **开机自启动开关不记忆**:重启后开关状态从后端(注册表)加载,不再恢复默认值 - **历史保留时长不记忆**:修复"永久保留"(0天) 重启后回退为 30 天的问题 - **设置项初始值不同步**:音效反馈、自动隐藏开关也从后端加载真实状态 - **F10/F11/F12 快捷键名称错误**:F10 显示为 "F:" 等乱码,改用 Sprintf 正确显示 ### 新功能 - **语气词自动过滤**:识别结果自动去除"嗯、啊、呃、额、哦"等中文语气词和 um/uh/hmm 等英文填充词 - **自由对讲静音自动停止**:连续 3 秒无声自动结束录音并识别(含 2 秒开头保护期),无需手动按键停止 - **胶囊指示器 DPI 自适应**:根据系统 DPI 缩放胶囊大小、字体、动画,高分屏不再显示过小 --- ## v2.0.0 (2026-02-15) — Go 跨平台重写 VoiceSnap 2.0 使用 Go + Wails v3 + Svelte 从零重写,目标是更小体积、更优体验、未来跨平台。 ### 重写亮点 - **全新技术栈**:从 C# WPF/.NET 8 迁移至 Go + Wails v3 + Svelte 5 - **体积缩减 57%**:运行文件从 ~80 MB 降至 ~34 MB(不含模型) - **内存优化**:~400 MB(含模型),相比 WPF 版 ~500 MB - **Apple Design UI**:全新设计语言,白色卡片 + #f2f2f7 分组背景 + SVG 图标 - **原生浮动指示器**:Win32 GDI+ Layered Window,无焦点抢夺 ### 新功能 - **两种输入模式**:长按说话 + 短按自由说话(WPF 版仅长按) - **录音音效反馈**:马林巴风格双音提示(开始升调、完成降调),可在设置中关闭 - **录音时长显示**:指示器实时显示录音计时(0:00 格式),长按和自由说话模式均支持 - **Escape 取消录音**:录音中按 Esc 立即取消,比组合键更直觉 - **剪贴板保护**:粘贴前保存旧剪贴板内容,粘贴后自动恢复 - **识别历史**:自动保存最近 50 条识别结果,支持复制、单条删除、清除所有,可设置保留时长(7/30/90天/永久) - **麦克风设备选择**:下拉菜单列出所有输入设备,点击切换,选择自动保存 - **中英混合优化**:识别后自动在中英文/数字之间插入空格,句首字母自动大写,清理 SenseVoice 特殊标记 - **指示器位置记忆**:浮动指示器支持鼠标拖拽,位置自动保存到配置文件,下次启动恢复 - **隐私声明**:关于页展示离线/无需注册/开源三条隐私保证,让用户安心 - **中英双语界面**:自动跟随系统语言,托盘菜单同步本地化 - **自定义快捷键**:支持 Ctrl / Alt / Shift / 功能键 / 字母键 / 空格等 ### 技术细节 | 模块 | 实现 | |---|---| | 音频录制 | malgo (miniaudio),16kHz/16-bit/mono PCM | | 语音识别 | sherpa-onnx SenseVoice,DirectML GPU → CPU 自动回退 | | 全局热键 | GetAsyncKeyState 30ms 轮询,支持长按/短按/组合键过滤 | | 文字粘贴 | Win32 剪贴板 + SendInput Ctrl+V,失败回退 Unicode SendInput | | 浮动指示器 | Win32 GDI+ Layered Window,WS_EX_NOACTIVATE + TOPMOST,可拖拽 + 位置记忆 | | 文本后处理 | CJK/ASCII 边界自动加空格,句首大写,特殊标记清理 | | 音效合成 | Go 程序化生成 WAV (48kHz, 基频+谐波+指数衰减),winmm.dll PlaySound | | 识别历史 | JSON 文件持久化,最多 50 条,按保留天数自动清理 | | 前端 | Svelte 5 + Vite 6 + TypeScript,~80 KB 产物 | | 配置 | JSON 格式,兼容 WPF 版 config.json | ### 与 v1.x WPF 版对比 | | v2.0 Go | v1.3.2 WPF | |---|---|---| | 运行文件体积 | ~34 MB | ~80 MB | | 运行内存 | ~400 MB | ~500 MB | | 自由说话模式 | 有 | 无 | | 录音音效 | 有(可关闭) | 无 | | 录音计时 | 有 | 无 | | Esc 取消 | 有 | 无 | | 剪贴板保护 | 有 | 无 | | 识别历史 | 有(50条) | 无 | | 麦克风切换 | 有 | 无 | | 中英混合优化 | 有(自动加空格+大写) | 无 | | 指示器拖拽 | 有(位置记忆) | 无 | | 多语言 UI | 中/英 | 中/英 | | 跨平台 | Windows + macOS | 仅 Windows | --- ## v1.3.2 (2026-01-21) — WPF 版 - 全链路异步化:识别+粘贴移至后台线程,彻底消除 UI 卡顿 - 彻底移除 Python 依赖:纯原生 C# + C++ 引擎 - 原生剪贴板重构:Win32 API,解决 CLIPBRD_E_CANT_OPEN - 新增"模拟打字"模式:解决同花顺等终端无法粘贴 - 焦点保护:WS_EX_NOACTIVATE - 自动集成 VC++ Redistributable DLL ## v1.3.1 (2026-01-02) — WPF 版 - 修复剪贴板偶发锁定 - 修复 Ctrl 键与粘贴操作冲突 - 修复 ONNX Stream 内存泄漏 - 新增安全粘贴机制 - 新增空闲 30 秒自动内存回收 ## v1.3.0 — WPF 版 - 新增 DirectML 硬件加速 - 新增应用内自动更新 - 新增 VAD 能量检测 - 新增音频设备热插拔支持 - 新增双地址模型下载备份