# Round 1 QA 报告 - 2.1.19 状态:功能性 QA PASS,可进入用户验收;正式公开分发仍需 Developer ID 签名和 notarization 日期:2026-06-02 测试包:PrivateVoice Input 2.1.19 build 20260602.2022 ## 1. 测试对象 | 项目 | 内容 | |---|---| | QA 包目录 | `/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/Release/PrivateVoice-Input-2.1.19-build20260602.2022` | | manifest | `/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md` | | 源码 commit | `f4194105fe06baa18f0145cc59e1914f96f2d4cb` | | tag | `v2.1.19-build20260602.2022` | | 安装架构 | arm64 | | 安装方式 | 覆盖安装到 `/Applications/PrivateVoice Input.app` | ## 2. 安装前基线 旧版 App: - version:`2.1.18` - build:`20260601.1905` - bundle id:`com.privatevoice.input` - 签名:`PrivateVoice Local Code Signing` - 旧版进程运行中,PID 后续已退出。 用户数据: | 项目 | 结果 | |---|---| | 数据目录 | `/Users/ar/Library/Application Support/PrivateVoice Input` | | 数据目录大小 | 235 MB | | 旧模型目录 | `models/sensevoice` | | `config.json` | 存在 | | `userdict.json` | 存在,146 条 replacement | | `history.json` | 存在,安装前 1640 条历史 | 备份: ```text /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-upgrade-20260602.2030 ``` ## 3. 覆盖安装结果 结论:PASS。 已执行: - 退出旧版 `PrivateVoice Input`。 - 挂载 arm64 DMG。 - 复制 `PrivateVoice Input.app` 到 `/Applications`。 - 验证 `/Applications/PrivateVoice Input.app` 的 Info.plist 和 codesign。 安装后 App 元数据: - `CFBundleShortVersionString = 2.1.19` - `CFBundleVersion = 20260602.2022` - `CFBundleIdentifier = com.privatevoice.input` - `LSUIElement = true` - `LSMinimumSystemVersion = 11.0` 签名验证: ```text /Applications/PrivateVoice Input.app: valid on disk /Applications/PrivateVoice Input.app: satisfies its Designated Requirement ``` ## 4. 启动与旧模型 fallback 结论:PASS。 启动日志确认: ```text PrivateVoice Input starting... version=2.1.19 build=20260602.2022 Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice Engine initialized: SenseVoice · CoreML (Apple Neural Engine) ASR engine ready: SenseVoice · CoreML (Apple Neural Engine) ``` 判断: - 新版 `sensevoice-zh` profile 成功 fallback 到旧目录 `models/sensevoice`。 - 没有要求用户重新下载模型。 - `models/state.json` 不存在时 fallback 路径正常。 ## 5. 用户数据保留 结论:PASS。 升级后关键哈希: | 文件 | 结果 | |---|---| | `config.json` | 与安装前一致 | | `userdict.json` | 与安装前一致 | | `models/sensevoice/model.int8.onnx` | 与安装前一致 | | `models/sensevoice/tokens.txt` | 与安装前一致 | | `history.json` | 发生变化,符合新增识别历史预期 | 升级后统计: - replacement:146 条,保留。 - 历史:从 1640 条增加到 1656 条。 - replacement 补测阶段人工新增 3 条规则,当前 replacement 为 149 条;这属于 QA 补测操作,不属于安装过程改写用户数据。 ## 6. 权限与真实录音识别 结论:PASS。 日志确认: - Accessibility permission granted。 - Keyboard event tap started。 - R-Alt 热键触发录音。 - Audio device started / stopped。 - ASR engine ready 后完成真实识别。 真实输入证据: ```text Recognized: 说完了。 ``` 历史写入证据: - 历史条数从 1640 增加到 1641,再增加到 1642,后续继续增加到 1656。 - `history.json` 最新记录包含真实识别文本。 说明: - 麦克风权限未弹窗,但真实录音成功,说明当前本机权限可用。 - 自动上屏路径由用户实际用 VoiceSnap 回复文本间接验证。 ## 7. 网络观察 结论:PASS。 观察方式: ```bash lsof -nP -a -i -p ``` 采样时间: ```text 2026-06-02 22:09:47 - 22:10:17 ``` 结果: - 30 次采样均未发现 `PrivateVoice Input` 进程持有网络 socket。 - 采样期间发生一次真实录音识别。 日志文件: ```text /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log ``` ## 8. 物理断网启动识别 结论:PASS。 执行方式: - 用户在本机手动关闭网络。 - QA 脚本触发 App 退出并重新启动。 - App 重启后,用户使用 R-Alt 进行真实语音输入。 - 用户恢复网络后,QA 复核 App 日志、进程启动时间、历史记录和当前网络 socket。 App 重启证据: ```text PrivateVoice Input 当前进程: PID 38909 启动时间 Tue Jun 2 22:59:09 2026 ``` 启动日志证据: ```text [2026-06-02 22:59:09] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 [2026-06-02 22:59:10] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice [2026-06-02 22:59:16] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine) [2026-06-02 22:59:16] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine) ``` 真实识别证据: ```text [2026-06-02 22:59:19] INFO Recording started [2026-06-02 22:59:25] INFO Recording stopped, 100800 samples captured [2026-06-02 22:59:25] INFO Recognized: 这是 mac 电脑用 SenseVoice 做离线识别。 ``` 历史写入证据: ```text history.json 最新记录: 这是 mac 电脑用 SenseVoice 做离线识别。 ``` 网络证据边界: - 本轮断网期间的监控脚本在初始网络状态后中断,没有留下连续 socket 采样。 - 断网动作由用户手动执行,测试句在用户恢复网络后回传确认。 - 之前已有 30 秒识别期间无网络 socket 的独立采样,本轮恢复网络后复核 `PrivateVoice Input` 当前进程也无网络 socket。 日志文件: ```text /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log ``` 判断: - 断网后 App 可以重新启动。 - 断网后旧模型 fallback 仍可加载 SenseVoice。 - 断网后真实录音、识别、replacement 和历史写入链路可用。 ## 9. replacement 验证 结论:PASS。 已通过: - 覆盖安装后用户词库文件保留。 - 覆盖安装后原有 146 条 replacement 规则保留。 - 升级后未损坏 `userdict.json`。 - 补充规则并重启 App 后,真实识别链路中出现 replacement 后文本。 补测过程: - 备份补测前用户词库:`/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/userdict-before-replacement-rules-20260602.2216.json` - 人工新增 3 条规则: - `麦 ac -> Mac` - `ss voiceice -> SenseVoice` - `sin voice -> SenseVoice` - 当前 replacement 数量:149 条。 - 重启 App 后重新测试 SenseVoice 离线识别。 真实输入证据: ```text 这是 mac 电脑用 SenseVoice 做离线识别。 ``` 历史写入证据: ```text history.json 最新记录包含: 好了。 这是 mac 电脑用 SenseVoice 做离线识别。 这是Mac 电脑用 sing voice 做离线识别。 这是咩卖。 ``` 判断: - replacement 引擎在真实识别链路中可触发。 - 原始失败更像是规则覆盖不足,不是 replacement 引擎失效。 - `sing voice -> SenseVoice` 是后续可补充的词库覆盖项,不阻塞 Round 1 模型 profile QA。 ## 10. 新用户干净安装 结论:PASS。 执行方式: - 备份当前真实用户数据目录。 - 退出 App。 - 将 `/Users/ar/Library/Application Support/PrivateVoice Input` 临时移动到隔离目录。 - 启动 `/Applications/PrivateVoice Input.app`,模拟完全没有历史、词库和模型的新用户。 - 记录首启文件、模型下载、引擎初始化、网络 socket、App 日志。 - 测试完成后恢复原用户数据目录并重启 App。 备份与隔离: ```text 完整备份: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-clean-install-20260602.231851 原数据临时隔离: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-20260602.231851 新用户测试生成的数据: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/new-user-generated-data-20260602.231851 ``` 新用户首启结果: ```text 启动时间:2026-06-02 23:19:19 新数据目录大小:228 MB 生成文件: app.log config.json userdict.json models/state.json models/sensevoice-zh/model.int8.onnx models/sensevoice-zh/tokens.txt ``` 首启日志证据: ```text [2026-06-02 23:19:19] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 [2026-06-02 23:19:19] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[] [2026-06-02 23:19:19] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip [2026-06-02 23:19:27] INFO Extracting model archive... [2026-06-02 23:19:27] INFO Model download and extraction complete [2026-06-02 23:19:27] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh [2026-06-02 23:19:30] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine) [2026-06-02 23:19:30] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine) ``` 网络行为: ```text PrivateVoice Input 打开到 http://www.maikami.com/voicesnap/sensevoice.zip 的 HTTP 连接。 ``` 判断: - 新用户无本地模型时,App 会自动下载默认 SenseVoice 模型。 - 下载完成后模型落在新 profile 目录 `models/sensevoice-zh`。 - 新用户首启后可以完成 SenseVoice 初始化。 - 首次初始化失败日志中的 missing path 指向旧目录 `models/sensevoice`,但后续下载和 `sensevoice-zh` 初始化成功;这是日志可读性问题,不是本轮功能阻断。 首轮遗留与补测结果: - 2026-06-02 首轮测试中,60 秒轮询期间没有采集到新用户状态下的真实语音输入。 - 2026-06-03 重新执行补测,已采集到新用户状态下的真实语音输入和历史写入。 2026-06-03 补测: ```text 备份: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-recognition-20260603.005122 原数据临时隔离: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-recognition-20260603.005122 新用户测试生成的数据: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/new-user-generated-data-20260603.005122 ``` 补测首启日志: ```text [2026-06-03 00:51:42] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 [2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip [2026-06-03 00:51:50] INFO Extracting model archive... [2026-06-03 00:51:51] INFO Model download and extraction complete [2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh [2026-06-03 00:51:53] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine) ``` 补测真实识别与历史写入证据: ```text [2026-06-03 00:54:33] INFO Recognized: 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。 [2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢? [2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。 [2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。 新用户 history.json: 4 条记录,最新记录为: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。 ``` 恢复结果: ```text 2026-06-02 首轮恢复时间:2026-06-02 23:22:04 2026-06-03 补测恢复时间:2026-06-03 00:55:54 恢复后数据目录大小:235 MB 恢复后历史:1676 条 恢复后 replacement:149 条 恢复后模型目录:models/sensevoice 恢复后 App 重新加载 SenseVoice 成功。 ``` 日志文件: ```text /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log ``` ## 11. 窗口 / Dock smoke 结论:PASS。 检查结果: ```text System Events process: PrivateVoice Input background only=false visible=true frontmost=false windows=2 LSUIElement=true ``` 判断: - App 进程存在。 - Dock 隐藏配置存在。 - 当前至少有窗口对象,未发现启动后无窗口/无进程问题。 ## 12. 验证矩阵 | 项目 | 状态 | 原因 | |---|---|---| | replacement 真实触发 | PASS | 补充规则并重启后,真实识别链路出现 `SenseVoice` 替换结果 | | 完整断网启动识别 | PASS | 用户手动断网后 App 重启、SenseVoice 初始化、真实识别和历史写入均成功 | | 新用户干净安装 | PASS | 首启、下载、安装、初始化、第一次真实识别和历史写入均通过 | | Developer ID / notarization | NOT RUN | 当前包是本地签名 QA 包 | ## 13. QA 结论 当前结论: ```text 2.1.19 Round 1 QA 包功能性 QA PASS,可进入用户验收;正式公开分发仍需 Developer ID 签名和 notarization。 ``` 已通过的核心项: - 可回滚构建链路:commit + tag + manifest + SHA256。 - 覆盖安装。 - 旧用户数据保留。 - 旧模型 fallback。 - CoreML SenseVoice 初始化。 - 真实录音识别。 - 历史写入。 - 识别期间无网络 socket。 - 物理断网后启动和识别。 - 新用户首启自动下载模型并初始化。 - 新用户第一次真实识别和历史写入。 - 基础窗口 / Dock smoke。 不属于本地功能 QA、但正式分发前仍需完成的项目: - Developer ID 签名和 notarization。