#!/usr/bin/env bash # # Incremental model downloader. # Downloads missing models into an existing models directory without deleting # existing files and without requiring uv. # set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" if [[ -f "${PROJECT_ROOT}/app/utils/download_models.py" ]]; then DEFAULT_MODEL_DIR="${PROJECT_ROOT}/models" else DEFAULT_MODEL_DIR="/opt/dep/asr/models" fi MODEL_DIR="${MODEL_STORAGE_DIR:-${MODELS_DIR:-$DEFAULT_MODEL_DIR}}" PYTHON_BIN="${PYTHON_BIN:-${PYTHON:-python3}}" AUTO_MODE="false" MODE="auto" DOCKER_IMAGE="${ASR_IMAGE:-}" ARG_COUNT="$#" RUNTIME_MODELS_DIR="" INTERACTIVE_DOCKER_TARGET="false" info() { echo "[INFO] $1"; } die() { echo "[ERROR] $1" >&2; exit 1; } usage() { cat </dev/null 2>&1 || die "Python not found: ${PYTHON_BIN}" info " Runner: local python (${PYTHON_BIN})" local args=("$downloader" --models-dir "$MODEL_DIR" --cache-dir "${MODELSCOPE_CACHE:-$MODEL_PARENT_DIR}") if [[ -n "$RUNTIME_MODELS_DIR" ]]; then args+=(--runtime-models-dir "$RUNTIME_MODELS_DIR") fi if [[ "$AUTO_MODE" == "true" ]]; then args+=(--auto-mode) fi "$PYTHON_BIN" "${args[@]}" } run_docker_download() { command -v docker >/dev/null 2>&1 || die "Docker not found; cannot use docker mode" [[ -n "$DOCKER_IMAGE" ]] || die "Docker image not set; pass --docker-image IMAGE or set ASR_IMAGE in .env" [[ -f "${SCRIPT_DIR}/download_models_standalone.py" ]] || die "Cannot find download_models_standalone.py" info " Runner: docker image (${DOCKER_IMAGE})" local args=(/tmp/download_models_standalone.py --models-dir /app/models --cache-dir /app) if [[ -n "$RUNTIME_MODELS_DIR" ]]; then args+=(--runtime-models-dir "$RUNTIME_MODELS_DIR") fi if [[ "$AUTO_MODE" == "true" ]]; then args+=(--auto-mode) fi docker run --rm \ -e MODELS_DIR=/app/models \ -e MODELSCOPE_PATH=/app/models \ -e MODELSCOPE_CACHE=/app \ -e DATA_DIR=/app/data \ -e TEMP_DIR=/app/data/temp \ -e LOG_FILE=/app/data/logs/qwen3-asr.log \ -v "${MODEL_DIR}:/app/models" \ -v "${SCRIPT_DIR}/download_models_standalone.py:/tmp/download_models_standalone.py:ro" \ "${DOCKER_IMAGE}" \ python3 "${args[@]}" } case "$MODE" in local) run_local_download ;; docker) run_docker_download ;; auto) if ! run_local_download; then run_docker_download fi ;; esac info "Model download complete" info "Models directory: ${MODEL_DIR}"