Skip to content

Repository files navigation

Speak11 icon

Speak11

Select text in any app, press /, hear it read aloud.
Cloud TTS via ElevenLabs, or local TTS via Kokoro (Apple Silicon).
Runs in your menu bar.

License: Unlicense macOS 13+


Requirements

  • macOS Ventura (13) or later
  • Cloud TTS: a free ElevenLabs account and API key
  • Local TTS: Apple Silicon (M1 or later) — Python is downloaded automatically if needed

Installation

  1. Download the latest release and unzip it
  2. Double-click install.command
  3. Click Continue, then choose your backend: ElevenLabs Only, Both (recommended), or Local Only (Apple Silicon only)
  4. Paste your API key if prompted
  5. Click Install when prompted about the settings app — this adds the menu bar icon and registers ⌥⇧/ as a global hotkey

Choosing Both or Local Only on Apple Silicon installs mlx-audio + Kokoro for free offline TTS.

Getting your API key: sign in at elevenlabs.io → click your profile icon → Profile + API Key → create or copy a key. The key needs the Text-to-Speech and User Read permissions enabled (User Read lets the menu bar show your remaining credits).

Local TTS note: if no Python 3.10+ is found on your system, a standalone Python (~17 MB) is downloaded automatically. The Kokoro voice model (~350 MB) is also downloaded during installation.

First use

Once installed, the waveform icon appears in your menu bar. On first launch the app will ask for Accessibility permission — click Allow so it can register the global hotkey.

  • Select any text in any app → press ⌥⇧/ → audio plays
  • Press ⌥⇧/ again while audio is playing → stops immediately
  • No selection handy? Use Speak Clipboard in the menu bar to read whatever you last copied

The waveform icon pulses while audio is being generated and played, so you always know it's working.

Your clipboard is left untouched. Speak11 copies the selection, reads it, then puts your previous clipboard contents back — turn this off with Preserve Clipboard if you'd rather keep the copied text.

Text copied from PDFs, LaTeX documents, and Markdown files is automatically cleaned up before reading -- math equations, SI units, Greek letters, citations, and formatting artifacts are converted to natural spoken language.

Your API key is stored in your macOS Keychain — never written to a file.

Settings

Click the waveform icon in the menu bar. The menu adapts to your setup — you only see settings that apply. Use the Backend submenu to switch between Auto (cloud + local fallback), ElevenLabs (cloud only), and Local (offline only).

ElevenLabs settings

Setting Options
Voice Popular presets or a custom voice ID
Model v3 · Flash v2.5 · Turbo v2.5 · Multilingual v2
Speed 0.7× to 1.2×
Stability 0.0 (expressive) to 1.0 (steady) — controls pitch and pacing variation
Similarity 0.0 (low) to 1.0 (high) — how closely output matches the original voice
Style 0.0 (none) to 1.0 (max) — amplifies the voice's characteristic delivery; adds latency
Speaker Boost On / Off — subtle enhancement to voice similarity

Local (Kokoro) settings

Setting Options
Voice 12 curated English voices (American and British)
Speed 0.5× to 2×

Playback settings

Setting Options
Sentence Pause Milliseconds of silence between sentences (default 400ms). Scales inversely with speed -- at 2× speed, a 400ms pause becomes 200ms. Click the menu item and type any value; set to 0 for no pause.

General settings

Setting Options
Preserve Clipboard On (default) / Off — restore your previous clipboard after speaking a selection, so the hotkey never clobbers what you copied
Launch at Login On / Off — start Speak11 automatically. macOS asks for Automation permission the first time you toggle this.

Settings take effect immediately — no restart needed.

ElevenLabs voices

Name Style
Lily British, raspy
Alice British, confident
Rachel Calm
Adam Deep
Domi Strong
Josh Young, deep
Sam Raspy

You can also enter any voice ID from the ElevenLabs Voice Library via Voice → Custom voice ID… in the menu.

Kokoro voices

Name Style
Lily British, bright (default)
Heart Warm
Bella Soft
Nova Confident
Sarah Gentle
Sky Bright
Adam Deep
Echo Clear
Eric Steady
Michael Warm
Emma British, warm
George British, deep

Uninstall

Double-click uninstall.command — it removes everything including the Accessibility permission, login item, API key, and app bundle.

Troubleshooting

Symptom Fix
⌥⇧/ does nothing Grant Accessibility permission when prompted, or check System Settings → Privacy & Security → Accessibility
Waveform icon not in menu bar Open ~/Applications/Speak11.app manually, or re-run install.command
HTTP 401 API key is wrong or expired — run install.command again
HTTP 429 Monthly character quota exceeded — if both backends are installed, the app automatically falls back to local TTS. On Apple Silicon with ElevenLabs only, it will offer to install local TTS as a free alternative
"python3 not found" Run xcode-select --install in Terminal
Settings app fails to compile Check ~/.local/share/speak11/install.log for the error. Usually fixed by updating Command Line Tools: sudo rm -rf /Library/Developer/CommandLineTools && xcode-select --install
Local TTS is slow Check ~/.local/share/speak11/tts.log for errors. The TTS daemon keeps the model loaded and warmed up in memory so requests are near-instant
Audio playback issues Set SPEAK11_NO_QUEUE_PLAYER=1 to fall back to afplay (slower but simpler). If that fixes it, the issue is with the audio queue player — re-run install.command to rebuild it

Cost

ElevenLabs: the free tier includes a monthly character allowance — usually sufficient for casual read-aloud use. Paid plans start at $5/month. See elevenlabs.io/pricing.

Local (Kokoro): completely free. Runs on your Mac with no API calls or credits. Requires Apple Silicon and a one-time ~350 MB model download.

License

Unlicense — public domain. Created by Stefano Martiniani.


Advanced

Config file

Settings are saved to ~/.config/speak11/config. You can edit this file directly:

TTS_BACKEND="auto"
TTS_BACKENDS_INSTALLED="both"
VOICE_ID="pFZP5JQG7iQjIQuC4Bku"
MODEL_ID="eleven_flash_v2_5"
STABILITY="0.50"
SIMILARITY_BOOST="0.75"
STYLE="0.00"
USE_SPEAKER_BOOST="true"
SPEED="1.00"
LOCAL_VOICE="bf_lily"
LOCAL_SPEED="1.00"
SENTENCE_PAUSE="400"
PRESERVE_CLIPBOARD="true"
LAUNCH_AT_LOGIN="false"

PRESERVE_CLIPBOARD and LAUNCH_AT_LOGIN are read by the menu bar app only; speak.sh ignores them.

Environment variables

Environment variables take highest priority and override both the config file and the settings app:

export ELEVENLABS_API_KEY="your-api-key"       # overrides Keychain
export ELEVENLABS_VOICE_ID="your-voice-id"
export ELEVENLABS_MODEL_ID="eleven_multilingual_v2"
export TTS_BACKEND="local"                     # "auto" (default), "elevenlabs", or "local"
export SPEED="1.10"                            # ElevenLabs speed (0.7 to 1.2)
export STABILITY="0.50"                        # 0.0 (expressive) to 1.0 (steady)
export SIMILARITY_BOOST="0.75"                 # 0.0 to 1.0
export STYLE="0.00"                            # 0.0 to 1.0 (adds latency)
export USE_SPEAKER_BOOST="true"                # "true" or "false"
export LOCAL_VOICE="am_adam"                   # Kokoro voice ID
export LOCAL_SPEED="1.25"                      # 0.5 to 2.0
export SENTENCE_PAUSE="400"                    # inter-sentence pause (ms at 1× speed, default 400)
export SPEAK11_IDLE_TIMEOUT="600"              # daemon idle shutdown (seconds, default 300)

Debug variables (not needed for normal use):

export SPEAK11_TRACE=1                         # print timing trace to stderr
export SPEAK11_NO_QUEUE_PLAYER=1               # fall back to afplay (one process per sentence)
export VENV_PYTHON="/path/to/python3"          # override the default venv Python

Voice IDs

Name ID
Lily pFZP5JQG7iQjIQuC4Bku
Alice Xb7hH8MSUJpSbSDYk0k2
Rachel 21m00Tcm4TlvDq8ikWAM
Adam pNInz6obpgDQGcFmaJgB
Domi AZnzlk1XvdvUeBnXmlld
Josh TxGEqnHWrfWFTfGW9XjX
Sam yoZ06aMxZJJ28mfd3POQ

Accessibility permission

The global hotkey requires Accessibility access. The app prompts for this on first launch, but if you need to grant it manually:

System Settings → Privacy & Security → Accessibility → enable Speak11

The hotkey activates automatically once access is granted.

Electron apps (Beeper, Slack, VS Code, etc.)

Electron apps intercept keyboard shortcuts before macOS Services sees them. The settings app solves this by registering ⌥⇧/ as a global hotkey via CoreGraphics — it works at the system level and cannot be blocked by any app.

The settings app simulates ⌘C via CGEvent to copy the current selection before calling the TTS script, so the hotkey works everywhere — including apps that don't support macOS Services.

Optional: Services shortcut

The installer also creates a macOS Services action you can bind to any shortcut. This is optional — ⌥⇧/ already works everywhere — but useful if you prefer a different key combination.

  1. System Settings → Keyboard → Keyboard Shortcuts → Services → Text
  2. Find Speak Selection and assign a shortcut — e.g. ⌃⌥S

Speak Selection not in the list? Log out and back in, or trigger via right-click → Services.

TTS daemon

Local TTS uses a persistent daemon (tts_server.py) that keeps the Kokoro model loaded in memory. When the menu bar app is running, it manages the daemon directly -- the daemon stays alive as long as the app is open. If you run speak.sh from the terminal without the app, the daemon starts on first request and shuts down after 5 minutes of inactivity.

Logs are written to ~/.local/share/speak11/tts.log. Installer errors (pip, swiftc) go to ~/.local/share/speak11/install.log.

Updating

Re-run install.command to update the scripts and app to the latest version.

To update your API key, run install.command again — or update it directly:

security add-generic-password \
  -a "speak11" \
  -s "speak11-api-key" \
  -w "your-new-key" \
  -U

About

Select text in any app, press ⌥⇧/, hear it read aloud. Cloud TTS via ElevenLabs or local Kokoro. macOS menu bar app.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages