背景
目前 OpenLess 的 ASR 链路依赖云端服务(Volcengine 流式 WebSocket / Whisper HTTP),对离线 / 隐私敏感 / 自部署场景不友好。本 issue 聚焦 本地 ASR,让用户可以选择本地推理替代云端 ASR。
范围澄清(重要)
- ✅ "本地 AI" = 本地 ASR AI:本 issue 只做语音识别的本地化,不包含其他类型的本地模型(不做本地 polish / 本地 LLM / 本地 TTS)。
- ✅ 作为可选形态:保留现有云端 ASR provider,本地 ASR 与之并列,由用户在「设置」中选择,互不影响。
- ⛔ Polish(文本润色)暂时关闭:本期不动 polish 链路。当 ASR provider 选为本地时,polish 走旁路(复用现有"缺 Ark 凭据 → 插入 ASR 原文"的兜底,参见
CLAUDE.md 中"Polish/ASR fallbacks are silent"约定)。是否做本地 polish 后续单独立项。
规划文档需回答的问题
进入实现前,先产出 docs/local-asr-plan.md,逐条回答以下问题:
1. 接口选型(决定一条)
- (a) 应使用哪种集成方式?候选:
- 直接绑定 Rust crate(如
whisper-rs,FFI 到 whisper.cpp)
- 子进程 + stdin/stdout 或 HTTP(如本地起
whisper.cpp server)
- OpenAI 兼容 HTTP(
/v1/audio/transcriptions,转用户自部署服务)
- (b) 在以下维度给出对比并选定:首字延迟、是否支持流式、安装/打包难度、跨平台一致性、与现有
asr/ 模块结构契合度
2. 接口使用方式
- (a) 数据流如何对齐现有管道:
Recorder 输出 16kHz mono Int16 PCM → 本地 ASR → 文本 → Coordinator
- (b) 是否支持流式增量结果?若不支持,整段解码的 UX 如何处理(capsule 状态机是否需要扩展)
- (c) 失败兜底:本地推理报错 / 模型缺失时的策略(不能丢用户的话)
3. 本地模型下载与管理
- (a) 模型分发方式:应用内自动下载 / 用户手动放置 / 内置打包;选定一种并说明理由
- (b) 模型存放路径(macOS:
~/Library/Application Support/OpenLess/models/?Windows: %APPDATA%\OpenLess\models\?)
- (c) 下载源、文件校验(sha256)、断点续传、升级策略
- (d) 默认模型尺寸选择(tiny/base/small/medium)—— 需在体积和准确率间权衡
4. 开源项目调研与选型
逐一评估候选并输出对比表(含 License、平台、加速、活跃度、Rust 友好度):
| 项目 |
形态 |
平台 |
加速 |
License |
备注 |
whisper.cpp |
C/C++ |
mac/win/linux |
Metal/CoreML/CUDA |
MIT |
主流候选 |
whisper-rs |
Rust binding |
同上 |
同上 |
MIT/Apache-2.0 |
Rust 集成更顺 |
sherpa-onnx |
C++ + ONNX |
跨平台 |
CoreML/CUDA |
Apache-2.0 |
多模型支持 |
faster-whisper |
Python (CTranslate2) |
跨平台 |
CUDA/CPU |
MIT |
需带 Python runtime |
| MLX-Whisper |
Python + MLX |
仅 Apple Silicon |
Metal |
MIT |
macOS 专属,跨平台不可用 |
最终需选定一个主候选 + 一个备选。
5. License 合规确认
- (a) 所选开源项目的 License 是否允许我们当前的使用方式(嵌入二进制 / 分发 / 商业使用)
- (b) 是否需要在 App 内附加 NOTICE / 保留原始版权声明 / 在「关于」页面致谢
- (c) 模型权重的 License 与代码 License 是分开的:需单独确认 Whisper 权重(OpenAI MIT 发布)以及任何替代模型权重的许可
6. 性能与体验目标
- (a) Apple Silicon 上 small 模型的 RTF(实时率)目标
- (b) 整段延迟目标(说完到插入完成)
- (c) CPU / 内存 / 磁盘占用上限
7. 设置与 UI 影响
- (a) 「设置 → ASR Provider」中新增"本地"选项;切换时不需要重启
- (b) 本地 provider 的健康检查(模型文件存在 / 推理可用)
- (c) 模型下载进度 / 状态展示
- (d) 选用本地 provider 时,UI 上明确提示"polish 已关闭"
验收标准
不在范围
- 本地 polish / 本地 LLM
- 本地 TTS
- 自训练 / 微调模型
- 服务端代理本地推理
关联
- 工作分支:
feat/local-ai-support
- 相关代码:
openless-all/app/src-tauri/src/asr/、coordinator.rs、commands.rs
背景
目前 OpenLess 的 ASR 链路依赖云端服务(Volcengine 流式 WebSocket / Whisper HTTP),对离线 / 隐私敏感 / 自部署场景不友好。本 issue 聚焦 本地 ASR,让用户可以选择本地推理替代云端 ASR。
范围澄清(重要)
CLAUDE.md中"Polish/ASR fallbacks are silent"约定)。是否做本地 polish 后续单独立项。规划文档需回答的问题
进入实现前,先产出
docs/local-asr-plan.md,逐条回答以下问题:1. 接口选型(决定一条)
whisper-rs,FFI 到whisper.cpp)whisper.cppserver)/v1/audio/transcriptions,转用户自部署服务)asr/模块结构契合度2. 接口使用方式
Recorder输出 16kHz mono Int16 PCM → 本地 ASR → 文本 →Coordinator3. 本地模型下载与管理
~/Library/Application Support/OpenLess/models/?Windows:%APPDATA%\OpenLess\models\?)4. 开源项目调研与选型
逐一评估候选并输出对比表(含 License、平台、加速、活跃度、Rust 友好度):
whisper.cppwhisper-rssherpa-onnxfaster-whisper最终需选定一个主候选 + 一个备选。
5. License 合规确认
6. 性能与体验目标
7. 设置与 UI 影响
验收标准
docs/local-asr-plan.md,七节问题全部回答清楚,含选型结论不在范围
关联
feat/local-ai-supportopenless-all/app/src-tauri/src/asr/、coordinator.rs、commands.rs