edit | blame | history | raw

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 条历史

备份:

/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

签名验证:

/Applications/PrivateVoice Input.app: valid on disk
/Applications/PrivateVoice Input.app: satisfies its Designated Requirement

4. 启动与旧模型 fallback

结论:PASS。

启动日志确认:

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 后完成真实识别。

真实输入证据:

Recognized: 说完了。

历史写入证据:

  • 历史条数从 1640 增加到 1641,再增加到 1642,后续继续增加到 1656。
  • history.json 最新记录包含真实识别文本。

说明:

  • 麦克风权限未弹窗,但真实录音成功,说明当前本机权限可用。
  • 自动上屏路径由用户实际用 VoiceSnap 回复文本间接验证。

7. 网络观察

结论:PASS。

观察方式:

lsof -nP -a -i -p <PrivateVoice Input PID>

采样时间:

2026-06-02 22:09:47 - 22:10:17

结果:

  • 30 次采样均未发现 PrivateVoice Input 进程持有网络 socket。
  • 采样期间发生一次真实录音识别。

日志文件:

/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 重启证据:

PrivateVoice Input 当前进程:
PID 38909
启动时间 Tue Jun 2 22:59:09 2026

启动日志证据:

[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)

真实识别证据:

[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 做离线识别。

历史写入证据:

history.json 最新记录:
这是 mac 电脑用 SenseVoice 做离线识别。

网络证据边界:

  • 本轮断网期间的监控脚本在初始网络状态后中断,没有留下连续 socket 采样。
  • 断网动作由用户手动执行,测试句在用户恢复网络后回传确认。
  • 之前已有 30 秒识别期间无网络 socket 的独立采样,本轮恢复网络后复核 PrivateVoice Input 当前进程也无网络 socket。

日志文件:

/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 离线识别。

真实输入证据:

这是 mac 电脑用 SenseVoice 做离线识别。

历史写入证据:

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。

备份与隔离:

完整备份:
/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

新用户首启结果:

启动时间: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

首启日志证据:

[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)

网络行为:

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 补测:

备份:
/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

补测首启日志:

[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)

补测真实识别与历史写入证据:

[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 条记录,最新记录为:
我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。

恢复结果:

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 成功。

日志文件:

/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。

检查结果:

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 结论

当前结论:

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。