100% local system-wide voice dictation for Windows, in native Rust. Press a global hotkey, speak, press again: the text is transcribed locally and pasted into the active application. No data ever leaves the machine. Transcription runs on the multi-backend Dictata Engine — whisper.cpp by default, with optional ONNX backends (Parakeet, SenseVoice, Moonshine, Zipformer).
Current release: v0.1.0 — see CHANGELOG.md.
vulkan feature..bin file → whisper, an ONNX bundle
directory → its matching backend)..bin model or ONNX bundle from a
direct URL, a repo (owner/name) or a keyword search.PATH (only for "Transcribe a file").cargo build --release
Build specifics:
MAX_PATH workaround (Windows): whisper.cpp's vulkan-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 --features whisper
whisper is the transcription backend: --no-default-features drops vulkan
(which is what pulls it in), so it must be re-enabled explicitly or the binary
has no backend and cannot transcribe.
The ONNX backends are off by default — a stock build ships whisper.cpp only.
Enable one (or several) at build time; each links onnxruntime statically through
ort, so no extra DLL ships alongside the executable:
cargo build --release --features parakeet # NVIDIA Parakeet (add parakeet-directml for GPU)
cargo build --release --features sensevoice # SenseVoice CTC
cargo build --release --features moonshine # Moonshine
cargo build --release --features zipformer # Zipformer transducer
All backends at once (GPU whisper + every ONNX backend):
cargo build --release --features "vulkan,parakeet-directml,sensevoice,moonshine,zipformer,vad"
Combine with vulkan (the default) to keep GPU whisper alongside an ONNX
backend, e.g. --features "vulkan,parakeet-directml".
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 loader 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.
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.Ctrl+Alt+Space), speak, press again. Hold Esc 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.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 | Facade over the ASR engine (backend chosen from the model's shape) |
engine/ | Multi-backend ASR engine: AsrEngine trait, EngineKind::detect, backends (whisper, Parakeet, SenseVoice, Moonshine, Zipformer) |
streaming.rs | Continuous mode: pause-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 + ONNX catalogs, download/delete (files and bundles), 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
83 unit tests (config, resampling, mixing, modes, settings logic, hardware rating, HuggingFace query parsing, audio-context sizing, history retention, cancel gesture, download safety, backend detection, ONNX bundle handling…). 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 LICENSE.
© 2026 Antoine Chatry.
16 commits
Rust
96.5%
PowerShell
2.6%
100% local system-wide voice dictation for Windows, in native Rust. Press a global hotkey, speak, press again: the text is transcribed locally and pasted into the active application. No data ever leaves the machine. Transcription runs on the multi-backend Dictata Engine — whisper.cpp by default, with optional ONNX backends (Parakeet, SenseVoice, Moonshine, Zipformer).
Current release: v0.1.0 — see CHANGELOG.md.
vulkan feature..bin file → whisper, an ONNX bundle
directory → its matching backend)..bin model or ONNX bundle from a
direct URL, a repo (owner/name) or a keyword search.PATH (only for "Transcribe a file").cargo build --release
Build specifics:
MAX_PATH workaround (Windows): whisper.cpp's vulkan-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 --features whisper
whisper is the transcription backend: --no-default-features drops vulkan
(which is what pulls it in), so it must be re-enabled explicitly or the binary
has no backend and cannot transcribe.
The ONNX backends are off by default — a stock build ships whisper.cpp only.
Enable one (or several) at build time; each links onnxruntime statically through
ort, so no extra DLL ships alongside the executable:
cargo build --release --features parakeet # NVIDIA Parakeet (add parakeet-directml for GPU)
cargo build --release --features sensevoice # SenseVoice CTC
cargo build --release --features moonshine # Moonshine
cargo build --release --features zipformer # Zipformer transducer
All backends at once (GPU whisper + every ONNX backend):
cargo build --release --features "vulkan,parakeet-directml,sensevoice,moonshine,zipformer,vad"
Combine with vulkan (the default) to keep GPU whisper alongside an ONNX
backend, e.g. --features "vulkan,parakeet-directml".
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 loader 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.
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.Ctrl+Alt+Space), speak, press again. Hold Esc 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.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 | Facade over the ASR engine (backend chosen from the model's shape) |
engine/ | Multi-backend ASR engine: AsrEngine trait, EngineKind::detect, backends (whisper, Parakeet, SenseVoice, Moonshine, Zipformer) |
streaming.rs | Continuous mode: pause-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 + ONNX catalogs, download/delete (files and bundles), 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
83 unit tests (config, resampling, mixing, modes, settings logic, hardware rating, HuggingFace query parsing, audio-context sizing, history retention, cancel gesture, download safety, backend detection, ONNX bundle handling…). 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 LICENSE.
© 2026 Antoine Chatry.
16 commits
Rust
96.5%
PowerShell
2.6%