< 返回版块

sunerpy 发表于 2026-10-26 15:54

Tags:rust,tauri,语音识别,开源

Voltip 是我做的一个开源语音输入工具,能替代 Typeless 的日常听写:在任意软件里按住 Ctrl+Alt+Space 说话,松开以后,口头禅去掉、说错又改口的地方只留最后的说法,整理好的文字直接出现在光标处。

Voltip 首页:快捷键、麦克风、正在使用的语音模型和 AI 润色模型

支持 Windows、macOS、Linux 和 Android,AGPL-3.0。识别可以纯本地离线跑,也能接 OpenAI、Groq、硅基流动、阿里云百炼或任意 OpenAI 兼容接口;Android 应用可以当电脑的麦克风和键盘。原生能力全在 Rust 里,这里记一下用到的 crate 和几处取舍,供做类似东西的朋友参考。

结构

一个 Rust workspace,加两个 Tauri 2 应用(桌面、Android),共用一套 React 界面。界面只显示状态、发命令,全局快捷键、音频、识别、文字插入、剪贴板、加密连接都在 Rust 里。依赖方向只允许向下:apps → core → {pairing, transport, identity} → {crypto, protocol};中继 voltip-relay 只依赖 protocol,拿不到也不需要会话密钥。

Rust 到 webview 的通道按语义分:离散的状态变化走事件总线并折叠进一个 UiState;电平、进度这类连续流走 tauri::ipc::Channel,跟着发起它的 command 结束;事件总线不承载 30 Hz 以上的数据。

本地识别

  • transcribe-cpp:跑 Qwen3-ASR 的 GGUF 模型,ggml 源码用 cmake 构建、静态链接。macOS 开 metal feature,Windows / Linux 的发布包开 vulkan feature(测试和 lint 的 gate 不开,因为要装 Vulkan SDK)。Windows 包在 Linux 上用 cargo-xwin 交叉编译到 x86_64-pc-windows-msvc。
  • sherpa-onnx:跑 SenseVoice、Paraformer 和实时识别模型,用 shared feature 动态链接,不用 static:那组静态库会把 espeak-ng(GPL-3.0)链进来。
  • rubato:整段重采样到 16 kHz 再交给 transcribe.cpp(它只收 16 kHz)。
  • 模型下载断点续传,每个文件用之前校验 SHA-256。

音频

  • cpal:麦克风枚举和输入(WASAPI / CoreAudio / ALSA / Android AAudio),电平计算是纯 DSP,可以脱离硬件测。
  • rtrb:录音时音频回调往无锁的单生产者单消费者环形缓冲里推 16 kHz 单声道帧,解码线程取出;音频线程上不加锁、不分配内存。
  • sonora:WebRTC AEC3 的纯 Rust 移植,用在「麦克风 + 电脑声音」混合录音时消除扬声器回声。选它而不是 aec3,是按实测的消除效果和依赖比较的结果;纯 Rust 也省掉了各平台的 C 工具链。
  • opus-rs:libopus 1.6 的纯 Rust 移植,手机当麦克风时先压缩音频再传;Android 和 Windows 交叉编译都不用 C 工具链。

文字处理

  • aho-corasick:个人词典(每个词条一个正确写法,加最多 10 个常被听错的写法)和字面替换规则的多模式匹配,本来就因为 regex 在依赖图里。
  • ferrous-opencc:简繁转换,字典在构建时编译进二进制,约 2.3 MB,日文表不带。
  • enigo + arboard:插入文字的办法是把文字放进剪贴板、模拟一次粘贴、再把剪贴板原来的内容放回去。目标窗口以管理员身份运行等粘贴不进去的情况,文字留在剪贴板里,悬浮窗说明原因,不会丢。

手机和电脑之间

  • snow:Noise_XX_25519_ChaChaPoly_SHA256。配对时两端显示由握手哈希推出的安全码,人工核对一致才信任;已配对设备重逢时同样用 XX。
  • 配对和连接的状态机写成 sans-IO:step(event) -> Vec<Action>,网络和时间由调用方注入,单元测试里能把超时、重放、频道被占这些路径走一遍。
  • 设备之间只经中继(axum 的 WebSocket),中继只转发密文;协议帧用 ciborium(CBOR)编码,中继的控制帧是 JSON,方便排障。

其他

  • axum:除了中继,还有 OpenAI 兼容的本机语音服务 /v1/audio/transcriptions(无头的 voltip-server 在没有桌面的 Linux 上跑同一套识别、词典和预设)。
  • rmcp:本机 MCP 服务,让 Claude Code、Codex 读替换汇总、帮你整理词典;它新建的规则要用户确认才生效。
  • keyring:服务商密钥和设备私钥存进系统钥匙串;rusqlite(bundled)存历史记录。
  • 依赖全部用 = 锁定确切版本;Rust 行覆盖率门是 90%(cargo llvm-cov)。

不足也先说

  • 还没有 iOS 版;纯 Wayland 会话没有全局快捷键,要在系统设置里自己绑;
  • Windows 安装包还没做代码签名,第一次运行 SmartScreen 会提示;
  • 每次都要按键说话,没有语音唤醒。

开源免费,官网:https://voltip.firlab.app/zh/ ,源码:https://github.com/sunerpy/voltip 。目前支持 Windows/Linux/macOS/Android 版本,欢迎使用,如果觉得有用可以动动小手给个 star,也欢迎来提 issue 和 PR。


Ext Link: https://voltip.firlab.app/zh/

评论区

写评论

还没有评论

1 共 0 条评论, 1 页