Skip to content

feat(windows): add sherpa-onnx local ASR#504

Open
weikeyi wants to merge 2 commits into
Open-Less:betafrom
weikeyi:feat/windows-sherpa-onnx-local-asr
Open

feat(windows): add sherpa-onnx local ASR#504
weikeyi wants to merge 2 commits into
Open-Less:betafrom
weikeyi:feat/windows-sherpa-onnx-local-asr

Conversation

@weikeyi
Copy link
Copy Markdown
Contributor

@weikeyi weikeyi commented May 20, 2026

User description

背景

本 PR 为 Windows 端接入 sherpa-onnx 本地离线 ASR 能力,补齐 OpenLess 在 Windows 上不依赖云端服务的语音识别路径。

目标是让用户可以在本地下载、管理 Sherpa 模型,并通过现有 Tauri/React 设置页启用本地识别,同时保持现有 Qwen、Foundry、云端 ASR 路径不受影响。

主要变更

1. 新增 Windows Sherpa 本地 ASR 后端

  • 新增 Sherpa 模型目录、catalog、状态描述和模型别名管理。
  • 新增 SherpaOnnxRuntime,封装 Windows 下的模型加载、转写、释放和取消逻辑。
  • 新增 SherpaOnnxAsr provider,接入现有 coordinator 的 ASR provider 抽象。
  • 支持以下模型别名:
    • sense-voice-small-zh
    • paraformer-zh
    • whisper-small-multi
  • 在 Cargo.toml 中为 Windows 引入 sherpa-onnx = 1.13.2 静态链接依赖。

2. 新增 Sherpa 模型下载与管理

  • 新增 sherpa_download.rs,实现 Sherpa 模型下载管理器。
  • 支持远程模型信息获取、分片下载、取消下载、大小校验和 SHA-256 校验。
  • 下载完成后只保留运行时必要文件,减少模型目录冗余。
  • 复用现有 Local ASR 下载辅助逻辑。
  • 新增 Sherpa 下载进度事件:
    • sherpa-onnx-asr-download-progress

3. 扩展 Tauri IPC 命令

新增 Sherpa 相关命令,用于前端管理本地模型和运行时状态,包括:

  • 查询状态和模型目录
  • 查询静态模型 catalog
  • 获取远程模型信息
  • 下载 / 取消下载模型
  • 设置当前模型和语言提示
  • 准备 / 取消准备运行时
  • 释放运行时
  • 删除模型
  • 打开模型目录

同时在 lib.rs 中注册 SherpaDownloadManager 和相关 command handler。

4. 接入 coordinator 运行链路

  • 在 coordinator 中新增 Sherpa local ASR runtime/provider 管理。
  • 支持从偏好设置切换到 sherpa-onnx-local provider。
  • 会话开始、取消、结束和资源释放逻辑接入现有状态机。
  • 在 provider 切换时优先取消 Sherpa prepare,避免运行时状态残留。

5. 前端 Local ASR / Settings 页面集成

  • 在 Local ASR 页面中加入 Sherpa 模型选择、下载、准备、启用、删除和打开目录等操作。
  • 支持模型下载进度展示、取消下载、运行时准备状态展示。
  • 扩展前端 IPC 类型、Local ASR 类型和 i18n 文案。
  • Settings 相关 UI 保持和现有本地 ASR 体验一致。

6. Windows Common Controls v6 manifest 修复

Sherpa 测试二进制在 Windows 上曾因为缺少 Common Controls v6 manifest,启动时报 STATUS_ENTRYPOINT_NOT_FOUND

本 PR 在 build.rs 中加入更稳妥的 manifest dependency 注入方式:

  • 不使用 /MANIFESTINPUT,避免和 Tauri app 自带 manifest 产生 duplicate resource type:MANIFEST
  • 不直接通过 cargo:rustc-link-arg=/MANIFESTDEPENDENCY:... 传参,避免 MSVC/Cargo 因空格拆参导致 LNK1181
  • 改为生成一个小 C object,通过 #pragma comment(linker, "/manifestdependency:...") 注入 Common Controls v6 dependency,并用 /INCLUDE 强制 linker 拉入该 object。

这样测试二进制和主应用二进制都能获得 Common Controls v6 dependency,同时不会造成 manifest 重复资源冲突。

7. 测试修正

  • 更新 Sherpa runtime/provider 单元测试,使其匹配真实运行时行为。
  • 修复 Windows 下 cmd modifier 归一化为 Ctrl 的快捷键测试断言。
  • 修复 Foundry Windows App Runtime 检测脚本测试断言,匹配当前转义正则字符串。

验证结果

已在 Windows 本地完成以下验证:

  • git diff --check
  • git diff --cached --check
  • 冲突标记扫描 ✅
  • cargo check --manifest-path openless-all/app/src-tauri/Cargo.toml
  • cargo build --manifest-path openless-all/app/src-tauri/Cargo.toml
  • cargo test --manifest-path openless-all/app/src-tauri/Cargo.toml sherpa --lib -- --nocapture
    • 19 passed
  • cargo test --manifest-path openless-all/app/src-tauri/Cargo.toml --lib
    • 323 passed
  • npm run build

已知非阻塞项

  • Rust 仍有若干既有 dead code / unused warning,不影响构建和测试。
  • Vite build 仍有动态/静态 import 混用和 chunk size warning,不影响产物生成。
  • 建议合并前在真实 Sherpa 模型下载完成后的 Windows 环境中再做一次人工端到端 smoke test,覆盖“下载模型 → prepare → 启用 → 录音识别 → release/delete”的完整路径。

PR Type

Enhancement, Tests


Description

  • Add sherpa-onnx Windows ASR runtime

    • Skeleton provider, catalog, release flow
  • Add model download and verification

    • Remote info, cancel, progress, cleanup
  • Wire coordinator, commands, preferences

    • Provider switching, lifecycle, hotkeys
  • Update UI, i18n, and tests

    • Local ASR pages, backend stubs

Diagram Walkthrough

flowchart LR
  UI["Settings UI / Local ASR pages"]
  CMD["Tauri commands"]
  DL["Sherpa model download manager"]
  RT["Sherpa ONNX runtime"]
  COORD["Coordinator session flow"]
  REC["Recorder / transcription"]

  UI -- "select model, download, prepare" --> CMD
  CMD -- "fetch info / start download" --> DL
  CMD -- "load / release / transcribe" --> RT
  RT -- "attach provider" --> COORD
  COORD -- "record and transcribe" --> REC
  DL -- "progress events" --> UI
  RT -- "status / catalog updates" --> UI
Loading

File Walkthrough

Relevant files
Enhancement
18 files
commands.rs
Add sherpa local ASR commands and guards                                 
+453/-24
sherpa_download.rs
Implement Sherpa model download management                             
+751/-0 
sherpa_runtime.rs
Add Sherpa runtime skeleton and lifecycle                               
+510/-0 
sherpa.rs
Define Sherpa catalog and event payloads                                 
+351/-0 
coordinator.rs
Integrate Sherpa runtime into coordinator                               
+89/-3   
dictation.rs
Route dictation flow to Sherpa provider                                   
+74/-0   
lib.rs
Register Sherpa services and commands                                       
+33/-1   
mod.rs
Export Sherpa local ASR modules                                                   
+12/-2   
combo_hotkey.rs
Update hotkey handling for settings sync                                 
+3/-0     
resources.rs
Extend coordinator resource wiring                                             
+2/-0     
qa_hotkey.rs
Align QA hotkey handling with settings                                     
+3/-0     
LocalAsr.tsx
Add local ASR Sherpa UI surface                                                   
+2896/-1136
ipc.ts
Add Sherpa IPC command bindings                                                   
+1019/-783
localAsr.ts
Extend local ASR client helpers                                                   
+491/-224
AdvancedSection.tsx
Surface Sherpa settings in advanced panel                               
+399/-219
HotkeySettingsContext.tsx
Refresh hotkey settings context wiring                                     
+212/-161
shared.tsx
Share updated local ASR settings UI                                           
+164/-56
types.ts
Add Sherpa client-side type definitions                                   
+6/-0     
Configuration changes
3 files
types.rs
Persist Sherpa model and runtime settings                               
+30/-0   
build.rs
Add Windows manifest dependency build step                             
+22/-0   
persistence.rs
Persist new Sherpa preferences fields                                       
+7/-0     
Bug fix
2 files
download.rs
Expose download helpers and partial sizes                               
+5/-2     
foundry_native.rs
Fix runtime detection string assertions                                   
+2/-2     
Documentation
6 files
windows-sherpa-onnx-asr-plan.md
Document Sherpa ASR rollout plan                                                 
+421/-0 
ja.ts
Add Japanese Sherpa local ASR copy                                             
+1126/-960
ko.ts
Add Korean Sherpa local ASR copy                                                 
+1114/-960
zh-TW.ts
Add Traditional Chinese Sherpa copy                                           
+1069/-958
zh-CN.ts
Add Simplified Chinese Sherpa copy                                             
+1059/-957
en.ts
Add English Sherpa local ASR copy                                               
+1126/-958
Tests
2 files
backend_rust.rs
Add backend test coverage for Sherpa stubs                             
+9/-0     
stylePrefs.test.ts
Expand style preference test coverage                                       
+3/-0     
Dependencies
1 files
Cargo.toml
Add Windows sherpa-onnx dependency                                             
+4/-0     
Additional files
1 files
sherpa_provider.rs +182/-0 

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 20, 2026

PR Reviewer Guide 🔍

(Review updated until commit 7072c30)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Wrong cache size

For release-archive models, this function only checks for the archive file itself. After a successful download the archive is extracted and deleted, so downloaded_bytes falls back to 0 even though the model files are already present. That makes the UI and any status logic report an empty cache for fully downloaded models.

pub fn downloaded_bytes(model_alias: &str) -> u64 {
    let Ok(dir) = sherpa::model_dir_for_alias(model_alias) else {
        return 0;
    };
    if let Some(archive) = sherpa::release_archive_for_alias(model_alias) {
        let dest = dir.join(archive.file_name);
        if let Ok(meta) = std::fs::metadata(&dest) {
            return meta.len();
        }
        return partial_actual_size(&dest.with_extension("partial"));
    }
    let Ok(files) = sherpa::download_files_for_alias(model_alias) else {
        return 0;
    };
    files
        .iter()
        .map(|(_, local_path)| {
            let dest = dir.join(local_path);
            if let Ok(meta) = std::fs::metadata(&dest) {
                meta.len()
            } else {
                partial_actual_size(&dest.with_extension("partial"))
            }
        })
        .sum()
}

@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 691068f

@weikeyi weikeyi force-pushed the feat/windows-sherpa-onnx-local-asr branch from 691068f to 55c4531 Compare May 20, 2026 14:30
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 55c4531

@H-Chris233
Copy link
Copy Markdown
Collaborator

那啥,你搞完了踢我一下
我就准备合

@weikeyi weikeyi force-pushed the feat/windows-sherpa-onnx-local-asr branch from 55c4531 to 7072c30 Compare May 21, 2026 01:49
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 7072c30

@weikeyi
Copy link
Copy Markdown
Contributor Author

weikeyi commented May 21, 2026

@H-Chris233 冲突解决完了

@H-Chris233
Copy link
Copy Markdown
Collaborator

对于 release-archive 模型,此函数只检查归档文件本身。下载成功后,归档会被解压并删除,因此尽管模型文件已经存在,downloaded_bytes 仍会回落为 0。这会导致 UI 和任何状态逻辑将已完整下载的模型报告为缓存为空。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants