Back to Skills
    šŸ¦ž

    announcer

    Announce text throughout the house via AirPlay speakers using Airfoil +.

    By @odrobnik
    View on GitHub
    SKILL.md
    ---
    name: announcer
    description: "Announce text throughout the house via AirPlay speakers using Airfoil + ElevenLabs TTS."
    summary: "House-wide TTS announcements via AirPlay speakers, Airfoil, and ElevenLabs."
    version: 1.1.2
    homepage: https://github.com/odrobnik/announcer-skill
    metadata:
      {
        "openclaw":
          {
            "emoji": "šŸ“¢",
            "requires": { "bins": ["python3", "ffmpeg"], "apps": ["Airfoil"], "env": ["ELEVENLABS_API_KEY"], "skills": ["elevenlabs"] },
          },
      }
    ---
    
    # Announcer
    
    Play TTS announcements through AirPlay speakers via Airfoil and ElevenLabs.
    
    ## How It Works
    
    1. Generate speech via ElevenLabs (high-quality opus → stereo MP3)
    2. Connect to AirPlay speakers via Airfoil
    3. Play an optional chime (gong) followed by the announcement
    4. Disconnect speakers after playback
    
    ## Requirements
    
    - **Airfoil** (Rogue Amoeba) — running on the host Mac
    - **ElevenLabs API key** — set `ELEVENLABS_API_KEY` env var
    - **ffmpeg** — for audio format conversion
    - **elevenlabs skill** — sibling skill for TTS generation
    
    ## Configuration
    
    User config lives at `~/clawd/announcer/config.json`:
    
    ```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
    
    ```bash
    # 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
    ```