Aloud
A hold-to-speak Windows dictation tool that types clean, punctuated text at your cursor in any app. Fully on-device speech recognition via a bundled ONNX model, WinUI 3, no account and no internet required.
Overview
Aloud (renamed from Dictato on August 20, 2026, after the original name turned out to belong to a shipping commercial product) is a Windows dictation app: hold the right Ctrl key, speak, let go, and clean punctuated text appears wherever the cursor was focused. It runs entirely on-device using a bundled Moonshine ONNX speech model behind an ITranscriber interface, so a cloud engine could be swapped in later without restructuring the app. The tray-resident app targets under 500ms from speech-end to visible text, cold start under 2 seconds, and idle RAM under 150MB.
Why it was built
A personal daily-use tool and portfolio piece first, a potential product second. The goal was a dictation tool that starts instantly, sits invisibly in the tray, and never sends a word of speech off the machine, in contrast to the cloud-dependent incumbents. It is built to be installed by colleagues who see it in use, which is why it is being shaped for Microsoft Store submission under the identity AppsbyAnurag.Aloud rather than left as a dev-only tool.
Hold-to-Talk / Double-Tap-to-Lock
Right-Ctrl drives a small state machine with exactly two timing thresholds: TAP_MAX (250ms) distinguishes a tap from a hold, and DOUBLE_TAP_WINDOW (400ms) catches a double-tap to lock recording hands-free, both defined once in HotkeyChord.cs.
On-Device Transcription
MoonshineOnnxTranscriber.cs runs a bundled 26MB Moonshine Tiny ONNX model entirely on-device behind an ITranscriber interface, so climbing to a larger local model or a cloud fallback later is one new class, not a rewrite.
Deterministic Cleanup Pipeline
TranscriptCleaner.cs runs a fixed pipeline: collapse whitespace, strip filler words, collapse stutters, apply spoken commands, normalize punctuation spacing, capitalize the first letter. No LLM rewrite pass, since that would blow the latency budget.
Tech Breakdown
MSIX packaging from the first sprint was required because ApplicationData.Current.LocalSettings throws without package identity, a lesson learned the expensive way on a sibling project.
A 26MB bundled model keeps zero-setup adoption intact: a colleague installs the app and it just works, no model download wait. The interface-first design (ITranscriber) keeps a defined fallback ladder to Moonshine Base or cloud open if accuracy proves insufficient.
WinUI 3's transparent always-on-top overlays are unreliable. Building the pill as a LayeredWindow with GDI+ rendering sidesteps that entirely while still living inside a WinUI 3 host app.
A system-wide low-level keyboard hook is the only way to catch right-Ctrl hold/double-tap gestures regardless of which app has focus, which is the entire premise of a dictate-anywhere tool.
- 1
Distinguishing a tap from a hold from a double-tap on a single key requires an explicit state machine with exactly two timing constants; early prose descriptions of the gesture produced thresholds that silently contradicted each other.
- 2
Text injection has two failure modes Windows does not reliably report through an API return code: the target window losing foreground focus mid-injection, and UIPI silently dropping input aimed at an elevated process. Both had to be checked proactively rather than inferred from SendInput's result.
Package identity still needs to be confirmed character-for-character against Partner Center, and Store screenshots plus a real end-to-end injection test are the remaining steps before Microsoft Store submission.
Want to know more?
Happy to walk you through the details, just reach out.