Ariver
2026-07-02 abb469859662c285fac758c042812e0da943728f
Create slim PrivateVoice2 handoff package
4 files modified
347 files renamed
21 files added
937 ■■■■ changed files
.gitignore 23 ●●●●● patch | view | raw | blame | history
AGENTS.md 66 ●●●●● patch | view | raw | blame | history
C1.source/privatevoice.src/Taskfile.yml patch | view | raw | blame | history
C1.source/privatevoice.src/app.go patch | view | raw | blame | history
C1.source/privatevoice.src/app_live_caption_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/build/Taskfile.yml patch | view | raw | blame | history
C1.source/privatevoice.src/build/config.yml patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/Info.plist patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/Taskfile.yml patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/VoiceSnap-approved.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/VoiceSnap-macos26-mic.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/VoiceSnap-refined-mic.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/VoiceSnap-selected-B-shadow.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/app_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/app_icon_source.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/approved_app_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/archive/legacy-icons/VoiceSnap-original.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/en.lproj/InfoPlist.strings patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/entitlements-appstore.plist patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/entitlements.plist patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/icon.icns patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/macos26_mic_app_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/original_app_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/refined_mic_app_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/tray_icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/build/darwin/zh-Hans.lproj/InfoPlist.strings patch | view | raw | blame | history
C1.source/privatevoice.src/build/linux/privatevoice-input.desktop patch | view | raw | blame | history
C1.source/privatevoice.src/build/windows/Taskfile.yml patch | view | raw | blame | history
C1.source/privatevoice.src/build/windows/icon.ico patch | view | raw | blame | history
C1.source/privatevoice.src/build/windows/wails.exe.manifest patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_A_pure-blue-mic.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_A_pure-blue-mic.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_shadow_preview.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_shadow_preview.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_thin-blue-glyph.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_thin-blue-glyph.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_C_taglauncher-style.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_C_taglauncher-style.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.svg patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_candidates_preview.png patch | view | raw | blame | history
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_candidates_preview.svg patch | view | raw | blame | history
C1.source/privatevoice.src/embed.go patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/index.html patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/instructions.md patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/package-lock.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/package.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/App.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/assets/app-icon.png patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/indicator/FloatingIndicator.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/onboarding/OnboardingView.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/AboutPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/CorrectionImportPreviewDialog.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/GeneralPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/HistoryPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/HotkeysPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/LanguagePage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/PermissionsPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/SettingsWindow.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/settings/UserDictPage.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/shared/AppIcon.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/shared/ToggleSwitch.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/components/update/UpdateDialog.svelte patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/de.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/en.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/es.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/fr.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/index.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/it.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/ja.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/ko.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/pt.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/i18n/zh.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/stores/app.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/stores/config.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/stores/indicator.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/lib/stores/update.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/main.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/styles/global.css patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/src/vite-env.d.ts patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/svelte.config.js patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/tsconfig.json patch | view | raw | blame | history
C1.source/privatevoice.src/frontend/vite.config.ts patch | view | raw | blame | history
C1.source/privatevoice.src/go.mod patch | view | raw | blame | history
C1.source/privatevoice.src/go.monterey.mod patch | view | raw | blame | history
C1.source/privatevoice.src/go.monterey.sum patch | view | raw | blame | history
C1.source/privatevoice.src/go.sum patch | view | raw | blame | history
C1.source/privatevoice.src/instructions.md patch | view | raw | blame | history
C1.source/privatevoice.src/internal/audio/recorder.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/audio/recorder_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/config/config.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/config/config_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv_e2e_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/dock/dock.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/dock/dock_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/dock/dock_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_monterey.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_monterey_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_darwin_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_linux.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/engine_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/engine/release_tail.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/history/history.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/history/history_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/hotkey/hotkey.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/hotkey/hotkey_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/hotkey/hotkey_linux.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/hotkey/hotkey_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/input/paste.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/input/paste_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/input/paste_darwin_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/input/paste_linux.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/input/paste_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/language/detect.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/language/detect_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/language/detect_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/language/language_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/language/resolver.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/logger/logger.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/build_capabilities.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/build_capabilities_default.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/build_capabilities_monterey.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/build_capabilities_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/downloader.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/install_state.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/model_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/profile.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/registry.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/resolver.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/model/validator.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/modelselection/selection.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/modelselection/selection_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/overlay/overlay.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/overlay/overlay_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/overlay/overlay_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/overlay/overlay_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/paths/paths.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/permissions/permissions.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/permissions/permissions_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/permissions/permissions_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/singleinstance/singleinstance.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/singleinstance/singleinstance_unix.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/singleinstance/singleinstance_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/sound/sound_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/sound/sound_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/startup/startup.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/startup/startup_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/startup/startup_darwin_appstore.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/startup/startup_linux.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/startup/startup_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/textproc/textproc.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/textproc/textproc_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/updater/updater.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/userdict/userdict.go patch | view | raw | blame | history
C1.source/privatevoice.src/internal/userdict/userdict_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/locale_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/locale_windows.go patch | view | raw | blame | history
C1.source/privatevoice.src/main.go patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/QA-WINDOWS-PREVIEW.ps1 patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/RUN-WINDOWS-QA.cmd patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-appstore-developerid-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-appstore-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-local-macos-monterey.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-local-macos-universal.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-local-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-macappstore-pkg-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-release-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/build-windows-preview.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/install-x-asr-zh-en-960ms.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/qa-settings-window-macos.sh patch | view | raw | blame | history
C1.source/privatevoice.src/scripts/verify-windows-qa-evidence.sh patch | view | raw | blame | history
C1.source/privatevoice.src/services/app_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/audio_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/config_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/correction_csv_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/engine_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/engine_service_qwen3_default_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/engine_service_qwen3_monterey_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/engine_service_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/engine_service_windows_test.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/history_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/hotkey_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/permission_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/updater_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/services/userdict_service.go patch | view | raw | blame | history
C1.source/privatevoice.src/system_load_darwin.go patch | view | raw | blame | history
C1.source/privatevoice.src/system_load_other.go patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/README.md patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-incomplete-missing-model/sensevoice-zh/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-incomplete-missing-tokens/sensevoice-zh/model.int8.onnx patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-valid-legacy/sensevoice/model.int8.onnx patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-valid-legacy/sensevoice/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-valid-new/sensevoice-zh/model.int8.onnx patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-valid-new/sensevoice-zh/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/models-zero-byte/sensevoice-zh/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-invalid-json/state.json patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/broken/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/sensevoice/model.int8.onnx patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/sensevoice/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/state.json patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/sensevoice/model.int8.onnx patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/sensevoice/tokens.txt patch | view | raw | blame | history
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/state.json patch | view | raw | blame | history
C1.source/privatevoice.src/voicesnap.rc patch | view | raw | blame | history
C1.source/privatevoice.src/wails.json patch | view | raw | blame | history
C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/RELEASE_MANIFEST.md 66 ●●●●● patch | view | raw | blame | history
C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/SHA256SUMS.txt 4 ●●●● patch | view | raw | blame | history
C2.builds/README.md 9 ●●●●● patch | view | raw | blame | history
C3.tools/README.md 19 ●●●●● patch | view | raw | blame | history
CODEGRAPH.md 78 ●●●●● patch | view | raw | blame | history
K1.业务知识/成果地图.md 40 ●●●●● patch | view | raw | blame | history
K2.项目管理/QA地图.md 48 ●●●●● patch | view | raw | blame | history
K2.项目管理/handoffs/2026-07-02-迁移交接.md 47 ●●●●● patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/engineering-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260603-directory-consolidation.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260603-independent-repo-and-archive.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260604-mac-app-store-category-hotfix.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260604-mac-app-store-release-freeze.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-application-identifier-hotfix.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-clean-rebuild.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-quarantine-hotfix.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-upload-preflight.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260607-x-asr-experiment-branch.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/freeze/20260607-x-asr-experimental-build.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/product-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/dev-checklist-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/dev-checklist.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/engineering-tasks.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/go-test-all-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/go-test-internal-model-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/npm-run-build-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/prd.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/qa-handoff-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/qa-precheck-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/qa-report-20260602-2.1.19.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/qa-report-template.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/qa-test-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-1/todo-list.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/dev-checklist-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/engineering-tasks.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/go-test-all-20260603-2.1.20.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/go-test-all-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/npm-run-build-20260603-2.1.20.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/npm-run-build-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/prd.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/qa-handoff-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/qa-precheck-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/qa-report-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/qa-test-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-2/todo-list.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/code-review-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/dev-checklist-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/engineering-tasks.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/download-failure-protection-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/git-diff-check-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/go-test-all-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/logs/npm-run-build-20260603.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/prd.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/qa-handoff-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/qa-precheck-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/qa-report-current.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/qa-test-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-3/todo-list.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/code-review.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/dev-self-check.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/engineering-tasks.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-2.1.22.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-round4-after-qa-fix.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-round4.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-2.1.22.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-round4-after-qa-fix.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-round4.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/local-build-install-20260603-round4.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-ci-20260603-round4.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-2.1.22.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-round4-after-qa-fix.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-round4.log patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/prd.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/qa-handoff.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/qa-report.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/qa-test-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-4/todo-list.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/dev-check-report.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/engineering-tasks.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/prd.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/qa-handoff.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/qa-report.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/qa-test-plan.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-5/todo-list.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-6/README.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-6/requirements-dev.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/round-6/todo-dev.md patch | view | raw | blame | history
K2.项目管理/legacy/02-P-NBL/x-asr-realtime-insertion-report.md patch | view | raw | blame | history
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/AppStore审核拒绝-20260610.md patch | view | raw | blame | history
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/AppStore打包连续返工经验教训-20260611.md patch | view | raw | blame | history
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/QA工作-经验与教训.md patch | view | raw | blame | history
K2.项目管理/legacy/TODO-旧任务清单.md patch | view | raw | blame | history
K2.项目管理/moved-assets.jsonl 5 ●●●●● patch | view | raw | blame | history
K2.项目管理/restore-notes.md 22 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/00-Topics.md 13 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/AppStore与独立站.md 28 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/Windows预览.md 24 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/发布与打包.md 32 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/多语种与粤语.md 23 ●●●●● patch | view | raw | blame | history
K2.项目管理/session-topics/性能与稳定性.md 23 ●●●●● patch | view | raw | blame | history
K2.项目管理/发布地图.md 34 ●●●●● patch | view | raw | blame | history
K2.项目管理/接收验证记录.md 28 ●●●●● patch | view | raw | blame | history
K2.项目管理/新窗口接手指南.md 52 ●●●●● patch | view | raw | blame | history
K2.项目管理/迁移资产清单.md 44 ●●●●● patch | view | raw | blame | history
K3.运营与发布资料/README.md 12 ●●●●● patch | view | raw | blame | history
K3.运营与发布资料/legacy-运营资料/README.md 10 ●●●●● patch | view | raw | blame | history
K3.运营与发布资料/screenshot.png patch | view | raw | blame | history
README.md 187 ●●●● patch | view | raw | blame | history
.gitignore
@@ -8,6 +8,8 @@
VoiceSnapGo/frontend/dist/
privatevoice.src/frontend/node_modules/
privatevoice.src/frontend/dist/
C1.source/privatevoice.src/frontend/node_modules/
C1.source/privatevoice.src/frontend/dist/
# Go/build artifacts
VoiceSnapGo/build/local/
@@ -21,6 +23,15 @@
privatevoice.src/build/windows-preview/
privatevoice.src/build/*.log
privatevoice.src/PrivateVoice
C1.source/privatevoice.src/build/local/
C1.source/privatevoice.src/build/appstore-local/
C1.source/privatevoice.src/build/deps/
C1.source/privatevoice.src/build/local-build-logs/
C1.source/privatevoice.src/build/macappstore*/
C1.source/privatevoice.src/build/qa/
C1.source/privatevoice.src/build/windows-preview/
C1.source/privatevoice.src/build/*.log
C1.source/privatevoice.src/PrivateVoice
*.app/
*.dmg
@@ -29,6 +40,8 @@
VoiceSnapGo/build/darwin/approved_app_icon.iconset/
privatevoice.src/build/darwin/icon.iconset/
privatevoice.src/build/darwin/approved_app_icon.iconset/
C1.source/privatevoice.src/build/darwin/icon.iconset/
C1.source/privatevoice.src/build/darwin/approved_app_icon.iconset/
# Runtime data should live in Application Support, not source control.
config.json
@@ -47,5 +60,15 @@
# Release packages, certificates, logs, and upload artifacts are local outputs.
/Release/
# Migrated local build packages are present in this project folder for handoff,
# but binary packages are not committed into the slim Git repo.
/C2.builds/**/*.dmg
/C2.builds/**/*.zip
# Local product/operation reference assets.
/X-运营资料/
# Migrated operation assets are local handoff materials; keep only the index.
/K3.运营与发布资料/legacy-运营资料/**
!/K3.运营与发布资料/legacy-运营资料/
!/K3.运营与发布资料/legacy-运营资料/README.md
AGENTS.md
@@ -1,56 +1,32 @@
## 项目属性
项目类型:研发项目
主要产物:Wails / Go 桌面语音输入 App
主要产物:Wails v3 / Go 桌面语音输入 App
## 1. 命令输出保护
## 读取顺序
保护上下文用量。
如果当前工作目录在 `03-O` 内,先回到项目根入口读取:
任何输出量未知或可能很大的命令,都必须限制输出字节数。
1. `/Users/ar/Projects/PrivateVoice2/AGENTS.md`
2. `/Users/ar/Projects/PrivateVoice2/PROJECT.md`
3. `/Users/ar/Projects/PrivateVoice2/INDEX.md`
4. `/Users/ar/Projects/PrivateVoice2/02-P/进度地图.md`
5. `/Users/ar/Projects/PrivateVoice2/03-O/CODEGRAPH.md`
默认安全写法:
旧 `K2.项目管理/legacy/` 资料只作证据附件,不能作为活跃任务来源。
```bash
COMMAND 2>&1 | head -c 6000
```
## 路径边界
## 2. 发布版本规则
- 项目根:`/Users/ar/Projects/PrivateVoice2`
- Git 根:`/Users/ar/Projects/PrivateVoice2/03-O`
- 源码根:`/Users/ar/Projects/PrivateVoice2/03-O/C1.source/privatevoice.src`
- 构建/发布候选包:`/Users/ar/Projects/PrivateVoice2/03-O/C2.builds`
- 构建与 QA 脚本:源码内 `C1.source/privatevoice.src/scripts/`,`C3.tools/` 只放索引和迁移工具说明。
- 会话记忆目录:`/Users/ar/Projects/PrivateVoice2/.codex-sessionhistory/`
本项目声明为 `研发项目`,发布或分发安装包前默认遵守 `~/.codex/rules/release-versioning.md`;如本项目 release 文档或构建脚本另有更具体要求,以本项目规则为准。
## 工作规则
## 3. 测试通过后的默认打包规则
当某一轮改动已经完成开发自测,并且 QA 验证也通过后,默认进入测试包交付流程,不需要再单独询问用户是否打包。
执行打包前仍必须遵守发布版本规则:递增 patch 版本号、生成新的 `YYYYMMDD.HHMM` build 编号、更新 App 元数据与 `CHANGELOG.md`,并生成可分发的 macOS `.dmg`。
如果只有开发自测通过,但 QA 尚未验证通过,则不得把该版本作为测试人员可用包交付;此时只说明当前处于待 QA 状态。
## 4. Mac App Store 出口合规规则
如果本 App 未实现、未打包、未接入非 Apple 操作系统提供的加密算法,Mac App Store 构建的 `Info.plist` 应声明:
```xml
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
```
提交 App Store Connect 前必须检查该键是否存在并为 `false`,以避免每次上传 build 后出现 `Missing Compliance` 并需要手动回答加密出口合规问题。
如果后续新增自实现加密、第三方加密库、非系统提供的标准加密算法或专有加密算法,必须重新评估出口合规,不得沿用上述声明。
## 5. 对话记忆保存规则
本项目需要保存重要会话记忆,但不得为了普通会话记录频繁打断用户审批。
- 首选保存目录:项目根目录下的 `.codex-sessionhistory/`,即 `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/`。
- 只在发生以下情况时保存会话记录:关键决策、文件修改、发布 / 构建 / QA 结论、重大问题排查、用户明确要求保存、阶段性收尾。
- 纯询问、路径确认、状态查询、简单说明、无实质决策或无文件变更的对话,不强制保存。
- 文件名格式:`YYYY-MM-DD-主题.md`;主题必须概括本轮 session 的核心内容,控制在 20 个字符以内,优先使用中文短语,避免空格、`/`、`:` 等不适合作为文件名的字符。
- 如果同一天同主题已有记录文件,必须创建新文件并追加序号,避免覆盖:`YYYY-MM-DD-主题-01.md`、`YYYY-MM-DD-主题-02.md`。
- 保存内容至少包括:用户目标、已完成事项、关键决策、文件变更、未决问题、后续建议。
- 如果首选目录在当前沙盒下不可写,不得发起额外权限审批;必须改存到当前 Codex 工作区的 `.codex-sessionhistory/PrivateVoice/`,并在最终答复中说明实际保存位置。
- 只有首选目录和当前工作区备用目录都不可写时,才允许跳过保存,并在最终答复中说明原因。
- 如果确需保存,应一次性保存本轮完整摘要,避免为了会话记录反复修正。
- 跨项目对话以主要项目保存;如果多个项目都有实质决策或改动,应按同样的首选目录 / 当前工作区备用目录规则分别保存摘要。
- 统一活跃台账是 `/Users/ar/Projects/PrivateVoice2/02-P/进度地图.md`。
- `CODEGRAPH.md` 是人工维护工程地图;自动索引或缓存不能替代它。
- 发布、QA、签名、打包和版本冻结必须遵守项目根入口声明的全局规则路由。
- 标准验证命令必须保持原始可执行形式,不在命令本身追加输出截断管道。
C1.source/privatevoice.src/Taskfile.yml
C1.source/privatevoice.src/app.go
C1.source/privatevoice.src/app_live_caption_test.go
C1.source/privatevoice.src/build/Taskfile.yml
C1.source/privatevoice.src/build/config.yml
C1.source/privatevoice.src/build/darwin/Info.plist
C1.source/privatevoice.src/build/darwin/Taskfile.yml
C1.source/privatevoice.src/build/darwin/VoiceSnap-approved.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-macos26-mic.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-refined-mic.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-selected-B-shadow.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/app_icon.png

C1.source/privatevoice.src/build/darwin/app_icon_source.png

C1.source/privatevoice.src/build/darwin/approved_app_icon.png

C1.source/privatevoice.src/build/darwin/archive/legacy-icons/VoiceSnap-original.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/en.lproj/InfoPlist.strings
C1.source/privatevoice.src/build/darwin/entitlements-appstore.plist
C1.source/privatevoice.src/build/darwin/entitlements.plist
C1.source/privatevoice.src/build/darwin/icon.icns
Binary files differ
C1.source/privatevoice.src/build/darwin/macos26_mic_app_icon.png

C1.source/privatevoice.src/build/darwin/original_app_icon.png

C1.source/privatevoice.src/build/darwin/refined_mic_app_icon.png

C1.source/privatevoice.src/build/darwin/tray_icon.png

C1.source/privatevoice.src/build/darwin/zh-Hans.lproj/InfoPlist.strings
C1.source/privatevoice.src/build/linux/privatevoice-input.desktop
C1.source/privatevoice.src/build/windows/Taskfile.yml
C1.source/privatevoice.src/build/windows/icon.ico

C1.source/privatevoice.src/build/windows/wails.exe.manifest
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_A_pure-blue-mic.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_A_pure-blue-mic.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_shadow_preview.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_shadow_preview.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_thin-blue-glyph.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_B_thin-blue-glyph.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_C_taglauncher-style.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_C_taglauncher-style.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_candidates_preview.png

C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_candidates_preview.svg
C1.source/privatevoice.src/embed.go
C1.source/privatevoice.src/frontend/index.html
C1.source/privatevoice.src/frontend/instructions.md
C1.source/privatevoice.src/frontend/package-lock.json
C1.source/privatevoice.src/frontend/package.json
C1.source/privatevoice.src/frontend/src/App.svelte
C1.source/privatevoice.src/frontend/src/assets/app-icon.png

C1.source/privatevoice.src/frontend/src/components/indicator/FloatingIndicator.svelte
C1.source/privatevoice.src/frontend/src/components/onboarding/OnboardingView.svelte
C1.source/privatevoice.src/frontend/src/components/settings/AboutPage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/CorrectionImportPreviewDialog.svelte
C1.source/privatevoice.src/frontend/src/components/settings/GeneralPage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/HistoryPage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/HotkeysPage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/LanguagePage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/PermissionsPage.svelte
C1.source/privatevoice.src/frontend/src/components/settings/SettingsWindow.svelte
C1.source/privatevoice.src/frontend/src/components/settings/UserDictPage.svelte
C1.source/privatevoice.src/frontend/src/components/shared/AppIcon.svelte
C1.source/privatevoice.src/frontend/src/components/shared/ToggleSwitch.svelte
C1.source/privatevoice.src/frontend/src/components/update/UpdateDialog.svelte
C1.source/privatevoice.src/frontend/src/lib/i18n/de.json
C1.source/privatevoice.src/frontend/src/lib/i18n/en.json
C1.source/privatevoice.src/frontend/src/lib/i18n/es.json
C1.source/privatevoice.src/frontend/src/lib/i18n/fr.json
C1.source/privatevoice.src/frontend/src/lib/i18n/index.ts
C1.source/privatevoice.src/frontend/src/lib/i18n/it.json
C1.source/privatevoice.src/frontend/src/lib/i18n/ja.json
C1.source/privatevoice.src/frontend/src/lib/i18n/ko.json
C1.source/privatevoice.src/frontend/src/lib/i18n/pt.json
C1.source/privatevoice.src/frontend/src/lib/i18n/zh.json
C1.source/privatevoice.src/frontend/src/lib/stores/app.ts
C1.source/privatevoice.src/frontend/src/lib/stores/config.ts
C1.source/privatevoice.src/frontend/src/lib/stores/indicator.ts
C1.source/privatevoice.src/frontend/src/lib/stores/update.ts
C1.source/privatevoice.src/frontend/src/main.ts
C1.source/privatevoice.src/frontend/src/styles/global.css
C1.source/privatevoice.src/frontend/src/vite-env.d.ts
C1.source/privatevoice.src/frontend/svelte.config.js
C1.source/privatevoice.src/frontend/tsconfig.json
C1.source/privatevoice.src/frontend/vite.config.ts
C1.source/privatevoice.src/go.mod
C1.source/privatevoice.src/go.monterey.mod
C1.source/privatevoice.src/go.monterey.sum
C1.source/privatevoice.src/go.sum
C1.source/privatevoice.src/instructions.md
C1.source/privatevoice.src/internal/audio/recorder.go
C1.source/privatevoice.src/internal/audio/recorder_test.go
C1.source/privatevoice.src/internal/config/config.go
C1.source/privatevoice.src/internal/config/config_test.go
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv.go
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv_e2e_test.go
C1.source/privatevoice.src/internal/correctioncsv/correctioncsv_test.go
C1.source/privatevoice.src/internal/dock/dock.go
C1.source/privatevoice.src/internal/dock/dock_darwin.go
C1.source/privatevoice.src/internal/dock/dock_other.go
C1.source/privatevoice.src/internal/engine/engine.go
C1.source/privatevoice.src/internal/engine/engine_darwin.go
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3.go
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_monterey.go
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_monterey_test.go
C1.source/privatevoice.src/internal/engine/engine_darwin_qwen3_test.go
C1.source/privatevoice.src/internal/engine/engine_darwin_test.go
C1.source/privatevoice.src/internal/engine/engine_linux.go
C1.source/privatevoice.src/internal/engine/engine_windows.go
C1.source/privatevoice.src/internal/engine/release_tail.go
C1.source/privatevoice.src/internal/history/history.go
C1.source/privatevoice.src/internal/history/history_test.go
C1.source/privatevoice.src/internal/hotkey/hotkey.go
C1.source/privatevoice.src/internal/hotkey/hotkey_darwin.go
C1.source/privatevoice.src/internal/hotkey/hotkey_linux.go
C1.source/privatevoice.src/internal/hotkey/hotkey_windows.go
C1.source/privatevoice.src/internal/input/paste.go
C1.source/privatevoice.src/internal/input/paste_darwin.go
C1.source/privatevoice.src/internal/input/paste_darwin_test.go
C1.source/privatevoice.src/internal/input/paste_linux.go
C1.source/privatevoice.src/internal/input/paste_windows.go
C1.source/privatevoice.src/internal/language/detect.go
C1.source/privatevoice.src/internal/language/detect_darwin.go
C1.source/privatevoice.src/internal/language/detect_other.go
C1.source/privatevoice.src/internal/language/language_test.go
C1.source/privatevoice.src/internal/language/resolver.go
C1.source/privatevoice.src/internal/logger/logger.go
C1.source/privatevoice.src/internal/model/build_capabilities.go
C1.source/privatevoice.src/internal/model/build_capabilities_default.go
C1.source/privatevoice.src/internal/model/build_capabilities_monterey.go
C1.source/privatevoice.src/internal/model/build_capabilities_windows.go
C1.source/privatevoice.src/internal/model/downloader.go
C1.source/privatevoice.src/internal/model/install_state.go
C1.source/privatevoice.src/internal/model/model_test.go
C1.source/privatevoice.src/internal/model/profile.go
C1.source/privatevoice.src/internal/model/registry.go
C1.source/privatevoice.src/internal/model/resolver.go
C1.source/privatevoice.src/internal/model/validator.go
C1.source/privatevoice.src/internal/modelselection/selection.go
C1.source/privatevoice.src/internal/modelselection/selection_test.go
C1.source/privatevoice.src/internal/overlay/overlay.go
C1.source/privatevoice.src/internal/overlay/overlay_darwin.go
C1.source/privatevoice.src/internal/overlay/overlay_other.go
C1.source/privatevoice.src/internal/overlay/overlay_windows.go
C1.source/privatevoice.src/internal/paths/paths.go
C1.source/privatevoice.src/internal/permissions/permissions.go
C1.source/privatevoice.src/internal/permissions/permissions_darwin.go
C1.source/privatevoice.src/internal/permissions/permissions_other.go
C1.source/privatevoice.src/internal/singleinstance/singleinstance.go
C1.source/privatevoice.src/internal/singleinstance/singleinstance_unix.go
C1.source/privatevoice.src/internal/singleinstance/singleinstance_windows.go
C1.source/privatevoice.src/internal/sound/sound_other.go
C1.source/privatevoice.src/internal/sound/sound_windows.go
C1.source/privatevoice.src/internal/startup/startup.go
C1.source/privatevoice.src/internal/startup/startup_darwin.go
C1.source/privatevoice.src/internal/startup/startup_darwin_appstore.go
C1.source/privatevoice.src/internal/startup/startup_linux.go
C1.source/privatevoice.src/internal/startup/startup_windows.go
C1.source/privatevoice.src/internal/textproc/textproc.go
C1.source/privatevoice.src/internal/textproc/textproc_test.go
C1.source/privatevoice.src/internal/updater/updater.go
C1.source/privatevoice.src/internal/userdict/userdict.go
C1.source/privatevoice.src/internal/userdict/userdict_test.go
C1.source/privatevoice.src/locale_other.go
C1.source/privatevoice.src/locale_windows.go
C1.source/privatevoice.src/main.go
C1.source/privatevoice.src/scripts/QA-WINDOWS-PREVIEW.ps1
C1.source/privatevoice.src/scripts/RUN-WINDOWS-QA.cmd
C1.source/privatevoice.src/scripts/build-appstore-developerid-macos.sh
C1.source/privatevoice.src/scripts/build-appstore-macos.sh
C1.source/privatevoice.src/scripts/build-local-macos-monterey.sh
C1.source/privatevoice.src/scripts/build-local-macos-universal.sh
C1.source/privatevoice.src/scripts/build-local-macos.sh
C1.source/privatevoice.src/scripts/build-macappstore-pkg-macos.sh
C1.source/privatevoice.src/scripts/build-release-macos.sh
C1.source/privatevoice.src/scripts/build-windows-preview.sh
C1.source/privatevoice.src/scripts/install-x-asr-zh-en-960ms.sh
C1.source/privatevoice.src/scripts/qa-settings-window-macos.sh
C1.source/privatevoice.src/scripts/verify-windows-qa-evidence.sh
C1.source/privatevoice.src/services/app_service.go
C1.source/privatevoice.src/services/audio_service.go
C1.source/privatevoice.src/services/config_service.go
C1.source/privatevoice.src/services/correction_csv_service.go
C1.source/privatevoice.src/services/engine_service.go
C1.source/privatevoice.src/services/engine_service_qwen3_default_test.go
C1.source/privatevoice.src/services/engine_service_qwen3_monterey_test.go
C1.source/privatevoice.src/services/engine_service_test.go
C1.source/privatevoice.src/services/engine_service_windows_test.go
C1.source/privatevoice.src/services/history_service.go
C1.source/privatevoice.src/services/hotkey_service.go
C1.source/privatevoice.src/services/permission_service.go
C1.source/privatevoice.src/services/updater_service.go
C1.source/privatevoice.src/services/userdict_service.go
C1.source/privatevoice.src/system_load_darwin.go
C1.source/privatevoice.src/system_load_other.go
C1.source/privatevoice.src/testdata/round1/README.md
C1.source/privatevoice.src/testdata/round1/models-incomplete-missing-model/sensevoice-zh/tokens.txt
C1.source/privatevoice.src/testdata/round1/models-incomplete-missing-tokens/sensevoice-zh/model.int8.onnx
C1.source/privatevoice.src/testdata/round1/models-valid-legacy/sensevoice/model.int8.onnx
C1.source/privatevoice.src/testdata/round1/models-valid-legacy/sensevoice/tokens.txt
C1.source/privatevoice.src/testdata/round1/models-valid-new/sensevoice-zh/model.int8.onnx
C1.source/privatevoice.src/testdata/round1/models-valid-new/sensevoice-zh/tokens.txt
C1.source/privatevoice.src/testdata/round1/models-zero-byte/sensevoice-zh/tokens.txt
C1.source/privatevoice.src/testdata/round1/state-invalid-json/state.json
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/broken/tokens.txt
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/sensevoice/model.int8.onnx
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/sensevoice/tokens.txt
C1.source/privatevoice.src/testdata/round1/state-points-to-broken/state.json
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/sensevoice/model.int8.onnx
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/sensevoice/tokens.txt
C1.source/privatevoice.src/testdata/round1/state-points-to-legacy/state.json
C1.source/privatevoice.src/voicesnap.rc
C1.source/privatevoice.src/wails.json
C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/RELEASE_MANIFEST.md
New file
@@ -0,0 +1,66 @@
# PrivateVoice Dictation 2.2.0 Build 20260702.0303
## Release Scope
- Type: real-user test candidate
- Version: 2.2.0
- Build: 20260702.0303
- Branch: codex/x-asr-experiment-2.1.29
- Commit: 0ffbf1935c9d091cce22a5583275ac0902f7a693
- Tag: v2.2.0-build20260702.0303-real-user-test
- Generated: 2026-07-02 03:09:18 CST
- Operator: Codex
This package set contains three macOS DMGs and one Windows preview ZIP for real-user testing. It is not an App Store package set. macOS DMGs are locally signed and not notarized. The Windows ZIP is an unsigned preview package.
## Artifacts
| Platform | Artifact | Size |
| --- | --- | --- |
| macOS Apple Silicon | `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-arm64.dmg` | 19M |
| macOS Intel | `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-x86_64.dmg` | 19M |
| macOS Universal | `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-universal.dmg` | 37M |
| Windows amd64 preview | `PrivateVoice-Dictation-2.2.0-build20260702.0303-windows-amd64-preview.zip` | 20M |
## SHA256
```text
db7b7a0c5ac14dd664c8430f9033ce7adb227ee1f30cc3cd38b6ce0bf44eb784  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-arm64.dmg
f72aca7f0c6a41ba15e8d618a924eda59c1238e6cd780844bf1bfad5ca75b539  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-universal.dmg
4ef0fc8afe40a9a2a843bc320a940b4f29d536da918dafaf5b0e0407c831703b  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-x86_64.dmg
82118105340a187bdc954eff01ef0ac2824e86037342e0606821dbf86d9a6b42  PrivateVoice-Dictation-2.2.0-build20260702.0303-windows-amd64-preview.zip
```
## Build Commands
```bash
cd /Users/ar/Projects/PrivateVoice/privatevoice.src
go test ./... -count=1
npm --prefix frontend run build
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go test -exec=/usr/bin/true ./...
./scripts/build-local-macos-universal.sh
./scripts/build-windows-preview.sh
```
## Validation
- `go test ./... -count=1`: passed
- `npm --prefix frontend run build`: passed with existing Svelte accessibility warnings
- Windows cross-compile smoke test: passed
- `git diff --check`: passed
- `hdiutil verify` for all three DMGs: passed
- `unzip -t` for Windows ZIP: passed
- `shasum -a 256 -c SHA256SUMS.txt`: passed
- macOS binary architectures:
  - arm64 DMG app: `arm64`
  - x86_64 DMG app: `x86_64`
  - universal DMG app: `x86_64 arm64`
- `codesign --verify --deep --strict --verbose=2` for all three local macOS apps: passed
- `com.apple.quarantine`: not present on release artifacts
## Notes
- This build includes Round 6 Cantonese language/model option work and prior Windows overlay/P1 download workflow changes from the current branch.
- Real Windows machine QA is still required before calling the Windows package stable.
- Monterey compatibility has not been revalidated in this package set.
- The release directory also contains `SHA256SUMS.txt` for independent checksum verification.
C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/SHA256SUMS.txt
New file
@@ -0,0 +1,4 @@
db7b7a0c5ac14dd664c8430f9033ce7adb227ee1f30cc3cd38b6ce0bf44eb784  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-arm64.dmg
f72aca7f0c6a41ba15e8d618a924eda59c1238e6cd780844bf1bfad5ca75b539  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-universal.dmg
4ef0fc8afe40a9a2a843bc320a940b4f29d536da918dafaf5b0e0407c831703b  PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-x86_64.dmg
82118105340a187bdc954eff01ef0ac2824e86037342e0606821dbf86d9a6b42  PrivateVoice-Dictation-2.2.0-build20260702.0303-windows-amd64-preview.zip
C2.builds/README.md
New file
@@ -0,0 +1,9 @@
# C2.builds
本目录保存迁移时保留的当前候选包。
当前迁入:
- `PrivateVoice-Dictation-2.2.0-build20260702.0303/`
二进制 `.dmg` 和 `.zip` 默认不提交 Git;本地文件用于当前机器接手、校验和分发准备。长期事实以 `RELEASE_MANIFEST.md`、`SHA256SUMS.txt`、`K2.项目管理/发布地图.md` 和会话主题摘要为准。
C3.tools/README.md
New file
@@ -0,0 +1,19 @@
# C3.tools
工具入口索引。实际构建、打包和 QA 脚本仍跟随源码维护,位于:
```text
../C1.source/privatevoice.src/scripts/
```
常用脚本:
- `build-local-macos.sh`
- `build-local-macos-universal.sh`
- `build-local-macos-monterey.sh`
- `build-release-macos.sh`
- `build-windows-preview.sh`
- `verify-windows-qa-evidence.sh`
- `qa-settings-window-macos.sh`
不要在本目录复制一份脚本实现,避免脚本漂移。
CODEGRAPH.md
@@ -3,20 +3,22 @@
## Project
- Product: Wails v3 / Go desktop dictation app.
- Git root: `/Users/ar/Projects/PrivateVoice2/03-O`.
- Source root: `/Users/ar/Projects/PrivateVoice2/03-O/C1.source/privatevoice.src`.
- Current branch purpose: Round 6 Cantonese language version real-user test package based on `v2.2.0-build20260702.0303`.
- Protected macOS behavior: existing macOS App Store / local DMG build lines are not changed by this branch.
- Protected behavior: existing macOS App Store, local DMG, Monterey compatibility, Windows preview, model download safety, and paste/clipboard protection must not be changed without a scoped task and QA plan.
## Core Entrypoints
- `privatevoice.src/main.go`: process startup, data migration, logger, single-instance guard.
- `privatevoice.src/app.go`: Wails app wiring, settings window, tray, recorder, hotkey loop, ASR init, paste orchestration.
- `privatevoice.src/embed.go`: embeds frontend assets and app/tray icons.
- `C1.source/privatevoice.src/main.go`: process startup, data migration, logger, single-instance guard.
- `C1.source/privatevoice.src/app.go`: Wails app wiring, settings window, tray, recorder, hotkey loop, ASR init, paste orchestration.
- `C1.source/privatevoice.src/embed.go`: embeds frontend assets and app/tray icons.
## Language And Model Registry
- `privatevoice.src/internal/model/profile.go`: model and language IDs, model profile shape, install status types.
- `privatevoice.src/internal/model/registry.go`: language profile order, model profiles, language profiles, and normalization.
- `privatevoice.src/internal/modelselection/selection.go`: resolves current language and model, including manual-model fallback.
- `C1.source/privatevoice.src/internal/model/profile.go`: model and language IDs, model profile shape, install status types.
- `C1.source/privatevoice.src/internal/model/registry.go`: language profile order, model profiles, language profiles, and normalization.
- `C1.source/privatevoice.src/internal/modelselection/selection.go`: resolves current language and model, including manual-model fallback.
- Round 6 Cantonese path:
  - Language ID: `yue-HK`, displayed as `粤语`.
  - Default model: `sensevoice-yue-2025-09-09`.
@@ -25,23 +27,20 @@
## Platform Modules
- Audio: `privatevoice.src/internal/audio/recorder.go`
  - Uses `github.com/gen2brain/malgo`.
  - Cross-platform capture target: 16 kHz, 16-bit, mono.
- Audio: `C1.source/privatevoice.src/internal/audio/recorder.go`
- Hotkey:
  - macOS: `privatevoice.src/internal/hotkey/hotkey_darwin.go`
  - Windows: `privatevoice.src/internal/hotkey/hotkey_windows.go`
  - macOS: `C1.source/privatevoice.src/internal/hotkey/hotkey_darwin.go`
  - Windows: `C1.source/privatevoice.src/internal/hotkey/hotkey_windows.go`
- Text input:
  - macOS: `privatevoice.src/internal/input/paste_darwin.go`
  - Windows: `privatevoice.src/internal/input/paste_windows.go`
  - macOS: `C1.source/privatevoice.src/internal/input/paste_darwin.go`
  - Windows: `C1.source/privatevoice.src/internal/input/paste_windows.go`
- ASR engine:
  - macOS: `privatevoice.src/internal/engine/engine_darwin.go`
  - Windows: `privatevoice.src/internal/engine/engine_windows.go`
  - Linux: `privatevoice.src/internal/engine/engine_linux.go`
  - SenseVoice profiles may set `Profile.LanguageParam`; Cantonese uses `yue`.
  - macOS: `C1.source/privatevoice.src/internal/engine/engine_darwin.go`
  - Windows: `C1.source/privatevoice.src/internal/engine/engine_windows.go`
  - Linux: `C1.source/privatevoice.src/internal/engine/engine_linux.go`
- Overlay:
  - macOS: `privatevoice.src/internal/overlay/overlay_darwin.go`
  - Windows: `privatevoice.src/internal/overlay/overlay_windows.go`
  - macOS: `C1.source/privatevoice.src/internal/overlay/overlay_darwin.go`
  - Windows: `C1.source/privatevoice.src/internal/overlay/overlay_windows.go`
## Windows Preview Scope
@@ -49,31 +48,21 @@
- Non-SenseVoice models remain visible in settings but are disabled through `model.IsModelSupportedInCurrentBuild`.
- Windows unsupported reason: `windows_preview_unsupported`.
- Windows overlay remains native Win32/GDI+, with a larger translucent spectrum-style capsule indicator for recording states.
- Build script: `privatevoice.src/scripts/build-windows-preview.sh`.
- Evidence verifier: `privatevoice.src/scripts/verify-windows-qa-evidence.sh`.
- Runtime package includes:
  - `PrivateVoice Dictation.exe`
  - `onnxruntime.dll`
  - `sherpa-onnx-c-api.dll`
  - `sherpa-onnx-cxx-api.dll`
  - `RUN-WINDOWS-QA.cmd`
  - `QA-WINDOWS-PREVIEW.ps1`
  - `README-WINDOWS-PREVIEW.txt`
- Build script: `C1.source/privatevoice.src/scripts/build-windows-preview.sh`.
- Evidence verifier: `C1.source/privatevoice.src/scripts/verify-windows-qa-evidence.sh`.
## macOS Local Package Scope
## macOS Package Scope
- Local DMG script: `privatevoice.src/scripts/build-local-macos.sh`.
- Universal DMG script: `privatevoice.src/scripts/build-local-macos-universal.sh`.
- Local macOS package set for this branch:
  - `arm64` DMG for Apple Silicon.
  - `x86_64` DMG for Intel Mac.
  - `universal` DMG for Intel + Apple Silicon.
- Mainline macOS local packages keep `LSMinimumSystemVersion=14.0` and the default Qwen3-capable dependency line.
- Monterey-compatible packages remain a separate build line through `privatevoice.src/scripts/build-local-macos-monterey.sh`.
- Local DMG script: `C1.source/privatevoice.src/scripts/build-local-macos.sh`.
- Universal DMG script: `C1.source/privatevoice.src/scripts/build-local-macos-universal.sh`.
- Monterey compatibility script: `C1.source/privatevoice.src/scripts/build-local-macos-monterey.sh`.
- Developer ID / notarization script: `C1.source/privatevoice.src/scripts/build-release-macos.sh`.
- Mainline macOS local packages keep `LSMinimumSystemVersion=14.0`.
- Monterey-compatible packages remain a separate build line.
## Standard Verification Commands
Run from `privatevoice.src`:
Run from `C1.source/privatevoice.src`:
```bash
npm --prefix frontend run build
@@ -88,8 +77,7 @@
## Known Gaps
- Windows runtime QA must still be performed on Windows 10/11 hardware.
- Run `RUN-WINDOWS-QA.cmd` from the extracted preview package to collect WebView2/audio preflight, startup, engine, recording, recognition, paste, and Notepad target text evidence.
- After evidence is returned, run `verify-windows-qa-evidence.sh` and require `WINDOWS_QA_EVIDENCE_PASS` before claiming the goal complete.
- The Windows preview zip is unsigned and not an installer.
- SmartScreen / Defender prompts are expected for local testing.
- Windows runtime QA must still be performed on Windows 10/11 hardware before calling Windows stable.
- macOS 2.2.0 real-user test DMGs are locally signed and not notarized.
- Monterey compatibility was not revalidated for the 2.2.0 package set.
- Independent-site sales still need Developer ID release packaging, download page, authorization/activation, update strategy, support path, release manifest, and rollback policy.
K1.业务知识/成果地图.md
New file
@@ -0,0 +1,40 @@
# 成果地图
## 代码成果
- 当前源码根:`03-O/C1.source/privatevoice.src`
- 工程地图:`03-O/CODEGRAPH.md`
- 主要技术栈:Go、Wails v3、Svelte 5、Vite、sherpa-onnx、malgo。
## 产品成果
- 离线语音输入桌面 App。
- 正式语言:中文、English、French、German、Spanish、Italian、Portuguese、Japanese、Korean。
- 真实用户测试候选:粤语 `yue-HK`,默认 `SenseVoice Yue 2025-09-09`。
- Windows preview:当前只支持 SenseVoice。
## QA 成果
- Round 6 粤语实现:`go test ./... -count=1`、前端 build、Windows cross test、`git diff --check` 通过。
- 2.2.0 四包候选:DMG verify、ZIP test、SHA256、架构和 codesign 校验通过。
- 详见 `03-O/K2.项目管理/QA地图.md`。
## 发布成果
- 最新候选包:`03-O/C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/`
- 包类型:真实用户测试候选包。
- 不是官网正式发布包;未 notarize。
- 详见 `03-O/K2.项目管理/发布地图.md`。
## 不作为当前成果的材料
- `03-O/K2.项目管理/legacy/` 下旧 Round 文档只作历史证据。
- 旧原始 session 正文不迁入新项目正文。
- `03-O/K3.运营与发布资料/legacy-运营资料/` 是本地运营素材,不等同当前发布事实。
## 当前缺口
- 官网独立站销售闭环。
- Windows 正式签名安装器与完整 QA。
- Monterey 覆盖验证。
- 自动更新策略重定向到官网发布链路。
K2.项目管理/QA地图.md
New file
@@ -0,0 +1,48 @@
# QA 地图
## 当前 QA 结论
迁移接收验证与产品 QA 结论必须区分。
- 迁移接收验证:由 `接收验证记录.md` 记录。
- Round 6 产品 QA:已有会话和 release manifest 证明基础自动化/包校验通过。
- Windows 真机 QA:仍未由本迁移补跑。
- 官网正式发布 QA:仍未完成 notarization、下载页、授权/激活、更新和回滚链路验证。
## 标准源码验证
从 `03-O/C1.source/privatevoice.src` 执行:
```bash
npm --prefix frontend run build
go test ./...
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go test -exec=/usr/bin/true ./...
```
## 包验证
从 `03-O/C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303` 执行:
```bash
shasum -a 256 -c SHA256SUMS.txt
hdiutil verify 'PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-arm64.dmg'
hdiutil verify 'PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-x86_64.dmg'
hdiutil verify 'PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-universal.dmg'
unzip -t 'PrivateVoice-Dictation-2.2.0-build20260702.0303-windows-amd64-preview.zip'
```
## Windows QA 入口
在 Windows preview 包解压后运行:
```text
RUN-WINDOWS-QA.cmd
```
收回 evidence zip 后,在源码根执行:
```bash
./scripts/verify-windows-qa-evidence.sh /path/to/qa-evidence-YYYYMMDD-HHMMSS.zip
```
只有出现 `WINDOWS_QA_EVIDENCE_PASS`,才能声称 Windows preview evidence 通过。
K2.项目管理/handoffs/2026-07-02-迁移交接.md
New file
@@ -0,0 +1,47 @@
# 2026-07-02 迁移交接
## 来源
- 源项目:`/Users/ar/Projects/PrivateVoice`
- 新项目:`/Users/ar/Projects/PrivateVoice2`
- 源分支:`codex/x-asr-experiment-2.1.29`
- 固定点:`0ffbf1935c9d091cce22a5583275ac0902f7a693`
- Tag:`v2.2.0-build20260702.0303-real-user-test`
## 当前目标
让新 Codex 窗口可以只读 `PrivateVoice2` 文件继续工作,不依赖旧项目长会话。
## 已完成
- 新项目结构 `01-I / 02-P / 03-O` 已建立。
- Git 历史 clone 到 `03-O`,源码迁入 `03-O/C1.source/privatevoice.src`。
- 最新 2.2.0 候选包迁入 `03-O/C2.builds`。
- 旧过程文档降级到 `03-O/K2.项目管理/legacy/`。
- 原始 session 正文未迁入;已整理主题摘要。
- 入口文档、台账、事件地图、成果地图、QA/发布地图和迁移清单已建立。
## 已知错误或未跑检查
- 本迁移不补跑 Windows 真机 QA。
- 本迁移不补跑 notarization。
- 本迁移不重新构建 2.2.0 包。
- Monterey 兼容未在迁移中重新验证。
## 不可触碰区域
- 不修改 `/Users/ar/Projects/PrivateVoice` 旧项目。
- 不删除源项目旧 release、证书、worktree 或 session。
- 不把 `legacy` 旧任务清单当作当前活跃任务。
## 下一步
1. 完成迁移接收验证并更新 `接收验证记录.md`。
2. 如要继续产品工作,先在 `02-P/进度地图.md` 领取或新增活跃任务。
3. 若目标是官网销售,先补独立站 P0 发布计划。
4. 若目标是 Windows 正式版,先补签名、安装器和真机 QA evidence。
5. 若目标是粤语真实用户测试,先确认测试人、平台、反馈渠道和包分发口径。
## Reactivation Prompt
我们从这份 handoff 继续。请先读取本文件,再检查 `/Users/ar/Projects/PrivateVoice2/AGENTS.md`、`PROJECT.md`、`INDEX.md`、`02-P/进度地图.md`、`03-O/CODEGRAPH.md` 和当前 Git 状态,核对哪些结论仍然成立,然后从“下一步”继续推进;不要假设旧 session 上下文仍然可用。
K2.项目管理/legacy/02-P-NBL/engineering-plan.md
K2.项目管理/legacy/02-P-NBL/freeze/20260603-directory-consolidation.md
K2.项目管理/legacy/02-P-NBL/freeze/20260603-independent-repo-and-archive.md
K2.项目管理/legacy/02-P-NBL/freeze/20260604-mac-app-store-category-hotfix.md
K2.项目管理/legacy/02-P-NBL/freeze/20260604-mac-app-store-release-freeze.md
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-application-identifier-hotfix.md
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-clean-rebuild.md
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-quarantine-hotfix.md
K2.项目管理/legacy/02-P-NBL/freeze/20260605-mac-app-store-upload-preflight.md
K2.项目管理/legacy/02-P-NBL/freeze/20260607-x-asr-experiment-branch.md
K2.项目管理/legacy/02-P-NBL/freeze/20260607-x-asr-experimental-build.md
K2.项目管理/legacy/02-P-NBL/plan.md
K2.项目管理/legacy/02-P-NBL/product-plan.md
K2.项目管理/legacy/02-P-NBL/round-1/README.md
K2.项目管理/legacy/02-P-NBL/round-1/dev-checklist-current.md
K2.项目管理/legacy/02-P-NBL/round-1/dev-checklist.md
K2.项目管理/legacy/02-P-NBL/round-1/engineering-tasks.md
K2.项目管理/legacy/02-P-NBL/round-1/logs/go-test-all-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/go-test-internal-model-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/npm-run-build-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log
K2.项目管理/legacy/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid
K2.项目管理/legacy/02-P-NBL/round-1/prd.md
K2.项目管理/legacy/02-P-NBL/round-1/qa-handoff-current.md
K2.项目管理/legacy/02-P-NBL/round-1/qa-precheck-current.md
K2.项目管理/legacy/02-P-NBL/round-1/qa-report-20260602-2.1.19.md
K2.项目管理/legacy/02-P-NBL/round-1/qa-report-template.md
K2.项目管理/legacy/02-P-NBL/round-1/qa-test-plan.md
K2.项目管理/legacy/02-P-NBL/round-1/todo-list.md
K2.项目管理/legacy/02-P-NBL/round-2/README.md
K2.项目管理/legacy/02-P-NBL/round-2/dev-checklist-current.md
K2.项目管理/legacy/02-P-NBL/round-2/engineering-tasks.md
K2.项目管理/legacy/02-P-NBL/round-2/logs/go-test-all-20260603-2.1.20.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/go-test-all-20260603.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/npm-run-build-20260603-2.1.20.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/npm-run-build-20260603.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid
K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png

K2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png

K2.项目管理/legacy/02-P-NBL/round-2/prd.md
K2.项目管理/legacy/02-P-NBL/round-2/qa-handoff-current.md
K2.项目管理/legacy/02-P-NBL/round-2/qa-precheck-current.md
K2.项目管理/legacy/02-P-NBL/round-2/qa-report-current.md
K2.项目管理/legacy/02-P-NBL/round-2/qa-test-plan.md
K2.项目管理/legacy/02-P-NBL/round-2/todo-list.md
K2.项目管理/legacy/02-P-NBL/round-3/README.md
K2.项目管理/legacy/02-P-NBL/round-3/code-review-current.md
K2.项目管理/legacy/02-P-NBL/round-3/dev-checklist-current.md
K2.项目管理/legacy/02-P-NBL/round-3/engineering-tasks.md
K2.项目管理/legacy/02-P-NBL/round-3/logs/download-failure-protection-20260603.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/git-diff-check-20260603.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/go-test-all-20260603.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log
K2.项目管理/legacy/02-P-NBL/round-3/logs/npm-run-build-20260603.log
K2.项目管理/legacy/02-P-NBL/round-3/prd.md
K2.项目管理/legacy/02-P-NBL/round-3/qa-handoff-current.md
K2.项目管理/legacy/02-P-NBL/round-3/qa-precheck-current.md
K2.项目管理/legacy/02-P-NBL/round-3/qa-report-current.md
K2.项目管理/legacy/02-P-NBL/round-3/qa-test-plan.md
K2.项目管理/legacy/02-P-NBL/round-3/todo-list.md
K2.项目管理/legacy/02-P-NBL/round-4/README.md
K2.项目管理/legacy/02-P-NBL/round-4/code-review.md
K2.项目管理/legacy/02-P-NBL/round-4/dev-self-check.md
K2.项目管理/legacy/02-P-NBL/round-4/engineering-tasks.md
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-2.1.22.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-round4-after-qa-fix.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/git-diff-check-20260603-round4.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-2.1.22.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-round4-after-qa-fix.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/go-test-all-20260603-round4.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/local-build-install-20260603-round4.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-ci-20260603-round4.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-2.1.22.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-round4-after-qa-fix.log
K2.项目管理/legacy/02-P-NBL/round-4/logs/npm-run-build-20260603-round4.log
K2.项目管理/legacy/02-P-NBL/round-4/prd.md
K2.项目管理/legacy/02-P-NBL/round-4/qa-handoff.md
K2.项目管理/legacy/02-P-NBL/round-4/qa-report.md
K2.项目管理/legacy/02-P-NBL/round-4/qa-test-plan.md
K2.项目管理/legacy/02-P-NBL/round-4/todo-list.md
K2.项目管理/legacy/02-P-NBL/round-5/README.md
K2.项目管理/legacy/02-P-NBL/round-5/dev-check-report.md
K2.项目管理/legacy/02-P-NBL/round-5/engineering-tasks.md
K2.项目管理/legacy/02-P-NBL/round-5/prd.md
K2.项目管理/legacy/02-P-NBL/round-5/qa-handoff.md
K2.项目管理/legacy/02-P-NBL/round-5/qa-report.md
K2.项目管理/legacy/02-P-NBL/round-5/qa-test-plan.md
K2.项目管理/legacy/02-P-NBL/round-5/todo-list.md
K2.项目管理/legacy/02-P-NBL/round-6/README.md
K2.项目管理/legacy/02-P-NBL/round-6/requirements-dev.md
K2.项目管理/legacy/02-P-NBL/round-6/todo-dev.md
K2.项目管理/legacy/02-P-NBL/x-asr-realtime-insertion-report.md
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/AppStore审核拒绝-20260610.md
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/AppStore打包连续返工经验教训-20260611.md
K2.项目管理/legacy/Docs/KM2.项目管理-非业务直接相关/QA工作-经验与教训.md
K2.项目管理/legacy/TODO-旧任务清单.md
K2.项目管理/moved-assets.jsonl
New file
@@ -0,0 +1,5 @@
{"time":"2026-07-02","scope":"new-project","source":"/Users/ar/Projects/PrivateVoice2/03-O/privatevoice.src","target":"/Users/ar/Projects/PrivateVoice2/03-O/C1.source/privatevoice.src","reason":"set source root to SOP C1.source path; source project was not modified"}
{"time":"2026-07-02","scope":"new-project","source":"/Users/ar/Projects/PrivateVoice2/03-O/02-P-NBL","target":"/Users/ar/Projects/PrivateVoice2/03-O/K2.项目管理/legacy/02-P-NBL","reason":"downgrade old process documents to historical evidence; source project was not modified"}
{"time":"2026-07-02","scope":"new-project","source":"/Users/ar/Projects/PrivateVoice2/03-O/Docs","target":"/Users/ar/Projects/PrivateVoice2/03-O/K2.项目管理/legacy/Docs","reason":"place old project management docs under legacy evidence; source project was not modified"}
{"time":"2026-07-02","scope":"new-project","source":"/Users/ar/Projects/PrivateVoice2/03-O/TODO.md","target":"/Users/ar/Projects/PrivateVoice2/03-O/K2.项目管理/legacy/TODO-旧任务清单.md","reason":"old TODO is not the active ledger; source project was not modified"}
{"time":"2026-07-02","scope":"new-project","source":"/Users/ar/Projects/PrivateVoice2/03-O/screenshot.png","target":"/Users/ar/Projects/PrivateVoice2/03-O/K3.运营与发布资料/screenshot.png","reason":"place product screenshot under operation/release materials; source project was not modified"}
K2.项目管理/restore-notes.md
New file
@@ -0,0 +1,22 @@
# Restore Notes
## 源项目恢复
本次迁移没有修改、移动、删除或归档 `/Users/ar/Projects/PrivateVoice` 内的任何材料。需要恢复旧项目材料时,直接回到源路径读取。
## 新项目结构性移动
新项目内发生的结构性移动记录在 `moved-assets.jsonl`。如果要恢复旧仓库布局,可在 `03-O` 中用 Git 历史查看迁移前路径:
```bash
cd /Users/ar/Projects/PrivateVoice2/03-O
git log --oneline --follow -- C1.source/privatevoice.src/main.go
```
## 本地大文件
`C2.builds` 和 `K3.运营与发布资料/legacy-运营资料` 中的本地二进制/素材文件默认不提交 Git。若丢失,可从源项目重新复制:
```bash
rsync -a /Users/ar/Projects/PrivateVoice/Release/PrivateVoice-Dictation-2.2.0-build20260702.0303/ /Users/ar/Projects/PrivateVoice2/03-O/C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/
```
K2.项目管理/session-topics/00-Topics.md
New file
@@ -0,0 +1,13 @@
# 会话主题索引
旧项目原始 session 正文不迁入新项目正文。本目录只保留对接手仍有价值的主题摘要和来源索引。
| 主题 | 文档 | 时间范围 | 说明 |
| --- | --- | --- | --- |
| 多语种与粤语 | `多语种与粤语.md` | 2026-05-29 至 2026-07-02 | 模型路线、Round 6 粤语、语言切换安全 |
| Windows 预览 | `Windows预览.md` | 2026-06-30 至 2026-07-02 | Windows preview 合并、限制、包和 QA 缺口 |
| 发布与打包 | `发布与打包.md` | 2026-06-04 至 2026-07-02 | App Store、本地包、2.2.0 四包候选 |
| App Store 与独立站 | `AppStore与独立站.md` | 2026-06-10 至 2026-07-02 | 渠道转向和独立站缺口 |
| 性能与稳定性 | `性能与稳定性.md` | 2026-06-28 至 2026-07-01 | 慢识别、尾音、下载/取消/首尾字修复 |
原始记录仍保留在源项目 `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/`。
K2.项目管理/session-topics/AppStore与独立站.md
New file
@@ -0,0 +1,28 @@
# App Store 与独立站
## 当前状态
项目曾围绕 Mac App Store 审核、pkg、合规和启动问题推进。2026-07-02 的结论是:主发布出口转为独立站销售。
## 当前结论
- App Store 特有链路不再是当前主线门禁。
- 建议采用“功能冻结,不做二进制绝对冻结”的发布策略。
- 首发建议先做 macOS 官网直发,不同步追求完整账号体系和复杂自动更新。
## P0 缺口
1. 固定官网发布基线。
2. Developer ID signed + notarized DMG。
3. 下载页、版本页、SHA256 和 manifest。
4. 最小授权 / 激活 / 交付闭环。
5. 更新策略:首发是否关闭自动更新,或跳官网。
6. 支持、诊断导出和退款/订单查询路径。
## 来源索引
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-10-审核拒绝排查.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-10-审核处理方案.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-13-AppStore三审驳回.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-23-AppStore四审会诊.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-独立站发布清单.md`
K2.项目管理/session-topics/Windows预览.md
New file
@@ -0,0 +1,24 @@
# Windows 预览
## 当前状态
Windows preview 已合入当前分支,并包含在 2.2.0 四包候选中。它仍是 unsigned preview ZIP,不是正式 Windows 安装器。
## 核心事实
- Windows preview 当前只支持 SenseVoice。
- 非 SenseVoice 模型在设置中可见但禁用。
- Windows overlay 使用原生 Win32/GDI+ 胶囊指示器。
- QA 脚本在包内:`RUN-WINDOWS-QA.cmd`、`QA-WINDOWS-PREVIEW.ps1`。
- 收回 evidence 后用 `scripts/verify-windows-qa-evidence.sh` 验证。
## 缺口
- 需要真实 Windows 10/11 硬件 QA。
- 需要签名、安装器和 SmartScreen 体验处理,才能推进正式 PC 版本。
## 来源索引
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-30-Windows预览版.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-01-Windows合并.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-01-Windows动效打包.md`
K2.项目管理/session-topics/发布与打包.md
New file
@@ -0,0 +1,32 @@
# 发布与打包
## 当前最新包
- Version:`2.2.0`
- Build:`20260702.0303`
- Commit:`0ffbf1935c9d091cce22a5583275ac0902f7a693`
- Tag:`v2.2.0-build20260702.0303-real-user-test`
- 类型:真实用户测试候选包。
## 包组成
- macOS arm64 DMG
- macOS x86_64 DMG
- macOS universal DMG
- Windows amd64 preview ZIP
## 验证摘要
源会话记录表明以下检查通过:`go test ./... -count=1`、`npm --prefix frontend run build`、Windows cross smoke、`git diff --check`、DMG verify、ZIP test、SHA256、架构和 codesign。
## 边界
- macOS 包未 notarize。
- Windows 包未签名。
- Monterey 兼容未在 2.2.0 四包中重新验证。
## 来源索引
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-多平台打包整理.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-粤语四包交付.md`
- `/Users/ar/Projects/PrivateVoice/Release/PrivateVoice-Dictation-2.2.0-build20260702.0303/RELEASE_MANIFEST.md`
K2.项目管理/session-topics/多语种与粤语.md
New file
@@ -0,0 +1,23 @@
# 多语种与粤语
## 当前状态
PrivateVoice 已从中文/English 双语言扩展到多语种 profile。Round 6 已新增独立粤语语言版本。
## 最近结论
- `yue-HK` 是独立语言 profile,显示为 `粤语`。
- 默认模型为 `sensevoice-yue-2025-09-09` / `SenseVoice Yue`。
- SenseVoice Yue engine 参数固定为 `LanguageParam="yue"`。
- 粤语 profile 不默认展示 Qwen3-ASR / X-ASR 作为粤语专项模型。
- `zh-HK` 不自动映射到粤语,避免香港用户被误切到粤语。
- 未安装目标语言只做 UI 预览;下载成功后才持久化语言并 reload engine。
## 来源索引
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-05-29-关于FunASR等模型的技术选型.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-22-多语种扩展.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-22-README语言表.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-粤语版本需求.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-粤语开发实现.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-02-粤语四包交付.md`
K2.项目管理/session-topics/性能与稳定性.md
New file
@@ -0,0 +1,23 @@
# 性能与稳定性
## 当前状态
2026-07-01 慢识别复盘显示,用户感知慢主要来自 `recognize_ms` 抖动和系统负载峰值,不是上屏、历史写入或 engine lock。
## 已落地
- 新增 `PERF slow_recognition` 日志。
- SenseVoice 尾音保护为 100ms。
- X-ASR 尾音保护为 300ms。
- 其他 sherpa 离线模型不再默认加尾音保护。
## 后续观察
- 系统负载异常时需要区分 Codex/Spotlight/WindowServer 等外部负载影响。
- 如继续优化,先补更细日志和真实用户样本,不直接盲调模型线程或 provider。
## 来源索引
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-28-首尾字修复.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-06-29-性能日志.md`
- `/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/2026-07-01-识别变慢复盘.md`
K2.项目管理/发布地图.md
New file
@@ -0,0 +1,34 @@
# 发布地图
## 当前最新候选包
- Version:`2.2.0`
- Build:`20260702.0303`
- Commit:`0ffbf1935c9d091cce22a5583275ac0902f7a693`
- Tag:`v2.2.0-build20260702.0303-real-user-test`
- 类型:真实用户测试候选包
- 路径:`03-O/C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/`
## 包列表
- `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-arm64.dmg`
- `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-x86_64.dmg`
- `PrivateVoice-Dictation-2.2.0-build20260702.0303-macos-universal.dmg`
- `PrivateVoice-Dictation-2.2.0-build20260702.0303-windows-amd64-preview.zip`
- `RELEASE_MANIFEST.md`
- `SHA256SUMS.txt`
## 当前边界
- macOS 包是本地签名 DMG,未 notarize。
- Windows 包是 unsigned preview ZIP,不是安装器。
- 该包可用于真实用户测试,不等同正式官网发布。
## 官网独立站 P0 缺口
1. 明确官网首发固定 commit/build。
2. 生成 Developer ID signed + notarized DMG。
3. 建立下载页、版本页、SHA256、release manifest。
4. 决定授权/试用/激活/换机/重装最小方案。
5. 决定首发是否关闭应用内自动更新;如关闭,检查更新应跳官网。
6. 定义支持、诊断导出、退款/订单查询最小流程。
K2.项目管理/接收验证记录.md
New file
@@ -0,0 +1,28 @@
# 接收验证记录
## 验证目标
验证 `PrivateVoice2` 迁移包是否可接手。该结论不等同产品 QA PASS、正式发布 PASS 或官网销售链路 PASS。
## 结果
| 项 | 命令或检查 | 结果 | 备注 |
| --- | --- | --- | --- |
| Git 状态 | `git status --short --branch` | PASS | 显示预期迁移变更;提交后需再看最终 clean 状态 |
| Diff 空白检查 | `git diff --check` | PASS | 无输出 |
| 依赖安装 | `npm --prefix frontend ci` | PASS with warning | 安装 48 packages;仍有既有 `6 vulnerabilities (3 moderate, 3 high)` |
| 前端 build | `npm --prefix frontend run build` | PASS with warning | 生成 `frontend/dist`;仍有既有 Svelte a11y warning |
| Go 测试 | `go test ./...` | PASS with warning | 通过;仍有既有 macOS linker warning |
| Windows cross smoke | `GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go test -exec=/usr/bin/true ./...` | PASS | 通过 |
| SHA256 | `shasum -a 256 -c SHA256SUMS.txt` | PASS | 四个候选包均 OK |
| macOS DMG 完整性 | `hdiutil verify ...arm64.dmg` | PASS | VALID |
| macOS DMG 完整性 | `hdiutil verify ...x86_64.dmg` | PASS | VALID |
| macOS DMG 完整性 | `hdiutil verify ...universal.dmg` | PASS | VALID |
| Windows ZIP 完整性 | `unzip -t ...windows-amd64-preview.zip` | PASS | No errors detected |
## 未跑项默认解释
- Windows 真机 QA 不属于本次迁移接收验证。
- Notarization 不属于本次迁移接收验证。
- 重新打包不属于本次迁移接收验证。
- 本次迁移验证不处理 `npm audit` 中既有漏洞提示;如要处理,需单独进入依赖安全任务。
K2.项目管理/新窗口接手指南.md
New file
@@ -0,0 +1,52 @@
# 新窗口接手指南
## 接手目标
从 `PrivateVoice2` 文件系统接手项目,不依赖旧长会话上下文。
## 必读顺序
1. `/Users/ar/Projects/PrivateVoice2/AGENTS.md`
2. `/Users/ar/Projects/PrivateVoice2/PROJECT.md`
3. `/Users/ar/Projects/PrivateVoice2/INDEX.md`
4. `/Users/ar/Projects/PrivateVoice2/02-P/进度地图.md`
5. `/Users/ar/Projects/PrivateVoice2/02-P/事件地图.md`
6. `/Users/ar/Projects/PrivateVoice2/03-O/CODEGRAPH.md`
7. `/Users/ar/Projects/PrivateVoice2/03-O/K2.项目管理/迁移资产清单.md`
## 当前事实快照
- 当前工作不是继续旧会话,而是从新项目文件接手。
- 源码根:`03-O/C1.source/privatevoice.src`
- 当前基线:`v2.2.0-build20260702.0303-real-user-test`
- Round 6 粤语实现和四包候选已完成。
- Windows preview 与官网正式发布仍有缺口。
## 接手自检命令
```bash
cd /Users/ar/Projects/PrivateVoice2/03-O
git status --short --branch
git diff --check
cd C1.source/privatevoice.src
npm --prefix frontend run build
go test ./...
```
## 不迁移内容
- 原始长会话正文。
- 旧 worktree。
- 旧构建包全集。
- 证书目录。
- node_modules、dist、构建缓存和用户级缓存。
## 成功判定
新窗口只读新项目文件后,应能说明:
- 项目是什么。
- 当前做到哪里。
- Git 根、源码根、QA 入口和发布入口在哪里。
- 下一步需要谁决策。
- 哪些材料是 legacy,不可直接作为当前任务来源。
K2.项目管理/迁移资产清单.md
New file
@@ -0,0 +1,44 @@
# 迁移资产清单
## 来源与目标
- 来源项目:`/Users/ar/Projects/PrivateVoice`
- 新项目:`/Users/ar/Projects/PrivateVoice2`
- 迁移时间:2026-07-02
- 基线:`0ffbf1935c9d091cce22a5583275ac0902f7a693` / `v2.2.0-build20260702.0303-real-user-test`
## 已迁入
| 来源 | 目标 | 说明 |
| --- | --- | --- |
| 旧 Git 仓库 | `03-O` | 使用 `git clone --no-hardlinks` 保留历史 |
| `privatevoice.src/` | `03-O/C1.source/privatevoice.src/` | 源码根迁入固定 C1.source |
| `02-P-NBL/` | `03-O/K2.项目管理/legacy/02-P-NBL/` | 旧 Round/计划/QA 证据,降级为历史 |
| `Docs/` | `03-O/K2.项目管理/legacy/Docs/` | 旧项目管理经验文档 |
| `TODO.md` | `03-O/K2.项目管理/legacy/TODO-旧任务清单.md` | 旧 TODO,只作历史 |
| `Release/PrivateVoice-Dictation-2.2.0-build20260702.0303/` | `03-O/C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/` | 最新真实用户测试候选包 |
| `X-运营资料/PrivateVoice-26.0604上架` 等 | `03-O/K3.运营与发布资料/legacy-运营资料/` | 本地运营素材,默认不提交 Git |
| `.codex-sessionhistory/` 关键信息 | `03-O/K2.项目管理/session-topics/`、`handoffs/` | 只迁移压缩摘要和交接,不迁原始正文 |
## 明确排除
- 旧项目 `.git/worktrees/` 与 `.worktrees/`。
- 旧项目 `.codex/` 与原始长会话正文。
- `privatevoice.src/frontend/node_modules/`。
- `privatevoice.src/frontend/dist/`。
- `privatevoice.src/build/local/`、`build/macappstore*`、`build/windows-preview/` 等本地构建输出。
- `Release/X-旧版build成果/` 历史包。
- `Release/01-证书/` 证书目录。
- 用户级缓存、系统噪声和 `.DS_Store`。
## Git 策略
- `03-O` 是新项目 Git 根。
- 最新包和运营素材已在本地目录保留,但大二进制文件默认由 `.gitignore` 排除,不进入迁移提交。
- `RELEASE_MANIFEST.md`、`SHA256SUMS.txt`、地图和清单可以提交。
## 风险说明
- 新路径把源码移动到 `C1.source/privatevoice.src`;已有脚本通常使用相对路径,后续执行命令需从新源码根进入。
- 历史文档里的旧路径保留为证据,不机械替换。
- 本次迁移不生成正式 release,不补跑 Windows 真机 QA,不补 notarization。
K3.运营与发布资料/README.md
New file
@@ -0,0 +1,12 @@
# 运营与发布资料
## 当前资料
- `screenshot.png`:产品截图。
- `legacy-运营资料/`:从旧项目选择性复制的运营素材和历史上架资料,本地保留,默认不提交 Git。
## 规则
- 运营素材不能覆盖 `PROJECT.md`、`发布地图.md` 或 release manifest 的当前发布事实。
- 名称带 `X-`、`旧`、`归档` 的资料只作历史参考。
- 如要对外发布官网内容,必须先在 `02-P/进度地图.md` 建立活跃任务并明确发布基线。
K3.运营与发布资料/legacy-运营资料/README.md
New file
@@ -0,0 +1,10 @@
# legacy 运营资料
本目录为旧项目运营资料的本地副本,来源:
- `/Users/ar/Projects/PrivateVoice/X-运营资料/PrivateVoice-26.0604上架`
- `/Users/ar/Projects/PrivateVoice/X-运营资料/运营文档`
- `/Users/ar/Projects/PrivateVoice/X-运营资料/OP资料-Privatevoice.MD`
- `/Users/ar/Projects/PrivateVoice/X-运营资料/26.0602-备忘.markdown`
这些材料用于追溯历史上架、截图、文案和运营准备,不是当前发布事实源。
K3.运营与发布资料/screenshot.png

README.md
old mode 100755 new mode 100644
@@ -1,165 +1,58 @@
# PrivateVoice
> 长按说话,松手即输 —— 离线 · 极速 · 跨平台
PrivateVoice 是一款离线语音转文字桌面 App:按住快捷键说话,松开后本地识别并输入到当前应用。当前源码位于 `C1.source/privatevoice.src`。
![PrivateVoice](screenshot.png)
![PrivateVoice](K3.运营与发布资料/screenshot.png)
PrivateVoice 是一款离线语音转文字工具。按住快捷键说话,松开即识别并输入文字到任意应用。无需联网,无需注册,开箱即用。
## 当前迁移基线
## 核心特性
- 分支:`codex/x-asr-experiment-2.1.29`
- Commit:`0ffbf1935c9d091cce22a5583275ac0902f7a693`
- Tag:`v2.2.0-build20260702.0303-real-user-test`
- 包类型:真实用户测试候选包,不是 notarized 官网正式发布包。
- 迁移后源码根:`C1.source/privatevoice.src`
- 最新候选包本地路径:`C2.builds/PrivateVoice-Dictation-2.2.0-build20260702.0303/`
- **完全离线** — SenseVoice 模型本地推理,无数据上传
- **DirectML GPU 加速** — 自动检测显卡,CPU 自动回退
- **两种输入模式** — 长按说话 + 短按自由说话
- **自定义快捷键** — 支持 Ctrl / Alt / Shift / 功能键 / 字母键
- **麦克风选择** — 下拉切换输入设备
- **录音音效** — 马林巴风格提示音(可关闭)
- **录音计时** — 指示器实时显示录音时长(0:00 → 0:03 → ...)
- **Escape 取消** — 录音中按 Esc 立即取消
- **剪贴板保护** — 粘贴后自动恢复原剪贴板内容
- **识别历史** — 自动保存最近 50 条,可复制、删除、设置保留时长
- **语气词过滤** — 自动去除"嗯、啊、呃"及 um/uh/hmm 等填充词
- **静音自动停止** — 自由说话模式下连续 3 秒无声自动结束并识别
- **中英混合优化** — 自动在中英文之间加空格,句首大写
- **DPI 自适应** — 指示器根据系统缩放自动调整大小
- **指示器可拖拽** — 拖动浮动指示器到任意位置,自动记忆
- **中英双语界面** — 自动跟随系统语言
- **应用内更新** — 自动检查新版本并提示下载
- **系统托盘常驻** — 关闭窗口不退出
- **开机自启** — 可选
## 核心能力
## 支持的输入语言
- 完全离线识别,模型本地推理。
- 长按说话与短按自由说话两种输入模式。
- 自定义快捷键、麦克风选择、录音音效、录音计时、Esc 取消。
- 剪贴板保护、识别历史、用户词库、语气词过滤和中英混合文本后处理。
- macOS 本地签名 DMG、Windows amd64 preview ZIP。
- 当前 Round 6 已新增独立 `粤语` 语言选项,默认模型为 `SenseVoice Yue 2025-09-09`。
当前 PrivateVoice 的产品语言版本为 **中文**、**English**、**French**、**German**、**Spanish**、**Italian**、**Portuguese**、**Japanese** 和 **Korean**。识别模型已经扩展到 SenseVoice、Moonshine English、Parakeet English、Parakeet TDT v3、日语 Zipformer、韩语 Zipformer、Qwen3-ASR 和 X-ASR zh-en 960ms;不同模型覆盖的输入语言和成熟度不同。
## 语言与模型状态
| 输入语言 / 场景 | 当前支持状态 | 默认 / 可选模型 | 说明 |
|---|---|---|---|
| 中文(普通话、简体 / 繁体) | 正式支持 | 默认:SenseVoice;可选高级:Qwen3-ASR;实验:X-ASR zh-en 960ms | 中文语言版本默认使用 SenseVoice,适合中文听写和日常输入。 |
| English | 正式支持 | 默认:Moonshine English;可选高级:Parakeet English;实验:X-ASR zh-en 960ms | English 语言版本默认使用 Moonshine English,Parakeet 适合更高准确率的英文输入。 |
| French / German / Spanish / Italian / Portuguese | 正式支持 | 默认:Parakeet TDT v3 | 欧洲五语统一使用 NVIDIA / sherpa-onnx 的 Parakeet TDT v3 多语种离线模型。Portuguese 覆盖 `pt-PT` 和 `pt-BR` 的基础识别路径。 |
| 中英混输 | 正式支持场景 | SenseVoice、Qwen3-ASR、X-ASR zh-en 960ms | 适合中文句子中夹杂英文术语、产品名、代码词等场景。 |
| 粤语(Cantonese) | 模型支持,尚非独立语言版本 | SenseVoice、Qwen3-ASR、X-ASR zh-en 960ms | 底层模型包含粤语能力;当前建议在中文语言版本下使用。 |
| 日语(日本語) | 正式支持 | 默认:Zipformer Japanese | 日语语言版本默认使用 ReazonSpeech 日语专项 Zipformer 离线模型。 |
| 韩语(한국어) | 正式支持 | 默认:Zipformer Korean | 韩语语言版本默认使用韩语专项 Zipformer 离线模型。 |
| 欧洲其他语种 | 模型支持,尚非独立语言版本 | Parakeet TDT v3 | Parakeet TDT v3 支持 25 种欧洲语言;当前只把 French、German、Spanish、Italian、Portuguese 作为正式产品语言版本。 |
| 其他语言 | 暂未正式支持 | 无独立默认模型 | 系统语言不在当前正式语言范围内时,当前产品会回落到 English 语言版本。 |
| --- | --- | --- | --- |
| 中文 | 正式支持 | 默认 SenseVoice;可选 Qwen3-ASR;实验 X-ASR zh-en 960ms | 中文听写和中英混输主路径。 |
| 粤语 | 真实用户测试候选 | 默认 SenseVoice Yue 2025-09-09 | 独立语言 profile:`yue-HK`,engine 参数固定 `yue`。 |
| English | 正式支持 | 默认 Moonshine English;可选 Parakeet English;实验 X-ASR zh-en 960ms | 英文听写主路径。 |
| French / German / Spanish / Italian / Portuguese | 正式支持 | Parakeet TDT v3 | 欧洲五语离线识别。 |
| Japanese | 正式支持 | Zipformer Japanese | 日语专项模型。 |
| Korean | 正式支持 | Zipformer Korean | 韩语专项模型。 |
| Windows preview | 技术预览 | SenseVoice only | 非 SenseVoice 模型可见但禁用;Windows 包未签名。 |
| 识别模型 | 模型状态 | 覆盖的输入语言 / 场景 | 所属语言版本 | 说明 |
|---|---|---|---|---|
| SenseVoice | 默认轻量模型 | 中文、粤语、English、日语、韩语 | 中文默认 | 轻量模型,当前推荐用于中文和中英混输,也提供日语、韩语等底层识别能力。 |
| Qwen3-ASR | 高级模型 | 中文、简繁中文、粤语、中英混输 | 中文可选 | 体积更大,适合中文长句、技术词和更高准确率需求。 |
| Moonshine English | 默认轻量模型 | English | English 默认 | 轻量英文离线模型,适合英文日常听写。 |
| Parakeet English | 高级模型 | English | English 可选 | 当前接入的是 `parakeet-unified-en-0.6b` 英文模型,适合长句、技术词和更高准确率需求。 |
| Parakeet TDT v3 | 默认多语种模型 | French、German、Spanish、Italian、Portuguese | 欧洲五语默认 | 一个模型包覆盖欧洲五语,适合离线听写;发布前基准对比 Canary-1B-v2 和 Whisper large-v3-turbo。 |
| Zipformer Japanese | 默认专项模型 | Japanese | 日语默认 | 基于 ReazonSpeech 的日语专项离线模型。 |
| Zipformer Korean | 默认专项模型 | Korean | 韩语默认 | 韩语专项离线模型。 |
| X-ASR zh-en 960ms | 实验模型 | 中文、English、粤语、中英混输 | 中文 / English 可选实验项 | 实验性中英流式模型,用于评估更低延迟和未来“边说边出字”体验。 |
## 快速开始
### 用户
1. 从项目 Releases 页面下载最新版本
2. **Windows**:解压到任意目录,双击 `privatevoice.exe`
3. **macOS**:打开 `.dmg`,拖入 Applications,首次启动需授予辅助功能权限
4. 首次启动自动下载语音模型(~200 MB)
5. 就绪后,在任意输入框中按住 **右 Ctrl**(macOS: **右 Command**)说话,松开即输入
### 开发者
## 开发入口
```bash
# 环境要求
# - Go 1.22+
# - Node.js 20+
# - CGO 编译器 (Windows: LLVM MinGW UCRT, macOS: Xcode Command Line Tools)
# 克隆
git clone <PrivateVoice 仓库地址>
cd PrivateVoice/privatevoice.src
# 安装前端依赖
cd frontend && npm install && cd ..
# 开发模式
wails3 dev
# 生产构建 (Windows)
windres privatevoice.rc -o privatevoice.syso
CGO_ENABLED=1 go build -ldflags "-H windowsgui -s -w" -o privatevoice.exe .
# 生产构建 (macOS)
CGO_ENABLED=1 go build -o privatevoice .
cd /Users/ar/Projects/PrivateVoice2/03-O/C1.source/privatevoice.src
npm --prefix frontend run build
go test ./...
```
## 使用方法
常用打包和 QA 命令见 `CODEGRAPH.md`、`K2.项目管理/QA地图.md` 和 `K2.项目管理/发布地图.md`。
1. 系统托盘出现 PrivateVoice 图标,引擎加载完成后就绪
2. **长按模式**:按住快捷键说话,松开即识别并粘贴
3. **自由说话**:短按一下开始,连续说话,再短按一下停止
4. **取消录音**:录音中按 Esc
5. 右键托盘图标可打开设置或退出
## 目录
## 运行文件
**Windows:**
| 文件 | 大小 | 说明 |
|---|---|---|
| `privatevoice.exe` | ~15 MB | 主程序 |
| `onnxruntime.dll` | ~15 MB | ONNX Runtime |
| `sherpa-onnx-c-api.dll` | ~4 MB | sherpa-onnx C API |
| `sherpa-onnx-cxx-api.dll` | ~248 KB | sherpa-onnx C++ API |
| `models/sensevoice/` | ~200 MB | 语音模型(首次自动下载) |
**macOS:**
| 文件 | 大小 | 说明 |
|---|---|---|
| `PrivateVoice Dictation.app` | ~15 MB | 应用包(含 dylib) |
| `models/sensevoice/` | ~200 MB | 语音模型(首次自动下载) |
## 项目结构
```text
03-O/
├── C1.source/privatevoice.src/   源码根
├── C2.builds/                    本地迁移的最新候选包,二进制包不纳入 Git 提交
├── C3.tools/                     工具索引
├── K1.业务知识/                  成果地图和长期业务/技术知识
├── K2.项目管理/                  QA、发布、迁移、handoff、legacy 资料
├── K3.运营与发布资料/            当前运营资料索引和本地素材
└── CODEGRAPH.md                  人工工程地图
```
privatevoice.src/
├── main.go               # 入口:单实例 + Wails 启动
├── app.go                # 编排:热键 → 录音 → 识别 → 粘贴
├── internal/
│   ├── audio/            # malgo 录音 + 设备枚举
│   ├── engine/           # sherpa-onnx 推理
│   ├── hotkey/           # 全局热键轮询
│   ├── input/            # 剪贴板 + 粘贴 + 剪贴板保护
│   ├── config/           # JSON 配置
│   ├── history/          # 识别历史(JSON 持久化)
│   ├── textproc/         # 中英混合文本后处理
│   ├── sound/            # 录音音效(合成 WAV)
│   ├── overlay/          # 浮动指示器(Win32 GDI+ / macOS AppKit)
│   └── ...
├── services/             # Wails 服务(前端绑定)
└── frontend/             # Svelte + Vite
    ├── src/components/   # 设置窗口 + 指示器
    └── src/lib/          # stores + i18n
```
## 技术栈
| 组件 | 技术 |
|---|---|
| 桌面框架 | [Wails v3](https://wails.io/) |
| 前端 | [Svelte 5](https://svelte.dev/) + Vite + TypeScript |
| 音频录制 | [malgo](https://github.com/gen2brain/malgo) (miniaudio) |
| 语音识别 | [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) (SenseVoice) |
| 全局热键 | Windows: GetAsyncKeyState 轮询 / macOS: NSEvent + CGEventSource |
| 文字输入 | Windows: 剪贴板 + SendInput / macOS: 剪贴板 + CGEvent |
| 浮动指示器 | Windows: GDI+ Layered Window / macOS: AppKit + CoreGraphics |
| 音效 | 程序合成 WAV + 平台原生播放 |
## 许可证
MIT License
## 致谢
- [SherpaOnnx](https://github.com/k2-fsa/sherpa-onnx) — 语音识别引擎
- [Wails](https://wails.io/) — Go 桌面应用框架
- [SenseVoice](https://github.com/FunAudioLLM/SenseVoice) — 语音模型