Noctalia widget and OSD
このコンテンツはまだ日本語訳がありません。
If you run the Noctalia shell, Utter ships an optional widget package with three parts: a bar widget, a persistent attention panel, and an assistant-mode on-screen display (OSD). None of it is installed by default, and the core assistant does not depend on it.
Install
Section titled “Install”widgets/noctalia/install.sh # copy + lintwidgets/noctalia/install.sh --yes # + enable and add the bar widget./install.sh --with-noctalia # via the main installer (step 8 of the wizard)The remote installer offers the same step and skips it with a one-line hint when Noctalia is not
detected. The widget is installed to ~/.local/share/noctalia/plugins/utter. Its left-click
opens utter-gui; if the installer’s prefix is not on your PATH, the installer offers to
create a ~/.local/bin/utter-gui symlink so the widget can find it.
The on-screen display
Section titled “The on-screen display”The OSD appears while the assistant push-to-talk key is held. Dictation does not raise it.
- Hold the assistant key: a small panel appears (bottom centre by default) with a live level meter and, best-effort, the in-progress transcript.
- Release: the final transcript is shown and the panel turns green if the router produced a command, or red if nothing matched.
- After
dismiss_msit fades out.
Noctalia exposes no partial transcripts of its own, so the live transcript uses windowed decoding and is best-effort. When it is not available, the level meter still works and the final text appears on release.
Configuration
Section titled “Configuration”[osd]enabled = true # UTTER_OSD=0 disables at runtimeposition = "bottom_center"dismiss_ms = 1200stream = true # best-effort windowed live transcriptionstream_interval_ms = 700window_s = 6If a whisper model is available on the host, windowed decoding uses a second resident
model. Set stream = false to avoid that cost.
How it works
Section titled “How it works”The emitter writes $XDG_RUNTIME_DIR/utter/osd.json atomically:
{"state":"listening","mode":"assistant","level":0.37,"text":"open you","activated":null,"ts":1700000000000}| Field | Values |
|---|---|
state | idle, listening or final |
mode | assistant (dictation does not raise the OSD) |
level | 0.0 to 1.0 |
text | live, partial or final transcript |
activated | true (command detected), false (not), or null while listening |
ts | epoch milliseconds |
The Noctalia OSD service polls this file (every 50 ms while active, 500 ms when idle) and opens,
updates or closes the panel. An IPC push (noctalia msg plugin <id>:osd focused show '<json>')
is also accepted for immediacy. The emitter is a strict no-op when disabled and never blocks the
recognition thread.
Privacy
Section titled “Privacy”The OSD text is, by design, visible on your screen. The state file lives 0700 under
$XDG_RUNTIME_DIR and is not logged.
Components in the repository
Section titled “Components in the repository”- Emitter:
utter/voice/osd.py, driven by the native voice loops (run_hotkey/run_macos): listening/level/final, plus theloadingstate on cold start and wake. It is a strict no-op when disabled. - Panel: the Noctalia plugin under
plugins/ui/noctalia/and the widget package underwidgets/noctalia/(bar widget, attention panel, OSD and their pollers).