Announcer
Play TTS announcements through AirPlay speakers via Airfoil and ElevenLabs.
How It Works
- Generate speech via ElevenLabs (high-quality opus → stereo MP3)
- Connect to AirPlay speakers via Airfoil
- Play an optional chime (gong) followed by the announcement
- Disconnect speakers after playback
Requirements
- Airfoil (Rogue Amoeba) — running on the host Mac
- ElevenLabs API key — set
ELEVENLABS_API_KEYenv var - ffmpeg — for audio format conversion
- elevenlabs skill — sibling skill for TTS generation
Configuration
User config lives at ~/clawd/announcer/config.json:
{
"speakers": ["Living (2)", "Kitchen", "Office"],
"excluded": ["Computer"],
"elevenlabs": {
"voice_id": "your-voice-id",
"format": "opus_48000_192"
},
"audio": {
"output_format": "mp3",
"stereo": true,
"sample_rate": 48000,
"bitrate": "256k",
"chime_file": "gong_stereo.mp3"
},
"airfoil": {
"source": "System-Wide Audio",
"connection_timeout_seconds": 30,
"volume": 0.7
}
}
Config Fields
| Field | Description |
|-------|-------------|
| speakers | AirPlay speaker names to connect |
| excluded | Speaker names to never connect |
| elevenlabs.voice_id | ElevenLabs voice to use |
| audio.chime_file | Chime sound file in assets/ (set null to disable) |
| airfoil.connection_timeout_seconds | Time to wait for speakers to connect |
| airfoil.volume | Speaker volume (0.0–1.0) |
Usage
# Announce to all configured speakers
python3 skills/announcer/scripts/announce.py "Dinner is ready!"
# Announce to specific speakers only
python3 skills/announcer/scripts/announce.py "Wake up!" --speakers "Kids Room"
# Skip the chime
python3 skills/announcer/scripts/announce.py "Quick note" --no-gong
File Structure
announcer/
├── SKILL.md
├── assets/
│ └── gong_stereo.mp3 # Announcement chime
└── scripts/
└── announce.py # Main announcement script
User config (not part of skill):
~/clawd/announcer/
└── config.json # Speaker list, voice, audio settings
微信扫一扫