状态:v0.1 研发拆解稿
所属子项目:02-P-NBL
Round:Round 1
日期:2026-06-02
输入文档:
Round 1 的研发目标是:
在不改变用户体验的前提下,把现有 SenseVoice 单模型实现改造成可扩展的 ModelProfile 架构。
本轮不接入 Moonshine、Parakeet、Qwen3-ASR,不做语言 UI,不做模型选择 UI。
ModelProfile / ModelRegistryLanguageProfile / LanguageRegistry 最小实现RequiredFileRule,支持 allOf / anyOfModelInstallState,读写 models/state.jsonModelResolver,支持 state、新目录、旧目录 fallbackResolvedModelsensevoice-zh profileSelectedModelID 隐藏配置,默认 sensevoice-zhEngineFactory 初步实现manifest.jsonT0 代码现状确认
T1 Profile / Registry 基础类型
T2 Required files 校验器
T3 Install state 读写
T4 ModelResolver
T5 Config 兼容与 SelectedModelID
T6 EngineFactory 改造
T7 下载器安全安装
T8 EngineService / Wails 兼容
T9 自动化测试
T10 开发自查与交付说明
建议按顺序推进。T1-T5 是地基,T6-T8 是业务接入,T9-T10 是进入 QA 前的门禁。
负责人:后端
类型:准备任务
建议文件:
privatevoice.src/internal/engine/engine.goprivatevoice.src/internal/engine/engine_darwin.goprivatevoice.src/internal/model/downloader.goprivatevoice.src/internal/paths/paths.goprivatevoice.src/internal/config/config.goprivatevoice.src/services/engine_service.goprivatevoice.src/frontend/src/App.svelteprivatevoice.src/frontend/src/components/onboarding/OnboardingView.svelte工作内容:
完成标准:
负责人:后端
建议文件:
privatevoice.src/internal/model/profile.goprivatevoice.src/internal/model/registry.go工作内容:
ModelProfile。LanguageProfile。RequiredFileRule 类型。sensevoice-zh profile。zh-CN language profile。GetModelProfile(id)、DefaultModelProfile()、ListModelProfiles() 等最小 registry 方法。关键要求:
ModelProfile 使用 SupportedLanguageIDs 和 RecommendedFor 两个字段,不混用。sensevoice-zh 的 InstallDirName 为 sensevoice-zh。BackendKind 为 sensevoice。完成标准:
sensevoice-zh。负责人:后端
建议文件:
privatevoice.src/internal/model/validator.go工作内容:
RequiredFileRule 的 AllOf / AnyOf 校验。model、tokens。model.int8.onnx 和 model.onnx 时优先选择 model.int8.onnx。完成标准:
model.onnx 时可通过。model.int8.onnx 时可通过。tokens.txt 时失败。负责人:后端
建议文件:
privatevoice.src/internal/model/install_state.goprivatevoice.src/internal/paths/paths.go工作内容:
paths.ModelInstallDir(name string)。paths.ModelStatePath()。models/state.json 最小 schema。path 字段存相对 models 根目录路径。完成标准:
负责人:后端
建议文件:
privatevoice.src/internal/model/resolver.go工作内容:
ResolvedModel。sensevoice-zh 记录路径models/sensevoice-zhmodels/sensevoice完成标准:
ResolvedModel.Files["model"] 和 ResolvedModel.Files["tokens"]。负责人:后端
建议文件:
privatevoice.src/internal/config/config.go工作内容:
SelectedModelID string。sensevoice-zh。sensevoice-zh。ModelDownloadUrl 和 FallbackModelDownloadUrl。完成标准:
config.json 可正常加载。ConfigService.GetConfig() 返回兼容旧前端的数据。负责人:后端
建议文件:
privatevoice.src/internal/engine/engine.goprivatevoice.src/internal/engine/factory.goprivatevoice.src/internal/engine/engine_darwin.goprivatevoice.src/internal/engine/engine_linux.goprivatevoice.src/internal/engine/engine_windows.go工作内容:
engine.New()。NewWithModelID(modelID string)。NewWithResolvedModel(resolved model.ResolvedModel)。newPlatformEngine 改为接收 ResolvedModel。resolved.Files["model"] 和 resolved.Files["tokens"]。HardwareInfo() 保持 SenseVoice · CoreML/CPU 风格。完成标准:
负责人:后端
建议文件:
privatevoice.src/internal/model/downloader.go工作内容:
sensevoice-zh 安装。models/.downloads/sensevoice-zh/<run-id>。models/sensevoice-zh。models/state.json。models/sensevoice。完成标准:
RemoveAll(models/sensevoice)。负责人:后端 + 前端确认
建议文件:
privatevoice.src/services/engine_service.goprivatevoice.src/frontend/src/App.svelteprivatevoice.src/frontend/src/components/onboarding/OnboardingView.svelte工作内容:
EngineService.ModelExists() bool 签名。EngineService.DownloadModel(primaryURL, fallbackURL) error 签名。ModelExists() 返回当前 default/selected model 是否完整可用。model:download-progress payload。engine:status 事件语义。完成标准:
ModelExists -> need_model -> OnboardingView -> DownloadModel -> ready 链路正常。负责人:后端 + QA 协作
建议文件:
privatevoice.src/internal/model/*_test.go最低测试集:
allOf / anyOf。SelectedModelID 默认和无效值回退。完成标准:
负责人:研发负责人
建议文件:
02-P-NBL/round-1/dev-checklist.md工作内容:
完成标准:
| 任务 | 依赖 |
|---|---|
| T1 | T0 |
| T2 | T1 |
| T3 | T1 |
| T4 | T1, T2, T3 |
| T5 | T1 |
| T6 | T4, T5 |
| T7 | T2, T3, T4 |
| T8 | T4, T6, T7 |
| T9 | T1-T8 |
| T10 | T9 |
Round 1 研发完成必须同时满足:
研发移交 QA 时应提供: