A CLI that reads text aloud using piper-tts. Uses the en_US-kristin-medium voice by default (auto-downloaded on first run).
- Multiple input sources — text argument, file (
-f), clipboard (-c), or stdin - Pipe-friendly — reads from stdin, works anywhere in a shell pipeline
- Interactive mode — conversational TTS with
/replay,/help,/clear, tab completion, and history - Adjustable speech — control speed (
-s), volume (-v), and sentence silence (--silence) - Voice management — download, list, and switch voices (
reed download,reed voices,-m) - Swappable voices — use any piper-tts
.onnxmodel with-m - WAV export — save output to file with
-oinstead of playing - Rich terminal UI — styled output with progress indicators and error panels
- Python 3.14+
- macOS or Linux
- macOS:
afplay(audio),pbpaste(clipboard) — included with the OS - Linux: one of
paplay,aplay, orffplay(audio); one ofwl-paste,xclip, orxsel(clipboard)
- macOS:
- uv (for dependency management)
- Rich library for beautiful terminal UI
With Homebrew (macOS/Linux)
brew install azisk/reed/reedWith Scoop (Windows)
scoop bucket add reed https://github.com/AzisK/scoop-reed
scoop install reedWith uv (recommended)
uv tool install reedyWith pipx
pipx install reedypip install reedygit clone https://github.com/azisk/reed.git
cd reed
uv venv
uv pip install -e .Voices are stored in ~/.local/share/reed/ (Linux/macOS, respects XDG_DATA_HOME) or %LOCALAPPDATA%\reed\ (Windows).
The default voice (en_US-kristin-medium) is auto-downloaded on first run.
# Download a voice
reed download en_US-amy-medium
# List installed voices
reed voices
# Use a specific voice by name
reed -m en_US-amy-medium 'Hello world'
# Or use a custom .onnx file by path
reed -m /path/to/custom-voice.onnx 'Hello world'All voice models are hosted on Hugging Face: https://huggingface.co/rhasspy/piper-voices/tree/main
# Read text directly
reed 'Hello, I will read this for you'
# Read from a file
reed -f article.txt
# Read from clipboard
reed -c
# Add longer silence between sentences (in seconds) while the default is 0.6 seconds
reed --silence 1 'First sentence. Second sentence. Bye bye.'
# Interactive mode (launches automatically when no input is provided)
reed
# Interactive mode with longer silence (1 s) between sentences
reed --silence 1
# Save to WAV file instead of playing
reed -o output.wav 'Save this'
# Play a saved WAV file
afplay output.wav
# Adjust speed (lower = slower) and volume
reed -s 0.8 -v 1.5 'Slower and louder'
# Combine speed, volume, and silence
reed -s 0.7 -v 1.3 --silence 0.3 -f long_article.txt# Read from a file (alternative)
cat article.txt | reed
# Read from echo
echo 'Done, done' | reed
# Read from clipboard (alternative)
pbpaste | reed
# Read files in a directory
ls -1 | reed
# Read .txt files in a directory recursively
find . -name "*.txt" | reed
# Read the information about the disk usage
df -h | reed
# Save piped text to WAV and play it
echo "Notification" | reed -o /tmp/notify.wav && afplay /tmp/notify.wav
# Read git log
git log --oneline -5 | reed
# Read the content of a webpage, requires soffice (LibreOffice CLI)
# It can be found in the LibreOffice app directory and you can add an alias to it
# alias soffice='/Applications/LibreOffice.app/Contents/MacOS/soffice' inside `~/.zprofile` (~/.zshrc, ~/.bashrc etc.)
curl -s https://example.com -o /tmp/page.html && \
soffice --headless --convert-to txt /tmp/page.html --outdir /tmp && \
reed -f /tmp/page.txtWhen launched with no arguments, reed enters interactive mode. Type or paste text and press Enter to hear it read aloud.
- Type text and press Enter to hear it
- Type
/quitor/exitto stop - Available commands in interactive mode:
/help,/clear,/replay - Press
Ctrl-Dfor EOF to exit
| Flag | Description | Default |
|---|---|---|
-f, --file |
Read text from a file | — |
-c, --clipboard |
Read text from clipboard | — |
-m, --model |
Voice name or path to voice model | en_US-kristin-medium |
-s, --speed |
Speech speed (lower = slower) | 1.0 |
-v, --volume |
Volume multiplier | 1.0 |
-o, --output |
Save to WAV file instead of playing | — |
--silence |
Seconds of silence between sentences | 0.6 |