A lightweight desktop app for global voice-to-text. Press Alt+Space anywhere to start recording, press again to transcribe and paste the result into the active application.
Built with Tauri v2 (Rust backend, vanilla JS frontend).
- Global hotkey (Alt+Space) works from any application
- Two STT engines:
- Whisper (OpenAI) via whisper.cpp — models from 40 MB to 500 MB
- Parakeet TDT v3 (NVIDIA) via ONNX Runtime — ~670 MB, 25 languages, auto-detection
- French & English support (and more with Parakeet)
- Auto-paste: transcribed text is automatically pasted via clipboard + keyboard simulation
- Minimal UI: frameless overlay during recording, settings accessible from the tray icon
- Auto-opens settings on first launch if no model is downloaded
- Rust (1.70+)
- CMake + C/C++ compiler
- macOS 11+, Windows 10+, or Linux (X11 recommended)
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Tauri CLI
cargo install tauri-cli --version "^2"MacOS: install Homebrew (https://brew.sh/) then CMake
# Optional if you already have homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmakesudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
libasound2-dev \
libxdo-dev \
cmake \
build-essentialsudo dnf install -y \
gtk3-devel \
webkit2gtk4.1-devel \
libayatana-appindicator-gtk3 \
librsvg2-devel \
openssl-devel \
alsa-lib-devel \
libxdo-devel \
cmake \
gcc-c++# Development (hot reload frontend, debug backend)
cargo tauri dev
# Production build (creates .app + .dmg on macOS, .msi on Windows)
cargo tauri build
# Debug build (faster, no bundling optimization)
cargo tauri build --debug
# Rust backend only (no frontend bundling)
cd src-tauri && cargo buildFirst build takes ~5 minutes due to whisper.cpp compilation via CMake.
macOS note: CMAKE_OSX_DEPLOYMENT_TARGET=11.0 is required for whisper.cpp's std::filesystem usage. This is set automatically via src-tauri/.cargo/config.toml.
- Launch the app — if no model is downloaded, the Settings window opens automatically
- Choose an STT engine (Whisper or Parakeet) and download the model
- Save settings and close the window
- Record — press
Alt+Spaceto start,Alt+Spaceagain to stop - Result — transcribed text is automatically pasted into the active application
- Access settings anytime via the tray icon (left or right click)
| Model | Size | Speed | Quality |
|---|---|---|---|
| tiny | ~40 MB | Very fast | Basic |
| base | ~60 MB | Fast | Recommended |
| small | ~200 MB | Medium | Good |
| medium | ~500 MB | Slow | Excellent |
| Model | Size | Speed | Quality |
|---|---|---|---|
| int8 quantized | ~670 MB | Fast | Excellent (WER 7.7% FR) |
Parakeet supports 25 European languages with automatic language detection. Models are downloaded from HuggingFace and stored in ~/lightwhisper/models/.
Light Whisper requests both permissions on first launch.
- Microphone: required for audio capture. Go to System Settings > Privacy & Security > Microphone and enable Light Whisper. Without this permission, macOS silently feeds empty audio to the app — recording appears to work but the waveform stays flat and no transcription is produced.
- Accessibility: required for auto-paste (keyboard simulation). Go to System Settings > Privacy & Security > Accessibility and enable Light Whisper. The app will prompt on first launch; if denied, transcribed text cannot be pasted automatically.
light-whisper/
├── src/ # Frontend (vanilla HTML/JS/CSS)
│ ├── index.html # Recorder overlay (280x80 frameless window)
│ ├── settings.html # Settings (engine, model, device, language)
│ └── settings.js / .css
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── lib.rs # Tauri setup, commands, tray, shortcut handler
│ │ ├── audio.rs # Audio capture (cpal) on dedicated thread
│ │ ├── stt.rs # STT engine dispatch (Whisper + Parakeet)
│ │ ├── paste.rs # Clipboard + keyboard simulation (enigo)
│ │ ├── config.rs # JSON config I/O, directory paths
│ │ └── model_manager.rs # Model download with streaming progress
│ └── Cargo.toml
└── README.md
~/lightwhisper/
├── config.json # {audio_device, model_size, language, engine}
├── models/
│ ├── ggml-{size}.bin # Whisper models
│ └── parakeet-tdt/ # Parakeet ONNX models
│ ├── encoder-model.onnx
│ ├── decoder_joint-model.onnx
│ └── vocab.txt
└── temp/ # Temporary WAV files
Windows uses %TEMP%\lightwhisper\ for temp files.
MIT
