- Add expand_spoken_punctuation() in quality.py: converts spoken phrases
"new line" / "neue Zeile" → \n and "new paragraph" / "neuer Absatz" → \n\n
before text is typed; xdotool/wtype handle \n as Return
- Daemon: pulse "⏳ Thinking..." animation in the overlay while waiting for
the first LLM token (400ms interval), replaced automatically when streaming
starts so the user sees activity during cold-start latency
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Wayland support: text delivery using wtype or ydotool (paste.py)
- Testing: added Pytest coverage for routing, quality, and config logic
- CI/CD: added test-linux job to .github/workflows/ci.yml
- Feature: Hands-free dictation using an external wyoming-openwakeword
server, respecting the /tmp/wake_muted toggle.
New quality.py: analyze the recorded WAV (duration + RMS, stdlib only) and drop
clips that are too short or too quiet before transcribing; after transcribing,
reject the stock phrases Whisper invents on silence ("Thank you.", "Untertitel
…", "Vielen Dank." etc.) on short clips. New [quality] config section
(min_speech_seconds, silence_rms, reject_hallucinations, strip_trailing_punctuation).
Tested: silence rms 38 rejected, speech rms 4656 passes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>