#!/usr/bin/env bash
|
set -euo pipefail
|
|
MODEL_ID="x-asr-zh-en-960ms"
|
CHUNK_DIR="chunk-960ms-model"
|
BASE_URL="https://huggingface.co/GilgameshWind/X-ASR-zh-en/resolve/main/deployment/models/${CHUNK_DIR}"
|
|
APP_SUPPORT_DIR="${PRIVATEVOICE_APP_SUPPORT_DIR:-$HOME/Library/Application Support/PrivateVoice Input}"
|
MODELS_ROOT="${PRIVATEVOICE_MODELS_ROOT:-$APP_SUPPORT_DIR/models}"
|
FINAL_DIR="$MODELS_ROOT/$MODEL_ID"
|
RUN_ID="$(date +%Y%m%d.%H%M%S)"
|
STAGING_DIR="$MODELS_ROOT/.staging/${MODEL_ID}-${RUN_ID}"
|
BACKUP_DIR="$FINAL_DIR.backup-${RUN_ID}"
|
|
FILES=(
|
"encoder-960ms.onnx"
|
"decoder-960ms.onnx"
|
"joiner-960ms.onnx"
|
"tokens.txt"
|
)
|
|
cleanup() {
|
rm -rf "$STAGING_DIR"
|
}
|
trap cleanup EXIT
|
|
mkdir -p "$STAGING_DIR"
|
|
for file in "${FILES[@]}"; do
|
url="$BASE_URL/$file"
|
dest="$STAGING_DIR/$file"
|
echo "Downloading $file"
|
curl -L -sS --fail --retry 5 --retry-delay 2 --continue-at - --output "$dest" "$url"
|
if [[ ! -s "$dest" ]]; then
|
echo "Downloaded file is empty: $dest" >&2
|
exit 1
|
fi
|
echo "Downloaded $file"
|
done
|
|
xattr -cr "$STAGING_DIR" 2>/dev/null || true
|
|
mkdir -p "$MODELS_ROOT"
|
if [[ -e "$FINAL_DIR" ]]; then
|
mv "$FINAL_DIR" "$BACKUP_DIR"
|
fi
|
|
mv "$STAGING_DIR" "$FINAL_DIR"
|
trap - EXIT
|
|
if [[ -e "$BACKUP_DIR" ]]; then
|
rm -rf "$BACKUP_DIR"
|
fi
|
|
echo "Installed $MODEL_ID to:"
|
echo "$FINAL_DIR"
|
du -sh "$FINAL_DIR" 2>/dev/null || true
|