Skip to content

feat(ASR): 增加对本地 ASR AI 的支持 #211

Description

@appergb

背景

目前 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 已关闭"

验收标准

  • 产出 docs/local-asr-plan.md,七节问题全部回答清楚,含选型结论
  • 用户在未配置任何云端 Key 的情况下,可走通:热键 → 录音 → 本地 ASR → 直接插入原文(polish 旁路)
  • 现有云端 ASR + 云端 polish 用户体验不受影响
  • 切换 ASR provider 不需要重启 App
  • License 合规材料归档(NOTICE / 致谢页面更新)

不在范围

  • 本地 polish / 本地 LLM
  • 本地 TTS
  • 自训练 / 微调模型
  • 服务端代理本地推理

关联

  • 工作分支:feat/local-ai-support
  • 相关代码:openless-all/app/src-tauri/src/asr/coordinator.rscommands.rs

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions