Monorepo for Aesthetic.Computer aesthetic.computer

ac-talk: TTS command that speaks on the Docker host machine

SSHs to the Docker host (172.17.0.1) and runs flite or espeak-ng
for text-to-speech. Useful for build notifications and alerts
from inside devcontainers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+59
+59
fedac/native/ac-talk
··· 1 + #!/bin/bash 2 + # ac-talk — Speak text on the Docker host machine via TTS 3 + # Usage: ac-talk "Hello world" 4 + # ac-talk -v espeak "Hello world" 5 + # echo "build done" | ac-talk 6 + 7 + DOCKER_HOST_IP="${AC_HOST_IP:-172.17.0.1}" 8 + SSH_USER="${AC_HOST_USER:-me}" 9 + VOICE="${VOICE:-flite}" 10 + 11 + # Parse flags 12 + while [ $# -gt 0 ]; do 13 + case "$1" in 14 + -v|--voice) VOICE="$2"; shift 2 ;; 15 + -h|--help) 16 + echo "Usage: ac-talk [-v flite|espeak] \"text to speak\"" 17 + echo " echo \"text\" | ac-talk" 18 + echo "" 19 + echo "Speaks text on the Docker host machine." 20 + echo "Env: AC_HOST_IP (default: 172.17.0.1)" 21 + echo " AC_HOST_USER (default: me)" 22 + echo " VOICE (default: flite)" 23 + exit 0 ;; 24 + --) shift; break ;; 25 + -*) echo "Unknown flag: $1" >&2; exit 1 ;; 26 + *) break ;; 27 + esac 28 + done 29 + 30 + # Get text from args or stdin 31 + TEXT="$*" 32 + if [ -z "${TEXT}" ]; then 33 + TEXT=$(cat) 34 + fi 35 + 36 + if [ -z "${TEXT}" ]; then 37 + echo "ac-talk: no text provided" >&2 38 + exit 1 39 + fi 40 + 41 + # Escape single quotes for remote shell 42 + ESCAPED=$(printf '%s' "${TEXT}" | sed "s/'/'\\\\''/g") 43 + 44 + case "${VOICE}" in 45 + espeak|espeak-ng) 46 + CMD="espeak-ng '${ESCAPED}' 2>/dev/null || espeak '${ESCAPED}' 2>/dev/null" 47 + ;; 48 + flite|*) 49 + CMD="flite -t '${ESCAPED}' 2>/dev/null" 50 + ;; 51 + esac 52 + 53 + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -o LogLevel=ERROR \ 54 + "${SSH_USER}@${DOCKER_HOST_IP}" "${CMD}" 2>/dev/null 55 + 56 + if [ $? -ne 0 ]; then 57 + echo "ac-talk: failed to reach host at ${DOCKER_HOST_IP}" >&2 58 + exit 1 59 + fi