Repository navigation
Releases
v0.13.2
v0.13.1
Full Changelog: v0.13.0...v0.13.1
v0.13.0
stttcFull Changelog: v0.12.0...v0.13.0
v0.12.0 — drop pw-play/mp3, merge helpers into stt-info
What's new
No more pw-play dependency — the success sound is now generated by ffmpeg like all other beeps (ascending two-tone, 660Hz → 880Hz). The assets/ directory and ~/.local/share/stt/ are gone.
stt-info replaces three scripts — stt-check, stt-status, and stt-download are merged into one:
stt-info # live status: processes, server, downloaded models
stt-info check # which alias models are available
stt-info download # pre-download all models
stt-info download hu en # download specific languagesInstall / update
curl -fsSL https://stt.demo.land/setup.sh | bashv0.11.0 — countdown timer, audio beeps, auto-dismiss
What's new
Countdown timer — the notification counts down while you hold the key: "Hallgatom… 20s", "Hallgatom… 19s"… Each tick auto-expires after 1.5s so it disappears cleanly on release without leaving a stale notification.
Audio beeps — no extra sound files, generated on the fly via ffmpeg:
- Key press → short high beep (880Hz) — recording started
- Key release → double-click tone (660Hz) — audio sent, transcribing
- Error → low tone (400Hz)
Auto-dismiss notifications — no more lingering popups:
- Transcribing: 1 second
- Transcript result: 3 seconds
- Errors: 3 seconds
Bug fixes:
- curl exit 255 false error after SIGINT — now trusts HTTP status over curl exit code
- Key release during server startup now cancels cleanly
- Default URL fallback was accidentally set to port 3000
Install / update
curl -fsSL https://stt.demo.land/setup.sh | bashv0.10.2 — fix key release during server startup
Fix
Key release now works during server readiness wait — previously releasing the key while speaches was still starting up had no effect: the bindr only killed ffmpeg, which doesn't exist yet during the readiness check. stt kept polling for the full 30 seconds and then showed the error.
Two-part fix:
/tmp/stt.recordingis now created before the readiness loop (was after), so the bindr can act immediately on key release- The bindr now removes
/tmp/stt.recordingin addition to killing ffmpeg — the readiness loop checks for its absence each iteration and exits cleanly (no error notification)
Install / update
curl -fsSL https://stt.demo.land/setup.sh | bashNote: existing installs also need the Hyprland keybinding updated. Re-run setup.sh, or replace the
bindrlines in your Hyprland config with:bindr = SUPER, grave, exec, sh -c 'rm -f /tmp/stt.recording; kill -INT "$(cat /tmp/stt.ffmpeg.pid 2>/dev/null)" 2>/dev/null; true' bindr = , grave, exec, sh -c 'rm -f /tmp/stt.recording; kill -INT "$(cat /tmp/stt.ffmpeg.pid 2>/dev/null)" 2>/dev/null; true'
v0.10.1 — fix cold-start timeout
Fix
Extended server readiness wait — stt now waits up to 30 seconds (was 3) for the speaches container to become ready. The 3-second window was too short when Docker starts uvicorn from scratch (after reboot or first install), causing a false "could not reach" error. The "Hallgatom…" notification is already visible during the wait, so the user sees feedback immediately.
Install
curl -fsSL https://stt.demo.land/setup.sh | bashv0.10.0 — 99 languages, exact PID tracking, CUDA, stt-status
What's new
99-language coverage — model_aliases.json now covers all Whisper-supported languages with native i18n strings (listening/transcribing messages in the target language). Languages without a dedicated model fall back to multi + a language hint.
typing → transcribing — the in-progress notification text was renamed to better reflect what's happening.
Exact ffmpeg PID tracking — stt writes the ffmpeg PID to /tmp/stt.ffmpeg.pid and the Hyprland bindr kills that exact process, not a name pattern. Safer, no collateral kills.
Missed-release fallback — a naked-key bindr (modifier released before key) also stops the recording, so you no longer get orphaned ffmpeg processes from fast key presses.
stt-toggle — press once to start recording, press again to stop. Alternative to the hold-to-talk flow.
CUDA auto-detection — setup.sh runs nvidia-smi and pulls the CUDA speaches image automatically when an NVIDIA GPU is found.
Server readiness check — stt retries the speaches /models endpoint 3 times (1 s apart) before recording, avoiding "could not reach" errors when the container is still starting up.
--restart unless-stopped — the speaches container now survives reboots automatically.
stt-status — new diagnostic CLI:
$ stt-status
stt status
stt recording pid=12345
ffmpeg recording pid=12346
speaches online http://localhost:8000/v1
models 2 downloaded
Systran/faster-whisper-small
Systran/faster-whisper-small.hu
Shows stt state (recording / transcribing / idle / stale pid), ffmpeg instances with tracked/orphan classification, speaches server status, downloaded models, and warns on concurrent transcription requests.
Install
curl -fsSL https://stt.demo.land/setup.sh | bashv0.7.0 — VAD config, stt-download, i18n notifications
What's new
VAD tuning — add a vad block to ~/.config/stt/config.json to control Voice Activity Detection sensitivity:
"vad": {
"threshold": 0.6,
"min_silence_duration_ms": 1000
}Higher threshold = less sensitive, filters more background noise. Parameters are passed directly to Speaches/faster-whisper.
stt-download — pre-download models before you need them:
stt-download # all aliases
stt-download hu en # specific languagesLocalized notifications — notification header shows the language name; listening/typing messages are in the detected language (e.g. "stt · Magyar / Hallgatom…").
Single-instance — re-pressing the hotkey cancels any in-progress transcription and starts fresh.
Simpler keybinding — all notification logic is now inside stt. The Hyprland binding is just exec stt / pkill -INT ffmpeg.
stt-check improved — instant check via GET /v1/models, no accidental downloads, shows key / name / model columns.
Install
curl -fsSL https://stt.demo.land/setup.sh | bashv0.6.0 — i18n notifications, single-instance, richer model aliases
What's new
Localized notifications — the notification header shows the language name and messages are in the detected language. Pressing the key in a Hungarian layout shows "stt · Magyar / Hallgatom…" instead of a generic "Listening…".
Rich model aliases — model_aliases.json now stores an object per language with model, name, listening, and typing fields. Easy to extend with more metadata. setup.sh transforms it to the flat format Speaches expects.
Single-instance — pressing the hotkey while a transcription is already running cancels it cleanly and starts a fresh recording. No stuck processes, no double transcriptions.
Simplified keybinding — all notification logic moved into stt. The Hyprland binding is now just exec stt / pkill -INT ffmpeg.
Better stt-check — uses GET /v1/models instead of POST, so it never triggers accidental downloads. Shows key / name / model columns and reports not-yet-fetched models in yellow.
Install / update
curl -fsSL https://stt.demo.land/setup.sh | bash