找回密码
立即注册
搜索
发回帖 发新帖

6681

积分

0

好友

849

主题
发表于 昨天 23:08 | 查看: 1| 回复: 0

Voltip 是我做的一个开源语音输入工具,目标场景是替代 Typeless 的日常听写。在任意软件里按住 Ctrl+Alt+Space 说话,松开后它会去掉口头禅,并保留说错改口后的最终说法,整理好的文字直接出现在光标处。

工具支持 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 版本。




上一篇:Rust 分布式存储实战:OpenRaft + RocksDB 构建强一致 KV 库
下一篇:Rust 实现 MCP 治理控制面:Jev 判断之后如何持久治理
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-28 14:15 , Processed in 0.082241 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表