{"slug": "show-hn-dictata-local-whisper-dictation-with-llm-cleanup", "title": "Show HN: Dictata – Local Whisper dictation with LLM cleanup", "summary": "Dictata v0.1.0, a 100% local system-wide voice dictation app for Windows built in Rust, transcribes speech via whisper.cpp and offers optional LLM cleanup, with no data leaving the machine. The release supports hotkey dictation, streaming mode, Vulkan GPU acceleration, multiple audio sources, and custom vocabulary, but Linux is not supported in this version.", "body_md": "**100% local** system-wide voice dictation for Windows, in native Rust. Press a\nglobal hotkey, speak, press again: the text is transcribed locally by\n[whisper.cpp](https://github.com/ggerganov/whisper.cpp) and pasted into the\nactive application. No data ever leaves the machine.\n\nCurrent release: **v0.1.0** — see [CHANGELOG.md](/AntoineChatry/Dictata/blob/master/CHANGELOG.md).\n\n**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 pause.** 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 the`vulkan`\n\nfeature.**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\n**vocabulary and replacements** injected as the initial prompt. - Built-in\n**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`\n\nmodel from a direct URL, a repo (`owner/name`\n\n) or a keyword search.**fr / en / es interface**, dark theme, system tray icon, transcription history.\n\n- Windows 10/11. Linux is\n**not supported** in this release — see[LINUX.md](/AntoineChatry/Dictata/blob/master/LINUX.md)for what works, what does not, and why. [ffmpeg](https://ffmpeg.org/)in`PATH`\n\n(only for \"Transcribe a file\").- To build with GPU support: the\n[Vulkan SDK](https://vulkan.lunarg.com/)and the Visual Studio Build Tools (CMake + Ninja included).\n\n```\ncargo build --release\n```\n\nBuild specifics:\n\n-\n**MAX_PATH workaround (Windows)**: whisper.cpp's`vulkan-shaders-gen`\n\nsub-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`\n\npointing the build to a short path at a drive root:\n\n```\n[build]\ntarget-dir = \"C:/wt\"   # any short path\n```\n\nThe executable and its\n\n`config.json`\n\nthen live in`<target-dir>\\<profile>\\`\n\n. -\nAfter a\n\n`cargo clean`\n\n, rebuild inside a Visual Studio environment with the Ninja generator:\n\n```\nVsDevCmd.bat -arch=amd64 && set CMAKE_GENERATOR=Ninja && set CMAKE_GENERATOR_INSTANCE= && set VULKAN_SDK=<SDK path> && cargo build\n```\n\nFor a CPU-only build (no Vulkan SDK required):\n\n```\ncargo build --release --no-default-features\npowershell -ExecutionPolicy Bypass -File scripts\\release-windows.ps1 -Variant both\n```\n\nRuns the tests, builds, and writes `dist\\dictata-<version>-windows-x86_64[-cpu].zip`\n\nwith its SHA-256. The zip contains only `dictata.exe`\n\n, `README.md`\n\n, `LICENSE`\n\nand `CHANGELOG.md`\n\n: no `config.json`\n\nis shipped (the app writes its own\ndefaults on first run, and a development `config.json`\n\ncarries personal data).\nThe binary is self-contained — no DLL to ship alongside it; the Vulkan build\nuses the loader provided by the graphics driver.\n\nThe executable carries its icon and version metadata, embedded by `build.rs`\n\nvia `winresource`\n\n. The icon itself is drawn by a script rather than checked in\nas an opaque blob — edit the numbers and regenerate all sizes at once:\n\n```\npowershell -ExecutionPolicy Bypass -File scripts\\make-icon.ps1\n```\n\n`scripts/release-linux.sh`\n\nmirrors the packaging script, but has never been\nrun — see [LINUX.md](/AntoineChatry/Dictata/blob/master/LINUX.md).\n\n- Launch the executable: the application lives in the system tray.\n- Open\n**Settings**(tray menu, or set the`DICTATA_OPEN_SETTINGS=1`\n\nenvironment 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\n`Ctrl+Alt+Space`\n\n), 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`\n\nThe configuration is read from `config.json`\n\nnext to the executable, or from\nthe directory pointed to by the `DICTATA_HOME`\n\nenvironment variable. The\nfile must be UTF-8 **without BOM**.\n\nGPU: `gpu`\n\nconfig field — `\"auto\"`\n\n(default, uses Vulkan when available),\n`\"cpu\"`\n\n, `\"vulkan\"`\n\n, `\"cuda\"`\n\n.\n\n| Module | Role |\n|---|---|\n`main.rs` |\nOrchestration: states, hotkey, dock, transcription threads |\n`audio.rs` |\ncpal capture (mic / loopback / mix), 16 kHz resampling, ffmpeg decoding |\n`transcriber.rs` |\nwhisper-rs wrapper (model loading, transcription) |\n`streaming.rs` |\nContinuous mode: pause-based chunking, progressive emission |\n`settings.rs` |\nSettings window (8 pages, egui) — presentation |\n`settings_logic.rs` |\nSettings business logic, testable without UI |\n`dock.rs` |\nFloating dock (waveform, states) |\n`modes.rs` / `llm.rs` |\nOutput modes and local LLM post-processing |\n`models.rs` |\nggml catalog, download/delete, HuggingFace search, paths |\n`i18n.rs` |\nfr/en/es translations (`tr()` ) |\n`config.rs` / `history.rs` / `paste.rs` / `hotkey.rs` / `tray.rs` / `hardware.rs` / `platform.rs` |\nConfig, history, paste, global hotkey, tray, hardware detection, Windows integration |\n\n```\ncargo test\n```\n\n64 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:\n\n```\ncargo run --example transcribe -- <file.wav>   # DICTATA_GPU=1 for GPU\n```\n\nLicensed under the **MIT License with the\nCommons Clause** — see\n\n[LICENSE](/AntoineChatry/Dictata/blob/master/LICENSE).\n\n**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.*Sell*it\n\n© 2026 Antoine Chatry.", "url": "https://wpnews.pro/news/show-hn-dictata-local-whisper-dictation-with-llm-cleanup", "canonical_source": "https://github.com/AntoineChatry/Dictata", "published_at": "2026-08-15 00:58:34+00:00", "updated_at": "2026-08-15 01:11:15.018046+00:00", "lang": "en", "topics": ["artificial-intelligence", "machine-learning", "natural-language-processing", "developer-tools"], "entities": ["Dictata", "whisper.cpp", "Vulkan", "HuggingFace", "Windows", "Rust", "ffmpeg"], "alternates": {"html": "https://wpnews.pro/news/show-hn-dictata-local-whisper-dictation-with-llm-cleanup", "markdown": "https://wpnews.pro/news/show-hn-dictata-local-whisper-dictation-with-llm-cleanup.md", "text": "https://wpnews.pro/news/show-hn-dictata-local-whisper-dictation-with-llm-cleanup.txt", "jsonld": "https://wpnews.pro/news/show-hn-dictata-local-whisper-dictation-with-llm-cleanup.jsonld"}}