VoiceTray
Offline-first
System tray
Hotkeys
Snippets
Notes
Optional local LLM

Offline dictation that behaves like a trustworthy typing assistant.

VoiceTray lives in your tray. Press a hotkey, speak, and it types into whatever app you’re using. It cleans transcripts conservatively with deterministic rules, then optionally applies an on-device LLM cleanup step with strict safety checks and fallback.

What you get

Tray-first workflow

Runs in the system tray. One hotkey to dictate into the active app, another to save notes to files.

Offline speech-to-text

Uses faster-whisper locally for dictation without sending audio anywhere. There is no cloud fallback during dictation.

Snippet expansion

Expand short triggers into full text using snippets.txt after cleanup.

Local history

Keep raw and cleaned dictations in local SQLite history for quick capture, search, copy, and re-insert.

Personal glossary

Protect names and technical terms, plus apply custom replacements using glossary.json.

Profiles & modes

Choose cleanup mode (raw/balanced/aggressive), formatting profile (email/chat/notes/code), and per-app overrides.

Hybrid dictation intelligence
Stage A (rules): whitespace, punctuation spacing, conservative capitalization, repetition cleanup, optional list formatting, self-correction handling.
Stage B (local LLM, optional): tiny grammar/readability improvements under a strict JSON-only prompt.
Stage C (validation): reject risky edits (numbers/protected tokens/too-different) and fall back to the rule output.

Trust over rewriting

Accuracy is prioritized over aggressive paraphrasing. If the model output looks unsafe, it is rejected automatically.

Setup
Install dependencies:
pip install -r requirements.txt
Run:
run_app.bat
pythonw -m voicetray
Use: F9 to dictate into the active app, F10 to capture to History without inserting.
Configure: open the tray menu → Settings for hotkeys, cleanup, dictionaries, snippets, and models.
Optional local LLM cleanup: use SettingsModels to choose a GGUF model path.

Local-first by default

VoiceTray is usable offline. Optional local LLM cleanup runs on-device and remains guarded by validation + fallback.