#!/bin/bash
# =====================================================================
# scarica_voce.sh - scarica il modello vocale italiano per le audioguide
#
# Il modello (61 MB) non sta in git: e' un binario gia' compresso, quindi git
# non saprebbe fare delta fra due versioni e ogni aggiornamento aggiungerebbe
# una copia intera alla storia, per sempre. Si scarica una volta per macchina.
#
# Uso:
#   ./scarica_voce.sh              scarica la voce predefinita (paola, media)
#   ./scarica_voce.sh riccardo     una voce maschile, piu' leggera e meno curata
#   ./scarica_voce.sh --elenco     mostra le voci italiane disponibili
# =====================================================================

DIR="$(cd "$(dirname "$0")" && pwd)"
DEST="$DIR/voci"
BASE="https://huggingface.co/rhasspy/piper-voices/resolve/main/it/it_IT"

# nome -> percorso sul deposito
case "${1:-paola}" in
    --elenco|-l)
        echo "Voci italiane disponibili:"
        echo "  paola     (media)  femminile, la piu' curata — predefinita"
        echo "  riccardo  (x_low)  maschile, piu' leggera e meno naturale"
        exit 0 ;;
    paola)    VOCE="paola/medium/it_IT-paola-medium" ;;
    riccardo) VOCE="riccardo/x_low/it_IT-riccardo-x_low" ;;
    -h|--help) sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
    *) echo "Voce non riconosciuta: $1 (usa --elenco)"; exit 1 ;;
esac

NOME="$(basename "$VOCE")"

command -v curl >/dev/null || { echo "  [KO]  curl non trovato"; exit 1; }
mkdir -p "$DEST" || { echo "  [KO]  impossibile creare $DEST"; exit 1; }

if [ -f "$DEST/$NOME.onnx" ] && [ -f "$DEST/$NOME.onnx.json" ]; then
    echo "  [ok]  $NOME già presente in $DEST"
    exit 0
fi

echo "Scaricamento di $NOME in $DEST"

ESITO=0
for f in "$NOME.onnx" "$NOME.onnx.json"; do
    printf "  %-34s " "$f"
    # si scarica su un nome temporaneo: un trasferimento interrotto lascerebbe
    # altrimenti un modello troncato, che Piper rifiuta con un errore oscuro
    if curl -sSL --fail -o "$DEST/.$f.parziale" "$BASE/${VOCE%/*}/$f" 2>/tmp/voce_err.$$; then
        mv -f "$DEST/.$f.parziale" "$DEST/$f"
        echo "scaricato ($(du -h "$DEST/$f" | cut -f1))"
    else
        echo "FALLITO"
        sed 's/^/        /' /tmp/voce_err.$$ >&2
        rm -f "$DEST/.$f.parziale"
        ESITO=1
    fi
    rm -f /tmp/voce_err.$$
done

if [ "$ESITO" = "0" ]; then
    echo
    echo "  [ok]  pronto. Per usare una voce diversa dalla predefinita:"
    echo "        export GTS_VOCE=$DEST/$NOME.onnx"
fi
exit $ESITO
