状态:v0.1 启动稿
所属子项目:02-P-NBL
Round:Round 3
日期:2026-06-03
基线版本:v2.1.20-build20260603.1145
基线 commit:f66a79670c444010a59b8513c9f61257ebc7d9b6
关联文档:
Round 1 已完成模型 profile 基础设施,Round 2 已完成语言检测和语言版本设置。当前状态是:
LanguageProfile 已经有 zh-CN 和 en。en 语言版本仍临时使用 sensevoice-zh。sensevoice backend。Round 3 要把 English 语言版本接到真正的英文默认模型 Moonshine English。
Round 3 完成后:
| 场景 | effective language | 默认模型 | 期望结果 |
|---|---|---|---|
| 中文系统新用户 | zh-CN |
sensevoice-zh |
继续中文 UI + SenseVoice |
| English 系统新用户 | en |
moonshine-en |
English UI + Moonshine English |
| 其他系统语言新用户 | en |
moonshine-en |
English UI + Moonshine English |
| 老中文用户升级 | zh-CN |
sensevoice-zh |
不重新下载、不丢数据 |
| 用户手动切到 English | en |
moonshine-en |
未安装则提示/下载 Moonshine |
| 用户手动切回中文 | zh-CN |
sensevoice-zh |
使用已有 SenseVoice |
核心目标:
moonshine-en model profile。moonshine-en。明确不做:
Round 3 选择:
model id: moonshine-en
actual package: sherpa-onnx-moonshine-base-en-int8
backend kind: moonshine
language: English only
选择 base-en-int8,不是 tiny-en-int8,原因:
base-en-int8.tar.bz2 约 250807309 bytes,约 239 MiB。tiny-en-int8 可作为工程备用候选,但本轮不暴露为独立 UI 选项。资料依据:
新增 profile:
ID: moonshine-en
DisplayName: Moonshine English
BackendKind: moonshine
Tier: default
SupportedLanguageIDs: en
RecommendedFor: en
Description: 轻量英文离线模型,适合英文听写和英文日常输入。
ApproxSize: 约 239 MiB 下载包,解压后约 270-280 MiB
InstallDirName: moonshine-en
ProviderOrder: cpu
NumThreads: 4
下载 URL:
primary:
https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-moonshine-base-en-int8.tar.bz2
fallback:
https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-moonshine-tiny-en-int8.tar.bz2
说明:
Required files:
| Role | Required file |
|---|---|
preprocessor |
preprocess.onnx |
encoder |
encode.int8.onnx |
uncached_decoder |
uncached_decode.int8.onnx |
cached_decoder |
cached_decode.int8.onnx |
tokens |
tokens.txt |
当前项目锁定:
github.com/k2-fsa/sherpa-onnx-go v1.12.24
github.com/k2-fsa/sherpa-onnx-go-macos v1.12.24
该版本 Moonshine 是 v1 四文件配置:
config.ModelConfig.Moonshine.Preprocessor = resolved.Files["preprocessor"]
config.ModelConfig.Moonshine.Encoder = resolved.Files["encoder"]
config.ModelConfig.Moonshine.UncachedDecoder = resolved.Files["uncached_decoder"]
config.ModelConfig.Moonshine.CachedDecoder = resolved.Files["cached_decoder"]
config.ModelConfig.Tokens = resolved.Files["tokens"]
config.ModelConfig.NumThreads = resolved.Profile.NumThreads
config.ModelConfig.Provider = "cpu"
config.DecodingMethod = "greedy_search"
保留:
config.FeatConfig.SampleRate = 16000
config.FeatConfig.FeatureDim = 80
不要使用:
encoder_model.ort
decoder_model_merged.ort
MergedDecoder
这些不是当前项目依赖版本对应的 Moonshine v1 接入形态。
Round 3 必须修正“当前模型”的定义。
当前问题:
config.Default().SelectedModelID = sensevoice-zh
engine.New() 直接读取 SelectedModelID
这会导致 English 新用户即使 effective language 是 en,仍然被锁到 SenseVoice。
Round 3 目标规则:
CurrentModel = ResolveCurrentModel(Config, EffectiveLanguage)
建议引入:
ModelSelectionMode = auto | manual
默认:
ModelSelectionMode = auto
解析规则:
| 条件 | 当前模型 |
|---|---|
ModelSelectionMode=auto 且 effective language=zh-CN |
sensevoice-zh |
ModelSelectionMode=auto 且 effective language=en |
moonshine-en |
ModelSelectionMode=manual 且 SelectedModelID 合法 |
SelectedModelID |
ModelSelectionMode=manual 但模型非法 |
回退到 effective language 默认模型,并记录日志 |
旧配置缺少 ModelSelectionMode |
视为 auto |
说明:
manual。SelectedModelID=sensevoice-zh 应视为历史默认值,不应阻止 English 默认 Moonshine 生效。ModelSelectionMode 设为 manual。作为 English macOS 用户,我第一次启动 App 时,应看到 English UI,并自动准备 Moonshine English。
验收点:
en。moonshine-en。Moonshine English · CPU 或等价信息。作为中文 macOS 用户,我第一次启动 App 时,应保持 Round 2 体验。
验收点:
zh-CN。sensevoice-zh。作为已有中文用户,我升级到 Round 3 后,不应被要求下载 Moonshine。
验收点:
userdict.json 不变。history.json 不变。作为用户,我在设置页把语言版本切到 English 后,App 应切换到英文产品路径。
验收点:
moonshine-en。作为用户,我可以从 English 切回中文。
验收点:
sensevoice-zh。Round 3 onboarding 不应再让前端从 Config.ModelDownloadUrl 和 FallbackModelDownloadUrl 读取 SenseVoice URL。
目标:
frontend -> EngineService.DownloadCurrentModel()
backend -> ResolveCurrentModel()
backend -> profile.DownloadURLs
backend -> DownloadProfile(profile, urls, modelsRoot)
要求:
ModelExists() 检查 current model,不是固定 SenseVoice。DownloadCurrentModel() 下载 current model。model:download-progress。保留兼容:
DownloadModel(primaryURL, fallbackURL) API,但 Round 3 前端不应再调用它。ModelDownloadUrl / FallbackModelDownloadUrl 可暂时留在 config 中,不在本轮强删。期望:
models/sensevoice、models/sensevoice-zh。models/moonshine-en 完整目录。如果 moonshine-en 缺少任意 required file:
ValidateModelDir 返回 incomplete。ModelExists() 返回 false。engine.New() 不应崩溃。如果 Moonshine sherpa 初始化失败:
error 或 need_model,取决于模型是否完整存在。Round 3 功能性验收 PASS 必须满足:
history.json。go test ./... 通过。npm run build 通过。