cai
2026-06-28 e59b20f60fff034a7268febd3348b15fc767edc4
run-local.sh
@@ -2,7 +2,7 @@
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORKSPACE_ROOT="${COMBRABO_VOICE_RUNTIME_HELPER_WORKDIR:-${SCRIPT_DIR}}"
WORKSPACE_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
MANIFEST_PATH="${SCRIPT_DIR}/Cargo.toml"
BINARY_PATH="${SCRIPT_DIR}/target/release/combrabo-voice-runtime-helper"
DOCKERFILE_PATH="${SCRIPT_DIR}/Dockerfile"
@@ -81,6 +81,44 @@
  printf '%s' "${url}"
}
rewrite_http_url_for_docker() {
  local url="$1"
  if [[ "${url}" =~ ^(http|https)://(127\.0\.0\.1|localhost)([:/].*)?$ ]]; then
    printf '%s://host.docker.internal%s' "${BASH_REMATCH[1]}" "${BASH_REMATCH[3]:-}"
    return 0
  fi
  printf '%s' "${url}"
}
is_truthy() {
  case "${1:-}" in
    true|TRUE|1|yes|YES|on|ON)
      return 0
      ;;
    *)
      return 1
      ;;
  esac
}
docker_service_host() {
  local bind_addr="${1:-127.0.0.1:18080}"
  if [[ "${bind_addr}" =~ ^([^:]+):([0-9]+)$ ]]; then
    printf '%s' "${BASH_REMATCH[1]}"
    return 0
  fi
  printf '%s' "127.0.0.1"
}
docker_service_port() {
  local bind_addr="${1:-127.0.0.1:18080}"
  if [[ "${bind_addr}" =~ ^([^:]+):([0-9]+)$ ]]; then
    printf '%s' "${BASH_REMATCH[2]}"
    return 0
  fi
  printf '%s' "18080"
}
run_host() {
  if [[ ! -x "${BINARY_PATH}" ]]; then
    prepare_host
@@ -110,12 +148,43 @@
    -e CV_GREETING_AUDIO_FILE
    -e CV_GREETING_AUDIO_URL
    -e CV_GREETING_TEXT
    -e CV_ROLE_ID
    -e CV_DEVICE_OUTPUT_SMOKE_ENABLED
    -e CV_DEVICE_OUTPUT_DESTINATION_IDENTITIES
    -e CV_AUDIO_DEBUG_DUMP_DIR
    -e CV_ENABLE_USER_AUDIO_OBSERVER
    -e CV_ENABLE_SIMPLE_VAD
    -e CV_VAD_RMS_THRESHOLD
    -e CV_VAD_PEAK_THRESHOLD
    -e CV_VAD_START_FRAMES
    -e CV_VAD_END_SILENCE_MS
    -e CV_VAD_MIN_SPEECH_MS
    -e CV_VAD_MAX_TURN_MS
    -e CV_VAD_INITIAL_IGNORE_MS
    -e CV_VAD_GATE_UNTIL_GREETING_DONE
    -e CV_VAD_POST_GREETING_DELAY_MS
    -e CV_RUNTIME_TURN_BRIDGE_URL
    -e CV_RUNTIME_TURN_BRIDGE_TOKEN
    -e CV_RUNTIME_TURN_ARTIFACT_DIR
    -e CV_RUNTIME_SESSION_NONCE
    -e CV_HELPER_SERVICE_ENABLED
    -e CV_HELPER_SERVICE_BIND
    -e CV_HELPER_AUTH_TOKEN
    -e CV_HELPER_AUTH_TOKEN_LOCAL_DEV
    -e CV_TURN_BRIDGE_TOKEN_LOCAL_DEV
    -e CV_HELPER_AUTH_TOKEN_DEV
    -e CV_TURN_BRIDGE_TOKEN_DEV
  )
  if is_truthy "${CV_HELPER_SERVICE_ENABLED:-}"; then
    local service_bind service_host service_port
    service_bind="${CV_HELPER_SERVICE_BIND:-127.0.0.1:18080}"
    service_host="$(docker_service_host "${service_bind}")"
    service_port="$(docker_service_port "${service_bind}")"
    export CV_HELPER_SERVICE_BIND="0.0.0.0:${service_port}"
    docker_args+=(-p "${service_host}:${service_port}:${service_port}")
  fi
  if [[ -n "${livekit_url}" ]]; then
    export CV_LIVEKIT_URL="$(rewrite_livekit_url_for_docker "${livekit_url}")"
  fi
  if [[ -n "${CV_RUNTIME_TURN_BRIDGE_URL:-}" ]]; then
    export CV_RUNTIME_TURN_BRIDGE_URL="$(rewrite_http_url_for_docker "${CV_RUNTIME_TURN_BRIDGE_URL}")"
  fi
  if [[ -n "${CV_GREETING_AUDIO_FILE:-}" && -f "${CV_GREETING_AUDIO_FILE}" ]]; then
    local audio_parent
@@ -124,6 +193,24 @@
      docker_args+=(-v "${audio_parent}:${audio_parent}:ro")
    fi
  fi
  if [[ -n "${CV_AUDIO_DEBUG_DUMP_DIR:-}" ]]; then
    mkdir -p "${CV_AUDIO_DEBUG_DUMP_DIR}"
    local debug_dump_dir
    debug_dump_dir="$(cd "${CV_AUDIO_DEBUG_DUMP_DIR}" && pwd)"
    export CV_AUDIO_DEBUG_DUMP_DIR="${debug_dump_dir}"
    if [[ "${debug_dump_dir}" != "${WORKSPACE_ROOT}" && "${debug_dump_dir}" != "${WORKSPACE_ROOT}/"* ]]; then
      docker_args+=(-v "${debug_dump_dir}:${debug_dump_dir}")
    fi
  fi
  if [[ -n "${CV_RUNTIME_TURN_ARTIFACT_DIR:-}" ]]; then
    mkdir -p "${CV_RUNTIME_TURN_ARTIFACT_DIR}"
    local turn_artifact_dir
    turn_artifact_dir="$(cd "${CV_RUNTIME_TURN_ARTIFACT_DIR}" && pwd)"
    export CV_RUNTIME_TURN_ARTIFACT_DIR="${turn_artifact_dir}"
    if [[ "${turn_artifact_dir}" != "${WORKSPACE_ROOT}" && "${turn_artifact_dir}" != "${WORKSPACE_ROOT}/"* ]]; then
      docker_args+=(-v "${turn_artifact_dir}:${turn_artifact_dir}")
    fi
  fi
  exec docker run "${docker_args[@]}" "${IMAGE_NAME}"
}