#!/bin/bash
# =====================================================================
# verifica_voce.sh - controlla che nessuna frase si accavalli con la successiva
#
# aggiungi_voce.js confronta la durata di ogni frase con quella della scena e
# segnala gli accavallamenti, ma e' un controllo sulle INTENZIONI: dice cosa
# dovrebbe succedere secondo i tempi raccolti. Questo script guarda invece
# l'AUDIO PRODOTTO, che e' l'unica cosa che l'utente sente davvero.
#
# Per ogni frase misura il livello nella finestra che precede il suo inizio:
# se li' c'e' ancora voce, la frase precedente non era finita.
#
# Uso:
#   ./verifica_voce.sh                 controlla tutte le guide presenti
#   ./verifica_voce.sh amministrazione controlla una sola guida
# =====================================================================

# la cartella dei filmati si indica con GTS_DOCS, oppure e' docs/ dell'applicazione
DOCS="${GTS_DOCS:-${GTS_APPDIR:-/opt/gts/gtserp}/docs}"

# quanto silenzio si pretende prima di ogni frase, e sotto quale livello si
# considera silenzio (l'audio a zero misura -91 dB)
FINESTRA=0.35
SOGLIA=-55

GUIDE="${*:-interfaccia amministrazione primo_ciclo_produzione ciclo_attivo ciclo_passivo magazzino}"

command -v ffmpeg >/dev/null || { echo "  [KO]  ffmpeg non trovato"; exit 1; }

ESITO=0
for g in $GUIDE; do
    V="$DOCS/${g}_commentato.webm"
    J="$DOCS/${g}.narrazione.json"

    [ -f "$V" ] || continue
    if [ ! -f "$J" ]; then
        echo "=== $g ==="; echo "  [!]   manca $J: impossibile sapere dove comincia ogni frase"
        continue
    fi

    echo "=== $g ==="
    W="/tmp/verifica_voce_$$.wav"
    ffmpeg -v error -i "$V" -map 0:a -c:a pcm_s16le "$W" -y || { echo "  [KO]  audio non estraibile"; ESITO=1; continue; }

    FINESTRA=$FINESTRA SOGLIA=$SOGLIA WAV="$W" python3 - "$J" <<'PY'
import json, os, re, subprocess, sys

dati    = json.load(open(sys.argv[1], encoding='utf-8'))
wav     = os.environ['WAV']
finestra= float(os.environ['FINESTRA'])
soglia  = float(os.environ['SOGLIA'])

passi = dati['passi']
guai  = 0

for i in range(1, len(passi)):
    inizio = passi[i]['ms'] / 1000
    if inizio < finestra:
        continue

    out = subprocess.run(
        ['ffmpeg', '-hide_banner', '-nostats',
         '-ss', str(inizio - finestra), '-t', str(finestra),
         '-i', wav, '-af', 'volumedetect', '-f', 'null', '-'],
        capture_output=True, text=True).stderr

    m  = re.search(r'mean_volume: ([-\d.]+)', out)
    lv = float(m.group(1)) if m else 0.0

    if lv >= soglia:
        guai += 1
        print(f"  [!]   passo {passi[i]['passo']}: a {inizio:.1f}s la voce precedente "
              f"non e' ancora finita ({lv:.0f} dB)")

if guai:
    print(f"  [KO]  {guai} sovrapposizioni")
    sys.exit(1)

print(f"  [ok]  {len(passi)} frasi, nessuna sovrapposizione")
PY
    [ $? != 0 ] && ESITO=1
    rm -f "$W"
done

exit $ESITO
