skills/read-aloud/SKILL.md
Read markdown files, text files, or any document aloud using high-quality neural text-to-speech. Use this skill whenever the user asks to "read this aloud", "read this to me", "text to speech", "say this", "listen to this file", "convert to audio", "play this document", or wants to hear any text or file spoken. Also trigger when the user asks to generate an audio version of a document, wants to review content by listening, or mentions TTS. Zero configuration — auto-installs Kokoro TTS and downloads models on first run. Works on macOS and Linux with no API keys needed. Everything runs locally.
npx skillsauth add agairola/life-skills read-aloudInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read any markdown or text file aloud using Kokoro TTS. Zero config — auto-installs on first use, no API keys, runs entirely locally.
npx skills add agairola/life-skills --skill read-aloud
Trigger this skill when the user:
brew install uv (macOS) or pip install uv (all platforms)uv tool install kokoro-tts~/.config/read-aloud/models/)uv run.!command -v uv > /dev/null 2>&1 && echo "uv: installed" || echo "uv: NOT INSTALLED — run: brew install uv"
!command -v kokoro-tts > /dev/null 2>&1 && echo "kokoro-tts: installed" || echo "kokoro-tts: not installed (will auto-install on first use)"
!test -f ~/.config/read-aloud/models/kokoro-v1.0.onnx && echo "models: downloaded" || echo "models: not yet downloaded (will auto-download on first use, ~335MB)"
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" <INPUT> [OPTIONS]
| Flag | Values | Default | Purpose |
|------|--------|---------|---------|
| input | file path or - | required | Path to .md or .txt file, or - for stdin |
| --voice | see voice list | af_heart | Voice to use |
| --speed | float | 1.0 | Speech speed (0.5 = slow, 1.5 = fast) |
| --output | file path | (plays audio) | Save to .wav file instead of playing |
| --max-lines | integer | 0 (all) | Only read the first N lines |
| --max-time | integer | 0 (no limit) | Stop playback after N seconds |
| --no-play | flag | off | Generate .wav without playing (use with --output) |
| --list-voices | flag | — | Print available voices as JSON and exit |
Only parse stdout (JSON). Stderr contains progress messages and diagnostics only.
# Read a markdown file aloud
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/document.md
# Use a male voice
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/notes.md --voice am_adam
# Read faster
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/doc.md --speed 1.3
# Save to file instead of playing
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/doc.md --output ~/Desktop/speech.wav
# Read just the first 10 lines
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/doc.md --max-lines 10
# Stop after 60 seconds
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" /path/to/doc.md --max-time 60
# Read from stdin
echo "Hello, this is a test" | uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" -
# List available voices
uv run "${CLAUDE_SKILL_DIR}/scripts/read_aloud.py" --list-voices
The default mode streams audio — playback starts within seconds even for large files. Confirm and offer follow-up:
Reading "document.md" aloud (Heart voice, 1.0x speed).
Want me to:
- Read it again with a different voice?
- Save it as a .wav file? (use --output)
- Read a specific section?
When the user explicitly asks to save audio (using --output):
Saved audio to ~/Desktop/speech.wav (Heart voice, 1.0x speed, ~45 seconds).
On first use, the setup takes 1-2 minutes (installing kokoro-tts + downloading ~335MB of models). Let the user know:
Setting up text-to-speech for the first time (downloading voice models, ~335MB). This only happens once.
After the first run, subsequent reads start in seconds.
--output to save the file and tell the user where to find it.| Voice ID | Name | Gender |
|----------|------|--------|
| af_alloy | Alloy | Female |
| af_aoede | Aoede | Female |
| af_bella | Bella | Female |
| af_heart | Heart (default) | Female |
| af_jessica | Jessica | Female |
| af_kore | Kore | Female |
| af_nicole | Nicole | Female |
| af_nova | Nova | Female |
| af_river | River | Female |
| af_sarah | Sarah | Female |
| af_sky | Sky | Female |
| am_adam | Adam | Male |
| am_michael | Michael | Male |
| Voice ID | Name | Gender |
|----------|------|--------|
| bf_emma | Emma | Female |
| bf_isabella | Isabella | Female |
| bm_george | George | Male |
| bm_lewis | Lewis | Male |
content-media
Extract transcripts from YouTube videos. Use when the user asks for a transcript, subtitles, or captions of a YouTube video and provides a YouTube URL (youtube.com/watch?v=, youtu.be/, or similar). Supports output with or without timestamps.
development
Check the current UV index and sun safety advice for Australian cities. Use this skill when the user asks about UV index, sunscreen, sun protection, sunburn risk, whether it's safe to be outside in the sun, SPF recommendation, or sun safety for any Australian city. Works with zero configuration — no API keys needed.
development
Check live traffic incidents, roadworks, and hazards in Sydney. Use this skill when the user asks about traffic jams, road closures, accidents, roadworks, traffic conditions, how the traffic is, M5 traffic, highway conditions, or any Sydney traffic question. Works without API keys (provides Live Traffic NSW/Google Maps links) but best with a free TfNSW API key for real-time incident data.
development
Check Sydney toll road prices and calculate route toll costs. Use this skill when the user asks about toll prices, toll costs, how much the toll is, M2 toll, harbour bridge toll, tunnel toll, cheapest route, toll calculator, E-Tag, Linkt, or any Sydney toll road question. Works with zero configuration — no API keys needed.