News reader with multi-engine text-to-speech.
Normal mode - display latest news items:
./news-speaker.pyPolling mode - continuous monitoring with TTS and popup:
./news-speaker.py -pFilter by source:
./news-speaker.py -s techmemeCustom RSS URL or HTML page:
./news-speaker.py -u https://example.com/feedStatistics - mean time between messages per source:
./news-speaker.py --statWord frequency analysis:
./news-speaker.py --word-freq-p, --poll- polling mode, checks every 60 seconds-d, --debug- enable debug output-s, --source- filter by source name-u, --url- RSS URL or HTML page-c, --config- path to config file-D, --use-description- include description in display and TTS-w, --width- output width (default: MANWIDTH env or 110)--stat- show mean time statistics for all sources--word-freq- show word frequencies across all sources--no-tts- disable TTS--audio-active- check if audio playback is active
- Multi-source RSS/Atom feed parsing
- RTL formatting - proper alignment for Hebrew, Arabic, Persian, Urdu, Yiddish
- TTS - Gemini 3.1 Flash (cloud) -> Piper (offline) -> gTTS fallback chain
- Popup window - shows new items on screen
- GUID-based deduplication - handles edited headlines
- HAR file support for bot-protected sources
- Global + local config merge (~/.config/news-speaker/ + local)
- Per-source exponential backoff on 429/5xx/timeout errors
- Network-aware backoff - skips penalty on general outages
- Per-source
min_intervalconfig for rate-limited sources - Config hot-reload in polling mode
- Block words filtering (global and per-source)
- Inline status line during fetch and wait
pip install lxml requests gtts pydub pasimple langdetect pyyaml screeninfo python-bidiOptional: pip install google-genai (Gemini TTS), pip install piper-tts (offline TTS)
System: playerctl (media pause/resume)