Monorepo for Aesthetic.Computer aesthetic.computer
at main 59 lines 1.6 kB view raw
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 7DOCKER_HOST_IP="${AC_HOST_IP:-172.17.0.1}" 8SSH_USER="${AC_HOST_USER:-me}" 9VOICE="${VOICE:-flite}" 10 11# Parse flags 12while [ $# -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 28done 29 30# Get text from args or stdin 31TEXT="$*" 32if [ -z "${TEXT}" ]; then 33 TEXT=$(cat) 34fi 35 36if [ -z "${TEXT}" ]; then 37 echo "ac-talk: no text provided" >&2 38 exit 1 39fi 40 41# Escape single quotes for remote shell 42ESCAPED=$(printf '%s' "${TEXT}" | sed "s/'/'\\\\''/g") 43 44case "${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 ;; 51esac 52 53ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -o LogLevel=ERROR \ 54 "${SSH_USER}@${DOCKER_HOST_IP}" "${CMD}" 2>/dev/null 55 56if [ $? -ne 0 ]; then 57 echo "ac-talk: failed to reach host at ${DOCKER_HOST_IP}" >&2 58 exit 1 59fi