Offline voice input app for macOS on Apple Silicon — powered by MLX-Audio (Whisper/Qwen3-ASR)
See the codeOffline voice input desktop application optimized for Apple Silicon
All ASR models run in-process in Rust — there is no Python dependency at runtime.
Runs on whisper.cpp (Metal) via whisper-rs.
whisper-large-v3-turbo — balanced performance (default)whisper-large-v3 — highest accuracywhisper-medium / small / base / tiny — lightweight modelsNVIDIA FastConformer + TDT transducer, ported to Apple MLX via mlx-rs. Japanese-specialized (CER 6.4% on JSUT), ~160 ms inference, non-gated.
parakeet-tdt_ctc-0.6b-ja — 0.6BCohere Labs 2B, ported to Apple MLX via mlx-rs. 14 languages including JA/ZH/KO; strong on clean read-speech. Requires HuggingFace authentication and license acceptance — see Gated Model Access.
cohere-transcribe-03-2026 — 2B (BF16, ~4GB download)Note: Qwen3-ASR is not currently available — it has not yet been ported to the in-process Rust engine and is intentionally omitted to avoid a non-functional option.
Download the latest release from the Releases page:
.dmg fileThe app is fully self-contained — no Python or other runtime installation required.
Cmd+Shift+Space to start recordingEcho also supports continuous listening mode, which runs in the background and automatically detects speech:
Transcription history is stored in a local SQLite database and can be searched via the History panel.
Customize Echo via the Settings panel:
Some models (currently Cohere Transcribe) require HuggingFace authentication and license acceptance. Enable them via Settings → Gated Models (Advanced):
huggingface.co/CohereLabs/cohere-transcribe-03-2026).huggingface.co/settings/tokens.The token is stored locally in settings.json and used only to download the gated checkpoint. When gated access is disabled, gated models are hidden from the picker.
xcodebuild -downloadComponent MetalToolchain # ~700 MB, one-time
Required because both mlx-rs (Apple MLX + Metal kernels) and whisper-rs (whisper.cpp + ggml + Metal) compile native code from source.No Python is required — the ASR and post-processing engines are compiled into the app binary via the rust-asr crate.
# Install Node.js dependencies
npm install
# Build the Rust backend + in-process ASR engines (handled by Tauri)
cd src-tauri && cargo build
npm run tauri:dev
# Build frontend only
npm run build
# Build full Tauri application
npm run tauri:build
# Signed local build (preserves Accessibility permissions across updates)
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)"
npm run tauri:build:signed
The in-process engines can be exercised directly via the rust-asr crate:
cd rust-asr && cargo build --release
./target/release/rust-asr run <audio_16k.wav> <lang> # Whisper
./target/release/rust-asr pk-run <audio.wav> # Parakeet-JA
./target/release/rust-asr pp "<text>" [qwen3-model] # Post-processing
whisper-rs (whisper.cpp/Metal); Parakeet-JA + Cohere via mlx-rs (Apple MLX)mlx-rs, in-processrusqlite)Echo runs entirely in a single process — speech recognition and post-processing are native Rust, with no Python sidecar.
rust-asr): Whisper (whisper.cpp/Metal), Parakeet-JA and Cohere (Apple MLX). ASREngine in transcription.rs owns the loaded engines and dispatches by the active model id.Both Metal backends (whisper.cpp and MLX) coexist in-process and are serialized
by the ASREngine mutex. Models are lazily loaded — they download on first use
and remain cached locally; the post-processor LLM auto-loads on startup if enabled.
Contributions are welcome! Please feel free to submit issues or pull requests.
MIT License - see LICENSE for details
72 commits
Rust
56.4%
TypeScript
33.6%
Python
4.8%
CSS
1.8%
Shell
1.6%
JavaScript
1.2%
Offline voice input app for macOS on Apple Silicon — powered by MLX-Audio (Whisper/Qwen3-ASR)
See the codeOffline voice input desktop application optimized for Apple Silicon
All ASR models run in-process in Rust — there is no Python dependency at runtime.
Runs on whisper.cpp (Metal) via whisper-rs.
whisper-large-v3-turbo — balanced performance (default)whisper-large-v3 — highest accuracywhisper-medium / small / base / tiny — lightweight modelsNVIDIA FastConformer + TDT transducer, ported to Apple MLX via mlx-rs. Japanese-specialized (CER 6.4% on JSUT), ~160 ms inference, non-gated.
parakeet-tdt_ctc-0.6b-ja — 0.6BCohere Labs 2B, ported to Apple MLX via mlx-rs. 14 languages including JA/ZH/KO; strong on clean read-speech. Requires HuggingFace authentication and license acceptance — see Gated Model Access.
cohere-transcribe-03-2026 — 2B (BF16, ~4GB download)Note: Qwen3-ASR is not currently available — it has not yet been ported to the in-process Rust engine and is intentionally omitted to avoid a non-functional option.
Download the latest release from the Releases page:
.dmg fileThe app is fully self-contained — no Python or other runtime installation required.
Cmd+Shift+Space to start recordingEcho also supports continuous listening mode, which runs in the background and automatically detects speech:
Transcription history is stored in a local SQLite database and can be searched via the History panel.
Customize Echo via the Settings panel:
Some models (currently Cohere Transcribe) require HuggingFace authentication and license acceptance. Enable them via Settings → Gated Models (Advanced):
huggingface.co/CohereLabs/cohere-transcribe-03-2026).huggingface.co/settings/tokens.The token is stored locally in settings.json and used only to download the gated checkpoint. When gated access is disabled, gated models are hidden from the picker.
xcodebuild -downloadComponent MetalToolchain # ~700 MB, one-time
Required because both mlx-rs (Apple MLX + Metal kernels) and whisper-rs (whisper.cpp + ggml + Metal) compile native code from source.No Python is required — the ASR and post-processing engines are compiled into the app binary via the rust-asr crate.
# Install Node.js dependencies
npm install
# Build the Rust backend + in-process ASR engines (handled by Tauri)
cd src-tauri && cargo build
npm run tauri:dev
# Build frontend only
npm run build
# Build full Tauri application
npm run tauri:build
# Signed local build (preserves Accessibility permissions across updates)
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)"
npm run tauri:build:signed
The in-process engines can be exercised directly via the rust-asr crate:
cd rust-asr && cargo build --release
./target/release/rust-asr run <audio_16k.wav> <lang> # Whisper
./target/release/rust-asr pk-run <audio.wav> # Parakeet-JA
./target/release/rust-asr pp "<text>" [qwen3-model] # Post-processing
whisper-rs (whisper.cpp/Metal); Parakeet-JA + Cohere via mlx-rs (Apple MLX)mlx-rs, in-processrusqlite)Echo runs entirely in a single process — speech recognition and post-processing are native Rust, with no Python sidecar.
rust-asr): Whisper (whisper.cpp/Metal), Parakeet-JA and Cohere (Apple MLX). ASREngine in transcription.rs owns the loaded engines and dispatches by the active model id.Both Metal backends (whisper.cpp and MLX) coexist in-process and are serialized
by the ASREngine mutex. Models are lazily loaded — they download on first use
and remain cached locally; the post-processor LLM auto-loads on startup if enabled.
Contributions are welcome! Please feel free to submit issues or pull requests.
MIT License - see LICENSE for details
72 commits
Rust
56.4%
TypeScript
33.6%
Python
4.8%
CSS
1.8%
Shell
1.6%
JavaScript
1.2%