Review of "Voice Hold" version 0.2 (1)

Details Page Preview

Hold a key and speak. Offline dictation, text arrives as you talk. Hold the shortcut (Super+X by default), speak, release: the words are typed in the text field under your cursor while you talk, block by block, with a grey live preview. A quick tap keeps listening hands-free (tap again, Escape or a few seconds of silence stop it). A small pill next to the cursor shows the microphone level and the live text. Everything runs on your computer, offline: French, English and 23 other European languages are recognised with punctuation (Parakeet TDT 0.6B v3 through sherpa-onnx). No account, no network, no cloud. An optional local LLM (Ollama) can polish each block; it is off by default. Requires the separate voice-hold-engine helper (Python, GPL, one command to install, ~650 MB of models downloaded by you) and PipeWire; nothing works without it. The settings page shows the install command, with a button that copies it to the clipboard, and the engine status. Wayland only; applications must use the GNOME input method (GTK, Qt, Electron with Wayland; terminals get the text without the preview).

Extension Homepage
https://github.com/d101c/voice-hold

No comments.

FAQ

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental)

Shexli did not find any issues.

All Versions

Version Status
0.3 (2) Unreviewed
0.2 (1) Rejected

Previous Reviews on this Version

jg__ posted a review
Voice Hold needs a separate helper (voice-hold-engine, Python, GPL-2.0-or-later, same repository) that does the speech recognition offline with sherpa-onnx. The extension only talks to it over the session bus (org.griffit.VoiceHold, D-Bus activation) and shows the install command in its preferences; it never spawns anything itself and nothing works without it, as the description says. Two points a reviewer may ask about: (1) keyHook.js wraps IBus.InputContext.prototype.process_key_event_async only while a hands-free session is running, to catch Escape, and restores it only if the wrapper is still its own (otherwise it stays inert in the chain); (2) hud.js reads Main.inputMethod._cursorRect to place the pill under the text cursor and falls back to the pointer when it is absent. The Copy button in the preferences writes the install command to the clipboard, as declared. Tests: 54 gjs cases for the extension modules, 61 pytest cases for the engine. I used AI assistance to write and review this code and can explain every line.
jg__ auto- rejected
Auto-rejected because of new version 0.3 (2) was uploaded