100% local system-wide voice dictation for Windows, in native Rust. Press a global hotkey, speak, press again: the text is transcribed locally by whisper.cpp and pasted into the active application. No data ever leaves the machine.
Current release: v0.1.0 — see CHANGELOG.md.
Hotkey dictation(toggle or push-to-talk), automatic paste into the active application, floating dock with waveform (configurable size, opacity and position).Continuous mode (streaming): text is inserted as you speak, at every detected .** Silence skipping (VAD)**: optional whisper.cpp voice-activity detection on standard (non-streaming) dictation — less compute and fewer hallucinations on silence. Downloads a small (~2 MB) model on first use; toggle in Configuration.Vulkan GPU transcription(AMD/Intel/NVIDIA) or CPU — whisper-rs with thevulkan
feature.Audio sources: microphone, system audio (WASAPI loopback) or a mix of both (meeting mode).** Output modes**: raw, or post-processing through a local OpenAI-compatible LLM (cleanup, email, message, list…), with customizable prompts.Transcribe a file(audio/video, History page) — any format handled by ffmpeg.- Custom
vocabulary and replacements injected as the initial prompt. - Built-in
ggml model library: download, delete, and hardware-aware recommendations (detected GPU/VRAM when running on Vulkan, CPU/RAM otherwise). HuggingFace search: install any ggml.bin
model from a direct URL, a repo (owner/name
) or a keyword search.fr / en / es interface, dark theme, system tray icon, transcription history.
- Windows 10/11. Linux is
not supported in this release — seeLINUX.mdfor what works, what does not, and why. ffmpegin
PATH
(only for "Transcribe a file").- To build with GPU support: the Vulkan SDKand the Visual Studio Build Tools (CMake + Ninja included).
cargo build --release
Build specifics:
MAX_PATH workaround (Windows): whisper.cpp'svulkan-shaders-gen
sub-project can exceed the Windows MAX_PATH limit (260 characters) and break MSBuild (FTK1011/C1083). If that happens, create a local (untracked).cargo/config.toml
pointing the build to a short path at a drive root:
[build]
target-dir = "C:/wt" # any short path
The executable and its
config.json
then live in<target-dir>\<profile>\
. - After a
cargo clean
, rebuild inside a Visual Studio environment with the Ninja generator:
VsDevCmd.bat -arch=amd64 && set CMAKE_GENERATOR=Ninja && set CMAKE_GENERATOR_INSTANCE= && set VULKAN_SDK=<SDK path> && cargo build
For a CPU-only build (no Vulkan SDK required):
cargo build --release --no-default-features
powershell -ExecutionPolicy Bypass -File scripts\release-windows.ps1 -Variant both
Runs the tests, builds, and writes dist\dictata-<version>-windows-x86_64[-cpu].zip
with its SHA-256. The zip contains only dictata.exe
, README.md
, LICENSE
and CHANGELOG.md
: no config.json
is shipped (the app writes its own
defaults on first run, and a development config.json
carries personal data). The binary is self-contained — no DLL to ship alongside it; the Vulkan build uses the provided by the graphics driver.
The executable carries its icon and version metadata, embedded by build.rs
via winresource
. The icon itself is drawn by a script rather than checked in as an opaque blob — edit the numbers and regenerate all sizes at once:
powershell -ExecutionPolicy Bypass -File scripts\make-icon.ps1
scripts/release-linux.sh
mirrors the packaging script, but has never been run — see LINUX.md.
- Launch the executable: the application lives in the system tray.
- Open
Settings(tray menu, or set the
DICTATA_OPEN_SETTINGS=1
environment variable at launch): pick a model in the Models page (built-in download), set the hotkey, language and audio source. - Place the cursor where you want to write, press the hotkey (default
Ctrl+Alt+Space
), speak, press again.Hold for about half a second to cancel the current take — Escape is read globally, so a plain tap is left to the application you are typing into.Esc
The configuration is read from config.json
next to the executable, or from
the directory pointed to by the DICTATA_HOME
environment variable. The file must be UTF-8 without BOM.
GPU: gpu
config field — "auto"
(default, uses Vulkan when available),
"cpu"
, "vulkan"
, "cuda"
.
| Module | Role |
|---|---|
main.rs |
|
| Orchestration: states, hotkey, dock, transcription threads | |
audio.rs |
|
| cpal capture (mic / loopback / mix), 16 kHz resampling, ffmpeg decoding | |
transcriber.rs |
|
| whisper-rs wrapper (model , transcription) | |
streaming.rs |
|
| Continuous mode: -based chunking, progressive emission | |
settings.rs |
|
| Settings window (8 pages, egui) — presentation | |
settings_logic.rs |
|
| Settings business logic, testable without UI | |
dock.rs |
|
| Floating dock (waveform, states) | |
modes.rs / llm.rs |
|
| Output modes and local LLM post-processing | |
models.rs |
|
| ggml catalog, download/delete, HuggingFace search, paths | |
i18n.rs |
|
fr/en/es translations (tr() ) |
|
config.rs / history.rs / paste.rs / hotkey.rs / tray.rs / hardware.rs / platform.rs |
|
| Config, history, paste, global hotkey, tray, hardware detection, Windows integration |
cargo test
64 unit tests (config, resampling, mixing, modes, settings logic, hardware rating, HuggingFace query parsing, audio-context sizing, history retention, cancel gesture, download safety…). A CLI example is provided:
cargo run --example transcribe -- <file.wav> # DICTATA_GPU=1 for GPU
Licensed under the MIT License with the Commons Clause — see
Free to use, copy, modify, distribute and self-host, for personal or any other purpose.You may not: you cannot sell the software, or offer a paid product or service (hosting, SaaS, paywall, paid support…) whose value derives substantially from it.Sellit
© 2026 Antoine Chatry.