94 lines
2.7 KiB
Bash
Executable File
94 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
BASE_DIR="/home/unitree/GoVoice"
|
|
PY_FILE="$BASE_DIR/Go2Voice.py"
|
|
|
|
SINK="alsa_output.usb-Anker_PowerConf_A3321-DEV-SN1-01.analog-stereo"
|
|
SOURCE="alsa_input.usb-Anker_PowerConf_A3321-DEV-SN1-01.mono-fallback"
|
|
|
|
WIFI_DEV="wlan0"
|
|
|
|
ts() { date "+[%b %d %H:%M:%S]"; }
|
|
|
|
echo "$(ts) 📁 Base dir: $BASE_DIR"
|
|
cd "$BASE_DIR"
|
|
|
|
# ============================================================
|
|
# 1) Always ensure default route via Wi-Fi (dynamic gateway)
|
|
# ============================================================
|
|
echo "$(ts) 🌐 Ensuring default route via $WIFI_DEV ..."
|
|
|
|
# Detect gateway for wlan0 if it exists in kernel routes
|
|
GW="$(ip -4 route show dev "$WIFI_DEV" 2>/dev/null | awk '/default via/ {print $3; exit}')"
|
|
|
|
# If no gateway line found, fallback to x.x.x.1 from wlan0 IP
|
|
if [[ -z "${GW:-}" ]]; then
|
|
WIFI_IP="$(ip -4 addr show dev "$WIFI_DEV" 2>/dev/null | awk '/inet /{print $2}' | cut -d/ -f1 | head -n1 || true)"
|
|
if [[ -n "${WIFI_IP:-}" ]]; then
|
|
GW="$(echo "$WIFI_IP" | awk -F. '{print $1"."$2"."$3".1"}')"
|
|
fi
|
|
fi
|
|
|
|
if [[ -z "${GW:-}" ]]; then
|
|
echo "$(ts) ⚠️ Could not detect Wi-Fi gateway (no IP on $WIFI_DEV?). Skipping route fix."
|
|
else
|
|
echo "$(ts) ✅ Using gateway: $GW"
|
|
|
|
# Remove any existing default route then add via wifi
|
|
sudo ip route del default 2>/dev/null || true
|
|
sudo ip route add default via "$GW" dev "$WIFI_DEV" 2>/dev/null || true
|
|
|
|
echo "$(ts) 📡 Current default route:"
|
|
ip route | awk '/^default/ {print}'
|
|
fi
|
|
|
|
# ============================================================
|
|
# 2) Audio (PulseAudio/PipeWire) setup
|
|
# ============================================================
|
|
echo "$(ts) 🔊 Checking PulseAudio..."
|
|
if ! command -v pactl >/dev/null 2>&1; then
|
|
echo "$(ts) ❌ pactl not found. Install:"
|
|
echo " sudo apt-get install -y pulseaudio-utils"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$(ts) ⏳ Waiting for audio server..."
|
|
READY=0
|
|
for i in {1..20}; do
|
|
if timeout 0.3s pactl info >/dev/null 2>&1; then
|
|
READY=1
|
|
break
|
|
fi
|
|
sleep 0.3
|
|
done
|
|
|
|
if [[ "$READY" -ne 1 ]]; then
|
|
echo "$(ts) ❌ PulseAudio/PipeWire not ready"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$(ts) ✅ Audio server ready"
|
|
echo "$(ts) 🎧 Setting default speaker → PowerConf"
|
|
pactl set-default-sink "$SINK" || true
|
|
|
|
echo "$(ts) 🎤 Setting default microphone → PowerConf"
|
|
pactl set-default-source "$SOURCE" || true
|
|
|
|
echo
|
|
echo "$(ts) 📋 Current PulseAudio defaults:"
|
|
pactl info | grep -E "Default Sink|Default Source" || true
|
|
echo
|
|
|
|
# ============================================================
|
|
# 3) Run python
|
|
# ============================================================
|
|
if [[ ! -f "$PY_FILE" ]]; then
|
|
echo "$(ts) ❌ Python file not found: $PY_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$(ts) 🚀 Starting Gemini Sanad"
|
|
echo "$(ts) 🐍 Running: $PY_FILE"
|
|
exec python3 "$PY_FILE"
|