edit | blame | history | raw

Round 4 研发任务拆解:Parakeet English 高级模型

状态:v0.1 研发拆解稿
所属子项目:02-P-NBL
Round:Round 4
日期:2026-06-03
输入文档:

1. 研发目标

让 English 用户可以主动下载并切换到 Parakeet English,同时保持 Moonshine 默认路径和中文 SenseVoice 路径不退化。

2. 交付边界

2.1 必须交付

  • parakeet-en model profile。
  • BackendNemoTransducer backend kind。
  • Parakeet required files 校验。
  • Parakeet sherpa config builder。
  • 模型选择 API:
  • 列出当前语言可用模型。
  • 获取每个模型安装状态。
  • 选择已安装模型。
  • 下载并选择未安装模型。
  • English 设置页模型选择 UI。
  • Moonshine 和 Parakeet 互相切换。
  • 下载失败保护。
  • 开发自查、代码复审、QA handoff。

2.2 明确不交付

  • Qwen3-ASR。
  • 欧洲语言 UI。
  • 多 Parakeet 变体选择。
  • 自动删除模型。
  • 正式签名和 notarization。

3. 推荐任务顺序

T0 现状确认
T1 Parakeet profile
T2 Nemo transducer backend builder
T3 模型选择服务 API
T4 设置页模型选择 UI
T5 下载/切换状态处理
T6 单元测试和前端构建
T7 代码复审
T8 QA handoff
T9 测试包准备

4. 任务明细

T0:现状确认

重点文件:

  • privatevoice.src/internal/model/profile.go
  • privatevoice.src/internal/model/registry.go
  • privatevoice.src/internal/model/resolver.go
  • privatevoice.src/internal/engine/engine.go
  • privatevoice.src/internal/engine/engine_darwin.go
  • privatevoice.src/services/engine_service.go
  • privatevoice.src/frontend/src/components/settings/GeneralPage.svelte

完成标准:

  • 明确 Round 3 current model resolver 行为。
  • 明确设置页现有语言切换路径。
  • 明确前端能否复用 EngineService.DownloadCurrentModel()

T1:Parakeet profile

工作内容:

  • 新增常量:
  • ParakeetModelID = "parakeet-en"
  • BackendNemoTransducer = "nemo_transducer"
  • 新增 parakeet-en profile。
  • 配置 required files:
  • encoder.int8.onnx
  • decoder.int8.onnx
  • joiner.int8.onnx
  • tokens.txt
  • ProviderOrder 使用 cpu
  • DownloadURLs 使用官方 unified-en 0.6b int8 URL。

完成标准:

  • GetModelProfile("parakeet-en") 可返回完整 profile。
  • ValidateModelDir(parakeet-en) 校验准确。
  • profile 不改变 English 默认模型,English 默认仍是 moonshine-en

T2:Nemo transducer backend builder

工作内容:

  • NewWithResolvedModel 支持 BackendNemoTransducer
  • 新增 buildNemoTransducerConfig
  • 设置:
Transducer.Encoder = resolved.Files["encoder"]
Transducer.Decoder = resolved.Files["decoder"]
Transducer.Joiner = resolved.Files["joiner"]
Tokens = resolved.Files["tokens"]
ModelType = "nemo_transducer"
Provider = "cpu"

完成标准:

  • Parakeet 引擎可初始化。
  • HardwareInfo() 显示 Parakeet English · CPU
  • 未知 backend 仍返回明确错误。

T3:模型选择服务 API

工作内容:

  • 新增或扩展服务 API:
  • ListModelOptions()
  • SelectModel(modelID string)
  • DownloadModelByID(modelID string)
  • DeleteModel(modelID string) 可暂缓,不作为本轮强制交付。
  • 选择模型时:
  • 合法性校验。
  • 语言兼容性校验。
  • 未安装模型不能直接选择,应提示下载。
  • 已安装模型选择后设置 ModelSelectionMode=manual
  • 更新 SelectedModelID
  • 触发 engine reload。

完成标准:

  • English 可选 Moonshine/Parakeet。
  • 中文不自动选择 Parakeet。
  • 选择非法模型返回错误,不写坏配置。

T4:设置页模型选择 UI

工作内容:

  • 在设置页语言区域附近新增模型选择区域。
  • English 显示 Moonshine 和 Parakeet。
  • 中文至少显示 SenseVoice。
  • UI 显示:
  • 当前使用。
  • 已安装/未安装。
  • 下载大小。
  • 下载/使用按钮。
  • 下载中进度。

完成标准:

  • English 用户能从 UI 下载 Parakeet。
  • 下载完成后能使用 Parakeet。
  • 能切回 Moonshine。
  • UI 不显示误导性默认策略。

T5:下载/切换状态处理

工作内容:

  • 下载期间禁用重复点击。
  • 下载失败后保留原模型。
  • 下载成功后切换到目标模型。
  • 切换失败时回到原模型或显示 error,不破坏配置。

完成标准:

  • Parakeet 下载失败不破坏 Moonshine。
  • Parakeet 初始化失败不破坏 SenseVoice。
  • .downloads.staging 不被判定为可用模型。

T6:测试

后端:

cd privatevoice.src
go test ./... -count=1

前端:

cd privatevoice.src/frontend
npm run build

检查:

git diff --check

完成标准:

  • 全部通过。
  • 关键测试覆盖 profile、resolver、backend、服务 API。

T7:代码复审

复审重点:

  • 是否保持 Moonshine 默认。
  • 是否存在未安装模型直接切换。
  • 是否存在下载失败破坏旧模型。
  • 是否在中文路径误触发 Parakeet。
  • UI 状态是否会误导用户。

T8:QA handoff

交付:

  • QA handoff 文档。
  • 开发自查日志。
  • 已知风险。
  • Parakeet 真实下载 URL 和大小。

T9:测试包准备

若 QA 预检通过:

  • 递增版本到 2.1.22
  • 生成新 build 编号。
  • 构建 .dmg
  • 生成 RELEASE_MANIFEST.md
  • 验证 DMG。
  • tag。