# Round 2 QA 报告:语言检测与语言版本设置 状态:功能性 QA PASS,可进入下一步交付门禁 日期:2026-06-03 测试人:Codex ## 1. 测试对象 | 项目 | 内容 | |---|---| | worktree | `/Users/ar/Projects/VoiceSnap-2.1.1-Round2` | | branch | `codex/round2-language-settings` | | 实现基线 commit | `516375d` | | 最终测试包 commit | 以 `RELEASE_MANIFEST.md` 为准 | | version | `2.1.20` | | build | `20260603.1145` | | 本地 App | `privatevoice.src/build/local/arm64/PrivateVoice Input.app` | | 本地 DMG | 最终路径以 `RELEASE_MANIFEST.md` 为准 | | DMG SHA256 | 最终 SHA256 以 `RELEASE_MANIFEST.md` 为准 | ## 2. 自动化与构建结果 | 项目 | 结果 | 证据 | |---|---|---| | `npm run build` | PASS | `logs/npm-run-build-20260603.log` | | `go test ./... -count=1` | PASS | `logs/go-test-all-20260603.log` | | 本地 App 构建与签名 | PASS | `logs/qa-runtime/build-local-round2-20260603.014931.log` | | 本地 DMG verify | PASS | `logs/qa-runtime/build-local-round2-20260603.014931.log` | 说明:前端构建仍有既有 Svelte a11y warning,来源为旧组件 `UpdateDialog.svelte`、`ToggleSwitch.svelte`,本轮未新增阻断。 ## 3. 真机测试结果 | ID | 场景 | 结果 | 证据 | |---|---|---|---| | R2-QA-001 | 老配置升级,无 `LanguageMode` / `LanguageID` | PASS | baseline config 无语言字段;Round 2 App 正常启动 | | R2-QA-002 | 中文系统 auto | PASS | `config.json` 默认 `LanguageMode=auto`、`LanguageID=zh-CN` | | R2-QA-003 | English 系统 auto | PASS by automated test | `go test ./...` 覆盖 detector normalize | | R2-QA-004 | 其他系统语言 auto fallback | PASS by automated test | `go test ./...` 覆盖 fallback 到 English | | R2-QA-005 | 手动中文 | PASS | `round2-screen-20260603.014931-zh-manual.png`;配置写入 `manual/zh-CN` | | R2-QA-006 | 手动 English | PASS | `round2-screen-20260603.014931-english6.png`;配置写入 `manual/en` | | R2-QA-007 | 切回自动 | PASS | `round2-screen-20260603.014931-chinese.png`;配置写入 `auto/zh-CN` | | R2-QA-008 | 重启持久化 | PASS | 重启后配置仍为 `manual/zh-CN` | | R2-QA-009 | 非法 LanguageMode fallback | PASS by automated test | `go test ./...` | | R2-QA-010 | 非法 LanguageID fallback | PASS by automated test | `go test ./...` | | R2-QA-011 | 语言切换不改模型 | PASS | `SelectedModelID` 始终为 `sensevoice-zh` | | R2-QA-012 | 已有模型时语言切换不下载模型 | PASS | 真实用户模型 hash 不变;日志未出现因语言切换触发下载 | | R2-QA-013 | 语言切换不删模型 | PASS | `model.int8.onnx`、`tokens.txt` hash 与 baseline 一致 | | R2-QA-014 | 词库保留 | PASS | `userdict.json` hash 与 baseline 一致;replacement 数量 149 | | R2-QA-015 | 历史保留 | PASS | `history.json` hash 与 baseline 一致;entries 数量 1708 | | R2-QA-016 | 热键保留 | PASS | config 热键字段未丢失;断网真实语音输入已用 `R-Alt` 触发成功 | | R2-QA-017 | 断网已有模型识别 | PASS | `logs/qa-runtime/offline-voice-final-20260603.014931.log`;断网期间识别并写入 history | | R2-QA-018 | UI 不暴露新模型 | PASS | 设置页只显示现有 SenseVoice 引擎 | | R2-QA-019 | English UI 文案 | PASS | `round2-screen-20260603.014931-english6.png` | | R2-QA-020 | 中文 UI 文案 | PASS | `round2-screen-20260603.014931-zh-manual.png` | ## 4. 数据完整性 测试前已备份真实用户数据: `/Users/ar/Projects/VoiceSnap-2.1.1-Round2/QA-backups/round2-pre-qa-20260603.014931` 语言切换阶段完成后,以下文件与 baseline SHA256 完全一致: - `userdict.json` - `history.json` - `models/sensevoice/model.int8.onnx` - `models/sensevoice/tokens.txt` `config.json` 有预期变化:新增/写入 `LanguageMode`、`LanguageID`、`SelectedModelID`。 断网真实语音输入复测后,`history.json` 出现预期变化:新增一条识别记录。 ## 5. 新用户测试 使用临时 HOME 启动本地 App,未挪动真实 App Support: `logs/qa-runtime/new-user-home-20260603.014931` 结果: - 新用户默认配置为 `LanguageMode=auto`、`LanguageID=zh-CN`、`SelectedModelID=sensevoice-zh`。 - 干净用户首次启动会自动下载 SenseVoice;下载发生在临时 QA 目录,不影响真实用户模型目录。 - 下载完成后 ASR engine ready。 ## 6. 断网启动检查 证据:`logs/qa-runtime/offline-start-check-20260603.014931.log` 结果: - Wi-Fi 从 On 切到 Off。 - `curl https://www.apple.com` 返回 `Could not resolve host`,确认断网。 - 断网状态下重启本地 App。 - App 使用已有真实 SenseVoice 模型启动,日志显示 `ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)`。 - Wi-Fi 已恢复为 On。 ## 7. 断网真实语音输入复测 证据:`logs/qa-runtime/offline-voice-final-20260603.014931.log` 结果: - Wi-Fi 从 On 切到 Off。 - 断网探测返回 `Could not resolve host: www.apple.com`。 - 用户在断网窗口内按住 `R-Alt` 说测试句。 - 日志显示 2026-06-03 11:40:36 开始录音,2026-06-03 11:40:41 停止录音并完成识别。 - 识别文本:`这是 mac 电脑用 SenseVoice 做离线识别。` - `history.json` 条目数从 1710 增加到 1711。 - `history.json` 最新条目 `entries[0]` 为:`这是 mac 电脑用 SenseVoice 做离线识别。` - Wi-Fi 已恢复为 On,并通过联网探测。 ## 8. 阻断项 无。 ## 9. 当前结论 Round 2 的语言设置、i18n 切换、持久化、新用户默认值、老用户数据保护、模型不破坏、断网启动均通过。 Round 2 功能性 QA PASS。