Skip to content

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

@appergb

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions