#!/bin/zsh
# speak: read text aloud. Usage: speak "text" | echo "text" | speak
# Engine: ElevenLabs if a key is present (~/.config/speak/elevenlabs.key or $ELEVENLABS_API_KEY), else macOS voice.
OUTFILE=""; if [ "$1" = "--out" ]; then OUTFILE="$2"; shift 2; fi
TEXT="$1"
if [ -z "$TEXT" ] && [ ! -t 0 ]; then TEXT="$(cat)"; fi
[ -z "$TEXT" ] && { echo "speak: nothing to say" >&2; exit 1; }
TEXT="$(python3 - "$TEXT" << 'PY'
import re, sys
t = sys.argv[1]
t = re.sub(r"```.*?```", " code block omitted. ", t, flags=re.S)
t = re.sub(r"`([^`]*)`", r"\1", t)
t = re.sub(r"\[([^\]]+)\]\([^)]*\)", r"\1", t)
t = re.sub(r"^\s*\|?\s*-{3,}.*$", "", t, flags=re.M)
t = re.sub(r"\|", ", ", t)
t = re.sub(r"^#{1,6}\s*", "", t, flags=re.M)
t = re.sub(r"[*_]{1,3}([^*_]+)[*_]{1,3}", r"\1", t)
t = re.sub(r"^\s*[-*+]\s+", "", t, flags=re.M)
t = re.sub(r"^\s*\d+\.\s+", "", t, flags=re.M)
t = re.sub(r"[ \t]+", " ", t); t = re.sub(r"\n{2,}", "\n", t)
print(t.strip())
PY
)"
KEY="${ELEVENLABS_API_KEY:-}"; [ -z "$KEY" ] && [ -f "$HOME/.config/speak/elevenlabs.key" ] && KEY="$(tr -d '[:space:]' < "$HOME/.config/speak/elevenlabs.key")"
if [ -n "$KEY" ]; then
  VID="${ELEVENLABS_VOICE_ID:-}"; [ -z "$VID" ] && [ -f "$HOME/.config/speak/voice_id" ] && VID="$(tr -d '[:space:]' < "$HOME/.config/speak/voice_id")"
  VID="${VID:-JBFqnCBsd6RMkjVDRZzb}"   # ElevenLabs premade "George". Override with ~/.config/speak/voice_id
  python3 - "$TEXT" << 'PY' | while IFS= read -r CHUNK; do
import sys, re
t=sys.argv[1]; parts=[]; cur=""
for s in re.split(r"(?<=[.!?])\s+", t):
    if len(cur)+len(s) > 4000 and cur: parts.append(cur); cur=""
    cur += s + " "
if cur.strip(): parts.append(cur)
for p in parts: print(p.replace("\n"," ").strip())
PY
    OUT="$(mktemp /tmp/speak.XXXXXX).mp3"
    BODY="$(python3 -c 'import json,sys;print(json.dumps({"text":sys.argv[1],"model_id":"eleven_turbo_v2_5"}))' "$CHUNK")"
    if curl -sf -X POST "https://api.elevenlabs.io/v1/text-to-speech/$VID" -H "xi-api-key: $KEY" -H "Content-Type: application/json" -d "$BODY" -o "$OUT"; then
      if [ -n "$OUTFILE" ]; then cat "$OUT" >> "$OUTFILE"; else afplay "$OUT"; fi
    else echo "speak: ElevenLabs request failed, using macOS voice" >&2; say -v "${SPEAK_VOICE:-Daniel}" -r 180 "$CHUNK"; fi
    rm -f "$OUT"
  done
  exit 0
fi
if [ -n "$OUTFILE" ]; then say -v "${SPEAK_VOICE:-Daniel}" -r 180 -o "${OUTFILE%.mp3}.aiff" "$TEXT"; else say -v "${SPEAK_VOICE:-Daniel}" -r 180 "$TEXT"; fi
