Monorepo for Aesthetic.Computer
aesthetic.computer
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