The best open local voice dictation: hold a key, speak, clean text appears in any app. Runs fully on your machine.
Rust
0
157 commits
updated Oct 16, 2026
Hold a key, speak, and clean text appears in the app you are typing in.
Voice dictation that runs entirely on your own computer.
Download for Windows · Design · Eval results · Models · Datasets
Hold Right Ctrl, talk the way you talk, let go. "Hey Sarah, I can take three days off starting the fifteenth, no wait, fourteenth" becomes Hey Sarah, I can take three days off starting the 14th. in your email, chat, editor or terminal, about a quarter of a second after you release the key. Nothing you say leaves the machine.
On the development machine (RTX 3090 Ti), in the app itself. Every figure is from docs/eval-results.md, where the method and the raw numbers live.
| Key up to text in the app | 231-260 ms (speech 48-71 ms, cleanup 131-158 ms, paste 47-61 ms) |
| Launch to ready | 3.5-3.8 s warm, 5.6-6.0 s right after a reboot |
| Ready to send as typed, realistic dictation (Quality) | 89.3%, 82.3% with voices the model never heard |
| Dictionary terms spelled right | 97.8% |
| GPU memory | Quality 4.8 GB, Light 3.2 GB |
"Ready to send" is the share of dictations a careful writer would send exactly as typed, judged dictation by dictation against the intended text with a rubric checked against human review.
Download Utter_<version>_x64-setup.exe from the
latest release and run it. It installs
for your user only. On first start Utter checks your computer, recommends a model for your
graphics card, tests your microphone, downloads what it runs on, and ends with a test
dictation.
Needs: Windows 10 or 11 (64-bit), an NVIDIA graphics card with 4 GB of memory (6 GB for Quality) and driver 580 or newer, and about 10 GB of disk. macOS and Linux are planned.
| Model | What it is | GPU memory |
|---|---|---|
| Quality | Gemma 4 E4B, fine-tuned for dictation cleanup | 4.8 GB |
| Light | Gemma 4 E2B, fine-tuned the same way | 3.2 GB |
Both share the speech model: Parakeet (the parakeet-ultra weights) in Utter's own ONNX runtime.
Right Ctrl down Right Ctrl up
│ │
▼ ▼
mic (already open, 300 ms pre-roll) ──► voice detection cuts at pauses ──► last segment
│ │
▼ ▼
Parakeet on the GPU, segment by segment ──► full transcript
│ │
▼ ▼
the Bar shows the words live cleanup model (llama.cpp)
│
▼
paste into the window that had focus, clipboard restored
Latency is the product. Every stage of every dictation is traced. Nothing is called faster or slower without a measurement, and a change that costs latency for a small gain in quality is not made.
Evals decide, not impressions. Models are chosen by measurement on our own bench, never by reputation. The cleanup model is judged on dictation built from real written text: everyday messages, emails, notes and AI prompts, Stack Exchange answers, Wikipedia, arXiv abstracts and chat logs, spoken in seven ways (plain, with fillers, self-corrected, as commands, with far-back edits, with spoken punctuation, in broken grammar), voiced by text-to-speech, and recognized by the same Parakeet the app runs. The answer key is known by construction. Every change to a model, prompt or setting is run against it and logged in docs/eval-results.md, regressions included.
Specs before code. Every surface (the Bar, first run, Home, History, insertion) has a spec with its layout, states, motion, copy, keyboard behavior and acceptance checks. It is done when every check passes on the real machine.
Decisions are written down. DESIGN.md is the source of truth for scope and architecture, and its decisions log records each choice with the measurement behind it.
Done means done. A feature ships when it meets its latency budget, its eval numbers and its UX checks, not when it first works.
Open data. The training and test data for the cleanup models is published:
| Dataset | What is in it |
|---|---|
| dictation-to-text | 89k pairs of what the recognizer heard and the text that was meant, 80k train / 10k test, balanced across sources, domains and kinds |
| dictation-speech | The spoken audio behind them (16 kHz FLAC), plus the eval sets, with voices the training data never uses |
Both carry only openly licensed text (CC0, CC-BY-SA, public domain), with the source and license on every row.
crates/
utter-core data folder, logs, tracing
utter-runtime pinned components: download, verify, install, repair
utter-audio microphone capture, ring buffer, resampling, levels
utter-asr Parakeet on onnxruntime, Silero voice detection, segmenting
utter-llm the llama.cpp server, the cleanup prompt and its guards
utter-platform everything OS-specific, behind traits: hotkey, insertion, focus, caret
utter-pipeline the dictation loop, settings, history
utter-cli benches and tools: transcribe, clean, dictate, e2e-bench, llm-bench
app/ Tauri 2 shell (src-tauri/) and the Svelte 5 windows (src/)
tools/ Python, never shipped: eval harness, datasets, training, benchmarks
docs/ UX specs, eval results, research notes, local setup
Rust (see rust-version in Cargo.toml), Node, and an NVIDIA GPU. From the repository root:
cargo run --release -p utter-cli -- setup
That installs the runtime components and models into the development data folder. Then, from
app/:
npx tauri dev
docs/local-setup.md has the details: where data lives, the Python tools environment (uv), and every bench and eval command.
Windows, English. Next: context from the text around the cursor, styles per app, Command Mode, then Linux (GNOME) and macOS. Vietnamese, with switching between the two mid-sentence, is planned.
Copyright (C) 2026 Tai Duc Nguyen.
Utter's code is licensed under the GNU Affero General Public License v3.0: you may use, study, change and share it, and if you distribute a modified version or run it as a service, you must publish its source under the same license.
The models and datasets carry their own licenses, stated on their pages: the speech model's weights are CC-BY-4.0, and the datasets are CC-BY-SA with the source and license of every row.
The best open local voice dictation: hold a key, speak, clean text appears in any app. Runs fully on your machine.
Rust
0
157 commits
updated Oct 16, 2026
Hold a key, speak, and clean text appears in the app you are typing in.
Voice dictation that runs entirely on your own computer.
Download for Windows · Design · Eval results · Models · Datasets
Hold Right Ctrl, talk the way you talk, let go. "Hey Sarah, I can take three days off starting the fifteenth, no wait, fourteenth" becomes Hey Sarah, I can take three days off starting the 14th. in your email, chat, editor or terminal, about a quarter of a second after you release the key. Nothing you say leaves the machine.
On the development machine (RTX 3090 Ti), in the app itself. Every figure is from docs/eval-results.md, where the method and the raw numbers live.
| Key up to text in the app | 231-260 ms (speech 48-71 ms, cleanup 131-158 ms, paste 47-61 ms) |
| Launch to ready | 3.5-3.8 s warm, 5.6-6.0 s right after a reboot |
| Ready to send as typed, realistic dictation (Quality) | 89.3%, 82.3% with voices the model never heard |
| Dictionary terms spelled right | 97.8% |
| GPU memory | Quality 4.8 GB, Light 3.2 GB |
"Ready to send" is the share of dictations a careful writer would send exactly as typed, judged dictation by dictation against the intended text with a rubric checked against human review.
Download Utter_<version>_x64-setup.exe from the
latest release and run it. It installs
for your user only. On first start Utter checks your computer, recommends a model for your
graphics card, tests your microphone, downloads what it runs on, and ends with a test
dictation.
Needs: Windows 10 or 11 (64-bit), an NVIDIA graphics card with 4 GB of memory (6 GB for Quality) and driver 580 or newer, and about 10 GB of disk. macOS and Linux are planned.
| Model | What it is | GPU memory |
|---|---|---|
| Quality | Gemma 4 E4B, fine-tuned for dictation cleanup | 4.8 GB |
| Light | Gemma 4 E2B, fine-tuned the same way | 3.2 GB |
Both share the speech model: Parakeet (the parakeet-ultra weights) in Utter's own ONNX runtime.
Right Ctrl down Right Ctrl up
│ │
▼ ▼
mic (already open, 300 ms pre-roll) ──► voice detection cuts at pauses ──► last segment
│ │
▼ ▼
Parakeet on the GPU, segment by segment ──► full transcript
│ │
▼ ▼
the Bar shows the words live cleanup model (llama.cpp)
│
▼
paste into the window that had focus, clipboard restored
Latency is the product. Every stage of every dictation is traced. Nothing is called faster or slower without a measurement, and a change that costs latency for a small gain in quality is not made.
Evals decide, not impressions. Models are chosen by measurement on our own bench, never by reputation. The cleanup model is judged on dictation built from real written text: everyday messages, emails, notes and AI prompts, Stack Exchange answers, Wikipedia, arXiv abstracts and chat logs, spoken in seven ways (plain, with fillers, self-corrected, as commands, with far-back edits, with spoken punctuation, in broken grammar), voiced by text-to-speech, and recognized by the same Parakeet the app runs. The answer key is known by construction. Every change to a model, prompt or setting is run against it and logged in docs/eval-results.md, regressions included.
Specs before code. Every surface (the Bar, first run, Home, History, insertion) has a spec with its layout, states, motion, copy, keyboard behavior and acceptance checks. It is done when every check passes on the real machine.
Decisions are written down. DESIGN.md is the source of truth for scope and architecture, and its decisions log records each choice with the measurement behind it.
Done means done. A feature ships when it meets its latency budget, its eval numbers and its UX checks, not when it first works.
Open data. The training and test data for the cleanup models is published:
| Dataset | What is in it |
|---|---|
| dictation-to-text | 89k pairs of what the recognizer heard and the text that was meant, 80k train / 10k test, balanced across sources, domains and kinds |
| dictation-speech | The spoken audio behind them (16 kHz FLAC), plus the eval sets, with voices the training data never uses |
Both carry only openly licensed text (CC0, CC-BY-SA, public domain), with the source and license on every row.
crates/
utter-core data folder, logs, tracing
utter-runtime pinned components: download, verify, install, repair
utter-audio microphone capture, ring buffer, resampling, levels
utter-asr Parakeet on onnxruntime, Silero voice detection, segmenting
utter-llm the llama.cpp server, the cleanup prompt and its guards
utter-platform everything OS-specific, behind traits: hotkey, insertion, focus, caret
utter-pipeline the dictation loop, settings, history
utter-cli benches and tools: transcribe, clean, dictate, e2e-bench, llm-bench
app/ Tauri 2 shell (src-tauri/) and the Svelte 5 windows (src/)
tools/ Python, never shipped: eval harness, datasets, training, benchmarks
docs/ UX specs, eval results, research notes, local setup
Rust (see rust-version in Cargo.toml), Node, and an NVIDIA GPU. From the repository root:
cargo run --release -p utter-cli -- setup
That installs the runtime components and models into the development data folder. Then, from
app/:
npx tauri dev
docs/local-setup.md has the details: where data lives, the Python tools environment (uv), and every bench and eval command.
Windows, English. Next: context from the text around the cursor, styles per app, Command Mode, then Linux (GNOME) and macOS. Vietnamese, with switching between the two mid-sentence, is planned.
Copyright (C) 2026 Tai Duc Nguyen.
Utter's code is licensed under the GNU Affero General Public License v3.0: you may use, study, change and share it, and if you distribute a modified version or run it as a service, you must publish its source under the same license.
The models and datasets carry their own licenses, stated on their pages: the speech model's weights are CC-BY-4.0, and the datasets are CC-BY-SA with the source and license of every row.