跨平台语音输入工具(macOS / Windows)。按下快捷键,说话,松开——转录文字自动出现在光标位置。
灵感来自 Wispr Flow,用 Rust + Tauri 从零构建。
- 全局快捷键触发录音(macOS:
Option+Space或Fn长按;Windows:Ctrl+Alt+Space) - 两种触发模式:按住录音(HoldKey)/ 按一下开,再按关(ToggleKey)
- ASR 三路:OpenAI
gpt-4o-transcribe/ VoxNexus REST + WebSocket / 本地 Whisper.cpp(离线) - Language Profile 系统:每个 Profile 独立绑定语言、模型、prompt,热键切换
- 转录完成后通过剪贴板模拟粘贴,文字注入当前焦点窗口
- 透明状态 Overlay:始终置顶、点击穿透,展示录音 / 处理 / 注入 / 完成四态动画
- 权限检测(Input Monitoring / Accessibility),应用启动时自动检查并可一键跳转系统设置
- 配置持久化到系统标准目录(TOML)
| 工具 | 说明 |
|---|---|
| Rust stable | rustup update stable |
| Tauri CLI v2 | cargo install tauri-cli --version "^2" |
| Xcode CLT(macOS) | xcode-select --install |
| MSVC Build Tools(Windows) | 本地 ASR 编译必须 |
macOS 无需 Node.js,前端为纯 HTML + WebKit。
git clone <repo>
cd vox-flow
cargo tauri dev --config src-tauri/tauri.dev.conf.json窗口自动弹出。Rust 日志在终端,前端 console 在 WebKit Inspector(右键 → 检查元素)。
开发模式使用独立的 bundle id(
com.voxflow.dev),避免 macOS 麦克风 / 辅助功能 / 输入监控权限绑定到 dev 路径后影响安装包。
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)"
./scripts/build-macos-release.sh产物在 src-tauri/target/release/bundle/:
- macOS:
Vox Flow.app+.dmg - Windows:
.msi+ NSIS 安装包
若你还没有签名证书,先检查:
security find-identity -v -p codesigning看到 0 valid identities found 表示还不能做稳定签名发布,需要先在钥匙串安装可用的 Developer ID Application 证书。
为避免 macOS 在每次升级后重复要求麦克风 / 辅助功能 / 输入监控授权,请保持以下三点稳定:
- 固定
bundle identifier(当前为com.voxflow.desktop) - 固定签名证书(每次发布都使用同一个
APPLE_SIGNING_IDENTITY) - 固定安装路径(始终覆盖
/Applications/Vox Flow.app)
tauri dev使用独立 id(com.voxflow.dev),权限与生产包天然隔离,属于预期行为。
配置文件路径(自动创建):
- macOS:
~/Library/Application Support/VoxFlow/config.toml - Windows:
%APPDATA%\VoxFlow\config\config.toml
示例配置:
active_profile_id = "auto"
[profiles.auto]
display_name = "Auto Detect"
[profiles.auto.backend]
type = "OpenAi"
model = "gpt-4o-transcribe"
[profiles.zh]
display_name = "中文"
language_hint = "zh"
prompt = "输出简体中文,保留中英文混排。"
[profiles.zh.backend]
type = "OpenAi"
model = "gpt-4o-mini-transcribe"
[profiles.vn]
display_name = "VoxNexus 超清"
[profiles.vn.backend]
type = "VoxNexus"
model_id = "vn-stt-ultra"
transport = "web_socket_streaming" # 或 "rest_batch"
enable_timestamps = false
enable_speaker_diarization = false
[profiles.en-local]
display_name = "English (Offline)"
language_hint = "en"
[profiles.en-local.backend]
type = "Local"
model_path = "/path/to/ggml-base.en.bin"
[app]
activation_mode = "ToggleKey" # 或 "HoldKey"
hotkey = "Option+Space" # macOS 也可设为 "Fn"(需 Input Monitoring 权限)
global_api_key = "sk-..." # OpenAI API key(Phase 9 前明文存储)注意:
ProfileBackendConfig的type字段已从旧版"Cloud"改为"OpenAi",升级时需手动更新配置文件。
VoxNexus profile 可选择两种请求方式:
| transport | 说明 |
|---|---|
rest_batch |
停止录音后上传完整 WAV,返回最终文本 |
web_socket_streaming |
连接 wss://api.voxnexus.ai/v1/stt/realtime?token=...,发送 PCM16 audio chunks,接收 ready / partial / final / error |
当前版本已经在 vf-asr 层实现 VoxNexus StreamingTranscriber,包括 partial/final 事件解析。应用主流程仍是“松开热键后转写并注入”;真正边录边显示 partial 的 UI 流式体验会在录音管线改为边采集边推送后接上。
vox-flow/
├── crates/
│ ├── vf-audio/ # 麦克风采集 + 重采样到 16kHz mono f32
│ ├── vf-asr/ # AsrBackend trait,OpenAI + VoxNexus + Local(Whisper.cpp)
│ ├── vf-inject/ # 剪贴板注入 + enigo 模拟粘贴
│ ├── vf-config/ # AppConfig + LanguageProfile + TOML 持久化
│ └── vf-core/ # VoxEngine 状态机,编排录音→ASR→注入全流程
└── src-tauri/ # Tauri shell,前端 UI,overlay,全局快捷键,权限检测
所有 vf-* crate 不依赖 Tauri,可单独 cargo test。
# 编译检查
cargo build --workspace
# 运行测试(CI 可跑,不需要麦克风)
cargo test --workspace
# 需要麦克风的集成测试(本地手动)
cargo test --workspace -- --ignored日志级别通过环境变量控制:
RUST_LOG=debug cargo tauri dev| Phase | 状态 | 内容 |
|---|---|---|
| 0 | ✅ | Workspace + Tauri + config 读写 |
| 1 | ✅ | 手动录音 → 16kHz mono f32 → debug wav |
| 2 | ✅ | Cloud ASR(OpenAI Transcription API) |
| 3 | ✅ | 剪贴板注入,文字进光标位置 |
| 4 | ✅ | 状态机完善 + 错误恢复 + mock 测试 |
| 5 | ✅ | 全局快捷键(HoldKey + ToggleKey)+ macOS Fn 专项监听 + 状态 Overlay + 权限检测 + VoxNexus REST/WebSocket ASR |
| 6 | ⬜ | VAD 自动停止 |
| 7 | ⬜ | Local Whisper.cpp + Profile 切换 UI |
| 8 | ⬜ | 设置 UI + 系统托盘 |
| 9 | ⬜ | API Key → Keychain + 签名 + 公证 + CI |
- 首次使用需授权麦克风(系统设置 → 隐私 → 麦克风)
- 生产包 bundle id 为
com.voxflow.desktop;开发调试使用com.voxflow.dev(见 dev 配置) - 文字注入需授权 Accessibility(系统设置 → 隐私 → 辅助功能)
- 使用
Fn长按热键还需授权 Input Monitoring(系统设置 → 隐私 → 输入监控) - 标准快捷键使用
Option+Space;若设为"Fn",则通过CGEventTap监听,与其他快捷键框架互不干扰
- 麦克风权限需在系统设置手动开启(无法通过代码请求)
- 本地 ASR 编译需要 MSVC toolchain(
x86_64-pc-windows-msvc) - 快捷键默认
Ctrl+Alt+Space(避开 CJK 输入法占用的Alt+Space) - 管理员权限窗口和部分反作弊游戏可能阻止 enigo 模拟按键(已知限制)
MIT