When the remote Chatterbox TTS service (SPEECH_SYNTHESIS_URL, e.g. apricot)
is unreachable, synthesize() now fails over to local macOS `say` so spoken
notifications keep working without the GPU host or mesh link.
- Extract playback into playAudioFile() helper (DRY: primary + fallback reuse)
- speakFallback() generates AIFF via `say`, strips [tag]s, plays locally
- Failover only on network errors; real synthesis failures still surface
- Configurable: SPEECH_FALLBACK(=off), SPEECH_FALLBACK_VOICE/_RATE,
SPEECH_PRIMARY_ATTEMPTS (retries before failover, default 10)
- ready_check reports local-fallback availability when remote is down
- Bump 1.0.1 -> 1.1.0
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>