Voxtray is a real-time transcription utility (CLI + system tray) with interchangeable local and cloud providers.
It is designed for daily Ubuntu/WSL2 usage with quick toggle activation, automatic clipboard copy, and recent-history tracking. You can run it fully locally with Voxtral/vLLM, or switch to cloud transcription profiles for Mistral Realtime or OpenAI Realtime when you prefer managed models.
Spanish documentation: LEEME.md.
start/stop/togglerecording from terminal.- Global GNOME shortcut (
Super+F9by default). - Automatic copy of final transcript to clipboard.
- Persistent history (last 5 transcripts by default).
- Tray mode (
tray) with quick actions and engine status. - Audio file transcription (
transcribe-file). - Provider profiles for local Voxtral/vLLM or cloud models through Mistral Realtime and OpenAI Realtime.
- Windows + WSL2 distribution flow (included scripts).
sudo apt-get update
sudo apt-get install -y ffmpeg xclip libportaudio2 libxcb-cursor0python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e '.[dev]'If you want Qt tray mode:
pip install -e '.[ui]'Install vLLM (NVIDIA GPU):
pip install -U vllm --extra-index-url https://download.pytorch.org/whl/cu129Hugging Face access (optional):
- For public models, a token is usually not required.
- You only need a token if the model is gated/restricted or private.
export HF_TOKEN=...Cloud providers do not need vLLM. Install the optional Mistral SDK only if you use the Mistral Realtime profile:
pip install -e '.[cloud]'
export MISTRAL_API_KEY=...
export OPENAI_API_KEY=...Initialize config:
voxtray initCheck status and logs:
voxtray status
voxtray logs --target all --lines 200Record from terminal:
voxtray record --start
voxtray record --stop
# recommended for global shortcut usage
voxtray record --toggleEngine/model controls:
voxtray warm on
voxtray warm off
voxtray warm status
voxtray model load
voxtray model unload
voxtray model statusFor cloud profiles, warm and model commands return an explicit no-op message
because no local engine is used.
History:
voxtray history list
voxtray history copy 1Transcribe audio file:
voxtray transcribe-file /path/audio.m4a --copyAudit saved recording quality:
voxtray recordings audit --limit 200
# CI/local gate when you expect a clean corpus
voxtray recordings audit --limit 200 --fail-on-issuesMain file:
~/.config/voxtray/config.toml
Included memory profiles:
profiles/voxtray-balanced.tomlprofiles/voxtray-vram-saver.tomlprofiles/voxtray-latency.tomlprofiles/voxtray-online-mistral.tomlprofiles/voxtray-online-openai.toml
Apply profile:
scripts/apply_profile.sh local-balancedAvailable values:
local-balanced(balancedlegacy alias)local-vram-saver(vram-saverlegacy alias)local-latency(latencylegacy alias)online-mistralonline-openai
Provider config is stored without secrets:
[transcription]
provider = "openai_realtime"
[openai_realtime]
api_key_env = "OPENAI_API_KEY"
model = "gpt-realtime-whisper"
fallback_model = "whisper-1"
sample_rate = 24000
turn_detection = "manual"
delay = "high"
language = "es"
prompt = "Transcribe literally Spanish voice commands. Preserve project names mentioned by the speaker."The CLI/tray resolves the configured variable from the process environment, and
also from the repo-local .env file when present. This keeps GNOME autostart
working without storing the actual API key in config.toml.
The OpenAI profile uses gpt-realtime-whisper for native streaming
transcription with delay = "high" for better accuracy, and whisper-1 for the
batch fallback so recovery stays in the Whisper model family instead of jumping
to a GPT-4o transcription model. You can still set openai_realtime.model and
fallback_model to another supported transcription model without storing any
key in the config file. For recordings where Realtime returns empty or clearly
truncated text, Voxtray automatically retries the captured WAV with
fallback_model before saving history or copying to the clipboard.
voxtray status reports provider, provider_ready, local_engine_ready,
model_id, warm_supported, and api_key_env_present.
Install desktop entry + autostart + default shortcut (Super+F9):
scripts/install_ubuntu_integration.shInstall only shortcut:
voxtray install-shortcut --binding '<Super>F9'Build bundle to share:
scripts/build_wsl2_bundle.shInitial install on Windows (PowerShell), inside the extracted folder:
powershell -ExecutionPolicy Bypass -File .\scripts\install_windows_shortcuts.ps1 -Distro UbuntuWhat this installer does:
- Installs dependencies inside WSL2 (Ubuntu).
- Creates the Python environment and Voxtray in
~/.voxtray. - Generates Windows shortcuts to run Voxtray without opening a Linux terminal.
Daily activation and usage on Windows:
- Use
Voxtray Toggleshortcut (desktop or start menu) to start/stop recording. - Use
Voxtray Warm On/Offto keep or release the engine in memory. - Use
Voxtray Statusfor quick status checks. - Use
Voxtray Logsfor diagnostics.
Global shortcut on Windows (optional):
- Right-click
Voxtray Toggleand openProperties. - In the
Shortcuttab, focusShortcut key. - Press your desired key combination (recommended:
Ctrl + Alt + F9). - Click
ApplyandOK.
Notes:
- The shortcut also exists in
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Voxtray WSL. - If you choose a simple key, Windows typically converts it to
Ctrl + Alt + <key>. - Avoid combinations already used by other apps or the OS.
Quick check from PowerShell:
wsl -d Ubuntu -- bash -lc "~/.voxtray/.venv/bin/voxtray status"
wsl -d Ubuntu -- bash -lc "~/.voxtray/.venv/bin/voxtray warm on"Run tests:
pytestProject structure:
src/voxtray/: main implementation (CLI, controller, realtime, tray).tests/: unit tests.scripts/: Ubuntu/WSL2 integration and packaging utilities.profiles/: performance/memory configuration templates.
Apache-2.0. See LICENSE.