#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" MODE="${1:-auto}" if [[ -f ".env" ]]; then set -a # shellcheck disable=SC1091 source ./.env set +a fi normalize_host() { local host="${1:-0.0.0.0}" case "$host" in 127.0.0.1|localhost|::1) echo "0.0.0.0" ;; *) echo "$host" ;; esac } pick_python() { if [[ -n "${VISUAL_CHAT_PYTHON:-}" && -x "${VISUAL_CHAT_PYTHON}" ]]; then echo "$VISUAL_CHAT_PYTHON" return 0 fi if [[ -n "${VIRTUAL_ENV:-}" && -x "${VIRTUAL_ENV}/bin/python" ]]; then echo "${VIRTUAL_ENV}/bin/python" return 0 fi if [[ -x "/home/xsl/miniconda3/envs/MuseTalk/bin/python" ]]; then echo "/home/xsl/miniconda3/envs/MuseTalk/bin/python" return 0 fi if command -v python3 >/dev/null 2>&1; then command -v python3 return 0 fi command -v python } PY="$(pick_python)" HOST="$(normalize_host "${WEBRTC_HOST:-0.0.0.0}")" PORT="${WEBRTC_PORT:-8080}" SCHEME="http" ARGS=(main:app --host "$HOST" --port "$PORT") case "$MODE" in auto) if [[ -n "${SSL_CERTFILE:-}" && -n "${SSL_KEYFILE:-}" ]]; then SCHEME="https" ARGS+=(--ssl-certfile "$SSL_CERTFILE" --ssl-keyfile "$SSL_KEYFILE") fi ;; https) if [[ -z "${SSL_CERTFILE:-}" || -z "${SSL_KEYFILE:-}" ]]; then echo "SSL_CERTFILE / SSL_KEYFILE 未配置,无法以 https 模式启动" >&2 exit 1 fi SCHEME="https" ARGS+=(--ssl-certfile "$SSL_CERTFILE" --ssl-keyfile "$SSL_KEYFILE") ;; http) ;; *) echo "usage: bash scripts/start-test.sh [auto|http|https]" >&2 exit 2 ;; esac echo "repo: $ROOT" echo "python: $PY" echo "mode: $MODE" echo "bind: ${HOST}:${PORT}" echo "listen: ${SCHEME}://${HOST}:${PORT}" echo "browser test page: ${SCHEME}://:${PORT}/" echo "note: only one browser page is allowed to own the session; a newer client replaces the older one." echo "note: after browser refresh, one click may still be required to resume mic/audio due to browser media policy." exec "$PY" -m uvicorn "${ARGS[@]}"