HoldToSpeak 0.1.1 — fixes the silent first-run crash
A bug-fix release, from real first-run testing of v0.1.0. If you have v0.1.0, upgrade — one of
these is the difference between the app starting and the app vanishing without a word.
Download
| HoldToSpeak-0.1.1-x64-setup.exe | Installer. Per-user — installs to %LOCALAPPDATA%, never asks for admin rights. |
| HoldToSpeak-0.1.1-x64.zip | Portable. Unzip and run nib-core.exe. |
HoldToSpeak-0.1.1-x64-setup.exe 2588D5A5D0A56962562845C9020B578032991AE935249818FBFFF4461C9C7502
HoldToSpeak-0.1.1-x64.zip DD466BB2CB227E8F98C889590D96F806087A66E644908CBF3E062F33424F7024
Still unsigned, so SmartScreen will warn on first run — More info → Run anyway, or verify
against the hashes above.
Fixed
The app could crash on first run — because Windows' own ONNX Runtime was being used
This is the big one, and the cause turned out to be more interesting than "a random crash".
Windows 11 ships its own onnxruntime.dll in System32 (the Windows ML component, version
1.17). HoldToSpeak ships 1.27.1, which is the version its speech engine is built against. The
app's own folder is normally searched first — but if our copy isn't loaded for any reason, Windows
silently falls back down the search order and hands the engine the operating system's older
runtime instead. The engine then asks for an API version that runtime doesn't have, gets NULL
back, and dereferences it: an instant crash, with no message.
It's now impossible for that to happen silently. The app loads its own runtime explicitly by full
path, checks that the copy actually in use is the one it shipped, and asks the runtime directly
whether it supports the API the engine needs. If any of that fails it says so in plain English
instead of dying.
Startup errors no longer vanish with the window
The related reason nobody could diagnose the above: the app is a console application, so when it's
started from a shortcut, a double-click, or the installer's "run now" checkbox, Windows gives it a
console of its own and destroys that console the instant the process exits — taking the error
message with it.
Now:
- Startup errors stay on screen. If the app owns its console it waits for you to press Enter.
Run from an existing terminal it doesn't pause, so scripts don't hang. - The engine start is retried once, so a one-off hiccup costs a second rather than the session.
- Errors say something useful, including the engine's exit code, and the model/microphone
failure paths got the same treatment.
"Polish" mode wasn't doing anything
Without the (Pro) language model, Polish was silently falling back to Auto — the menu offered a
mode that quietly ran a different one. Polish is now a genuine, fully offline mode that strips
conversational scaffolding:
Before: I'm just testing this, like, you know, testing the software and stuff, just to make sure it can come up with a proper coherent sentence.
After: I'm just testing this, testing the software, just to make sure it can come up with a proper coherent sentence.
It only ever deletes filler — it never invents or reorders words — and it will not touch a word
that is doing real work. "like" is filler in "it's, like, fine" but not in "I like this";
"you know" is filler in "it's, you know, tricky" but not in "you know the answer". The rule is
that a filler must be delimited by commas, so when there's no way to be sure, it leaves your words
alone. Auto stays deliberately light — only Polish is aggressive.
Stray spaces between dictations
Spacing between utterances was based on what the app had last typed, which stopped being true the
moment you typed something yourself or clicked elsewhere. It now notices both, and stops guessing.
Also
wingetmanifest updated to 0.1.1.- Everything above is covered by tests (78, up from 73).
Unchanged: your voice still never leaves your machine. No account, no telemetry, one
network request ever — the first-run model download, against a pinned checksum. See
PRIVACY.md.