config.json 缺少 LanguageMode / LanguageID 时可正常启动,并自动 fallback。02-P-NBL/round-2 下 PRD、研发拆解、QA 计划、QA 报告和验收记录。20260603.1145privatevoice.src,建立模型 profile、安装状态、resolver、staging 下载校验和旧 models/sensevoice fallback 基线,为后续 Moonshine / Parakeet / Qwen3-ASR 多模型扩展做准备。EngineService.GetStatus() 补查启动早期状态。02-P-NBL/round-1 下 PRD、研发拆解、QA 计划、自查记录、预检记录和自动化测试日志。20260602.2022icon.icns。20260518.174820260518.1651NSWindow 调整为非激活 NSPanel,窗口层级提升到状态栏级别,并补充 Transient / IgnoresCycle / FullScreenAuxiliary / CanJoinAllSpaces 行为,确保任意 App 全屏 Space 下也能显示录音胶囊。20260518.1623VoiceSnap 2.0 使用 Go + Wails v3 + Svelte 从零重写,目标是更小体积、更优体验、未来跨平台。
| 模块 | 实现 |
|---|---|
| 音频录制 | 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 |
| v2.0 Go | v1.3.2 WPF | |
|---|---|---|
| 运行文件体积 | ~34 MB | ~80 MB |
| 运行内存 | ~400 MB | ~500 MB |
| 自由说话模式 | 有 | 无 |
| 录音音效 | 有(可关闭) | 无 |
| 录音计时 | 有 | 无 |
| Esc 取消 | 有 | 无 |
| 剪贴板保护 | 有 | 无 |
| 识别历史 | 有(50条) | 无 |
| 麦克风切换 | 有 | 无 |
| 中英混合优化 | 有(自动加空格+大写) | 无 |
| 指示器拖拽 | 有(位置记忆) | 无 |
| 多语言 UI | 中/英 | 中/英 |
| 跨平台 | Windows + macOS | 仅 Windows |