.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.icnsBinary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-macos26-mic.icnsBinary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-refined-mic.icnsBinary files differ
C1.source/privatevoice.src/build/darwin/VoiceSnap-selected-B-shadow.icnsBinary files differ
C1.source/privatevoice.src/build/darwin/app_icon.pngC1.source/privatevoice.src/build/darwin/app_icon_source.pngC1.source/privatevoice.src/build/darwin/approved_app_icon.pngC1.source/privatevoice.src/build/darwin/archive/legacy-icons/VoiceSnap-original.icnsBinary 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.icnsBinary files differ
C1.source/privatevoice.src/build/darwin/macos26_mic_app_icon.pngC1.source/privatevoice.src/build/darwin/original_app_icon.pngC1.source/privatevoice.src/build/darwin/refined_mic_app_icon.pngC1.source/privatevoice.src/build/darwin/tray_icon.pngC1.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.icoC1.source/privatevoice.src/build/windows/wails.exe.manifest
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_A_pure-blue-mic.pngC1.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.pngC1.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.pngC1.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.pngC1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_C_taglauncher-style.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.pngC1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_D_glass-circle.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.pngC1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_E_compact-liquid.svg
C1.source/privatevoice.src/design/icon-candidates/voicesnap_icon_candidates_preview.pngC1.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.pngC1.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.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.pngK2.项目管理/legacy/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.pngK2.项目管理/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.pngREADME.mdold mode 100755 new mode 100644
@@ -1,165 +1,58 @@ # PrivateVoice > 长按说话,松手即输 —— 离线 · 极速 · 跨平台 PrivateVoice 是一款离线语音转文字桌面 App:按住快捷键说话,松开后本地识别并输入到当前应用。当前源码位于 `C1.source/privatevoice.src`。   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) — 语音模型