sag — Claude Code skill: ElevenLabs TTS with macOS say UX
A skill that turns text into speech through ElevenLabs right from the terminal. The UX copies macOS say, so the learning curve is close to zero.
npx skills add openclaw/openclaw --skill sag -a claude-codeWhat sag does
sag is a CLI wrapper over ElevenLabs Text-to-Speech. Its interface mirrors the macOS say command: sag "Hello there" generates audio and plays it locally.
The binary installs via Homebrew from the steipete/tap/sag tap. You need an ElevenLabs API key, set as ELEVENLABS_API_KEY or SAG_API_KEY. A key file works too via --api-key-file.
The skill knows three ElevenLabs models: eleven_v3 as the expressive default, eleven_multilingual_v2 for stability, and eleven_flash_v2_5 for speed. sag voices lists available voices and sag prompting shows model-specific tips.
Voice character comes from audio tags placed at the start of a line: [whispers], [shouts], [sings], [excited], [crying], and more. For v3, pauses use [pause], [short pause], [long pause] because SSML `` is not supported. When the user asks for a voice reply, the skill generates an mp3 and sends it to the chat.
Install it if you already use ElevenLabs and want the agent to speak. If voice output is not part of your workflow, this is just an extra dependency and an API key to manage.
What it helps with
- Speak text from the terminal with one command
- Generate a voice reply from the agent and send an mp3 to chat
- Pick a voice and model for the task
- Add emotion and pauses to speech with tags
- Normalize pronunciation of numbers, units, and URLs
Example prompts for the agent
- Speak: "Hello, this is a test message"
- Generate a voice reply with the Clawd voice and send the mp3
- Show the available voices
How to install sag
1Skills CLI (Vercel)
npx skills add openclaw/openclaw --skill sag -a claude-code2Manually: put the files in place
~/.claude/skills/sag/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/sag/
1Skills CLI (Vercel)
npx skills add openclaw/openclaw --skill sag -a codex2Manually: put the files in place
.agents/skills/sag/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add openclaw/openclaw --skill sag -a cursor2Manually: put the files in place
.cursor/skills/sag/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install openclaw/openclaw sag2Manually: put the files in place
.github/skills/sag/SKILL.md1Skills CLI (Vercel)
npx skills add openclaw/openclaw --skill sag -a gemini-cli2Platform CLI
gemini skills install https://github.com/openclaw/openclaw --path skills/sagManually: put the files in place
.devin/skills/sag/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add openclaw/openclaw --skill sag -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set48
The whole set →Similar
Questions about sag
How do I install sag in Claude Code?
Run npx skills add openclaw/openclaw --skill sag -a claude-code. The binary itself is installed separately with brew install steipete/tap/sag.
What does sag do?
It converts text to speech via ElevenLabs TTS with local playback. sag "text" generates and plays audio, while -o saves it as an mp3 file.
Which API key does sag require?
An ElevenLabs key. Set it as ELEVENLABS_API_KEY or SAG_API_KEY. A key file via --api-key-file is also supported.
Source text
SKILL.md · MIT
---
name: sag
description: "ElevenLabs text-to-speech with mac-style say UX."
homepage: https://sag.sh
metadata:
{
"openclaw":
{
"emoji": "🔊",
"requires": { "bins": ["sag"] },
"primaryEnv": "ELEVENLABS_API_KEY",
"install":
[
{
"id": "brew",
"kind": "brew",
"formula": "steipete/tap/sag",
"bins": ["sag"],
"label": "Install sag (brew)",
},
],
},
}
---
# sag
Use `sag` for ElevenLabs TTS with local playback.
API key (required)
- `ELEVENLABS_API_KEY` (preferred)
- `SAG_API_KEY` also supported by the CLI
- Key file via `--api-key-file`, `ELEVENLABS_API_KEY_FILE`, or `SAG_API_KEY_FILE`
Quick start
- `sag "Hello there"`
- `sag speak -v "Roger" "Hello"`
- `sag voices`
- `sag prompting` (model-specific tips)
Model notes
- Default: `eleven_v3` (expressive)
- Stable: `eleven_multilingual_v2`
- Fast: `eleven_flash_v2_5`
Pronunciation + delivery rules
- First fix: respell (e.g. "key-note"), add hyphens, adjust casing.
- Numbers/units/URLs: `--normalize auto` (or `off` if it harms names).
- Language bias: `--lang en|de|fr|...` to guide normalization.
- v3: SSML `<break>` not supported; use `[pause]`, `[short pause]`, `[long pause]`.
- v2/v2.5: SSML `<break time="1.5s" />` supported; `<phoneme>` not exposed in `sag`.
v3 audio tags (put at the entrance of a line)
- `[whispers]`, `[shouts]`, `[sings]`
- `[laughs]`, `[starts laughing]`, `[sighs]`, `[exhales]`
- `[sarcastic]`, `[curious]`, `[excited]`, `[crying]`, `[mischievously]`
- Example: `sag "[whispers] keep this quiet. [short pause] ok?"`
Voice defaults
- `ELEVENLABS_VOICE_ID` or `SAG_VOICE_ID`
Confirm voice + speaker before long output.
## Chat voice responses
When the user asks for a "voice" reply (e.g., "crazy scientist voice", "explain in voice"), generate audio and send it:
```bash
# Generate audio file
sag -v Clawd -o /tmp/voice-reply.mp3 "Your message here"
# Then include in reply:
# MEDIA:/tmp/voice-reply.mp3
```
Voice character tips:
- Crazy scientist: Use `[excited]` tags, dramatic pauses `[short pause]`, vary intensity
- Calm: Use `[whispers]` or slower pacing
- Dramatic: Use `[sings]` or `[shouts]` sparingly
Default voice for Clawd: `lj2rcrvANS3gaWWnczSX` (or just `-v Clawd`)
© openclaw · MIT · openclaw/openclaw