VoiceTyper
Local desktop speech-to-text - dictation without sending your voice to anyone's cloud.
source(opens in new tab)The problem
Dictation is genuinely useful and almost every implementation of it ships your voice to someone else's servers. VoiceTyper keeps the whole chain on your machine: press a hotkey (Right Alt (the most unemployed key) by default), speak, and the transcribed text lands in whatever program has focus. The core flow needs no speech cloud at all.
Architecture
VoiceTyper is an Electron app with a strict process split. The main process owns hotkeys, tray, native typing, and persistence; the React 19 renderer owns capture and UI; and the speech models run in dedicated worker threads, so a 650 MB neural network decoding audio never blocks either the interface or the event loop. Recording, live waveform, resampling, and WAV encoding happen with browser web audio - everything is normalized to 16 kHz mono PCM (uncompressed audio represented as sampled values), and the main process validates the actual WAV structure rather than trusting a header.
Two local ASR (automatic speech recognition) families are supported: Parakeet (the CPU-friendly default, int8 TDT 0.6B (a 600-million-parameter speech model using 8-bit weights) via sherpa-onnx) and Whisper (Tiny through Large v3 Turbo, with auto-detected
CUDA (NVIDIA's platform for running models on GPUs) or
Vulkan (a cross-vendor GPU compute and graphics API)
acceleration where the hardware allows). Because Parakeet does not report
language reliably, an optional second local model does language identification
on the same audio - and when it is unsure, the app says unknown instead of
guessing from the transcript.
Getting text into the focused program is its own engineering problem, so there are three insertion modes: clipboard (save, paste, restore - including HTML and RTF contents), direct synthetic typing, and native accessibility APIs on Windows and macOS. Daily-use controls stay local: per-language hotkeys, a 200-entry history, configurable tray behavior, and audio file import. A first-run assistant downloads only the models you pick - HTTPS-only, domain-allowlisted after redirects, and SHA-256 verified per file. Settings and history are written atomically (replaced as complete files or not at all), so a crash cannot leave truncated state behind.
Boundaries
The transcription path is local by design; audio is processed on-device and the result is pasted, not uploaded. That is a statement about the dictation pipeline, not a blanket claim that the app never sends a byte - model downloads necessarily come from the network, which is exactly why they are pinned and verified. The Electron shell is locked down accordingly: sandboxed renderer, context isolation, no Node in the UI, microphone permission granted only to the app's own origin, and navigation anywhere else blocked.
VoiceTyper types where you point it. It is not a voice assistant, does not interpret commands, and does not summarize what you said. It converts speech to text and gets out of the way (rare, for software).