Send native iMessage voice bubbles with ElevenLabs TTS via BlueBubbles. Use when: user asks to send a voice message, wants something spoken aloud, storytelling or summaries requested, or voice delivery would be more engaging than text. Requires ElevenLabs API key and BlueBubbles.
Send native iMessage voice bubbles (not file attachments) using ElevenLabs TTS and BlueBubbles.
Run the script with text and recipient:
scripts/send-voice-memo.sh "Your message here" +14169060839
This will:
afconvert audio conversion)~/.openclaw/.env:
ELEVENLABS_API_KEY=your-key-here
BLUEBUBBLES_PASSWORD=your-password-here
# Optional overrides:
ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM # Rachel (default)
ELEVENLABS_MODEL_ID=eleven_turbo_v2_5 # Turbo v2.5 (default)
Critical parameters discovered 2026-02-19:
| Parameter | Value | Why |
|---|---|---|
| chatGuid | any;-;+PHONE | NOT iMessage;-; (causes timeouts) |
| method | private-api | Required for native bubble |
| isAudioMessage | true | Required |
| Audio format | Opus @ 24kHz in CAF | iMessage native format |
| Pre-convert | Yes | Don't let BlueBubbles convert (wrong codec) |
Default voice: Rachel (ElevenLabs)
21m00Tcm4TlvDq8ikWAMeleven_turbo_v2_5 (fast, natural)Expressive tags:
[laughs] — natural laughter[sighs] — expressive sigh[excited] — energetic deliveryExample: "[excited] Oh my god, it worked!"
For full voice list and IDs, see VOICES.md.
Sending (Amz → Amy): Use this skill. Native voice bubbles appear with waveform UI.
Receiving (Amy → Amz): BlueBubbles auto-converts incoming voice memos to MP3. OpenClaw transcribes via Whisper. Transcribed text flows into conversation context automatically.
Memory note: Incoming voice memo transcriptions flow into conversation context like any text message. They are NOT automatically persisted to memory or files — the agent must explicitly choose to store them, same as any conversation content. If you want to prevent transcriptions from being retained, instruct the agent not to record voice memo content in memory.
Voice bubble arrives as file attachment:
method=private-api is setany;-; prefix (not iMessage;-;)"isAudioMessage": trueAPI times out:
any;-;+PHONE format for chatGuidAudio is 0 seconds / unplayable:
afinfo output.caf (should show opus @ 24000 Hz)