Controllo automatico di livelli sbilanciati o troppo alti

Controllo automatico di livelli sbilanciati o troppo alti

Ho un programma radiofonico e sono anche una delle persone più coinvolte in tutte le cose relative alla tecnologia della radio. Esistono più sistemi che automaticamente e manualmente registrano il podcast di uno spettacolo, lo caricano online e cose simili.

A volte i podcast registrati presentano alcuni problemi, in genere:

  • L’audio del canale sinistro è sbilanciato rispetto al canale destro, o viceversa (Livello volume non bilanciato)
  • L’audio è troppo alto
  • L’audio è troppo basso

Può succedere perché il sistema audio analogico, prima del campionatore della scheda audio, è stato mal configurato, oppure qualcuno ha spostato delle manopole, o forse il cavo è troppo lungo e di cattiva qualità. Ad ogni modo, quando ciò accade, non c’è modo che io possa capirlo se non ascoltando tutti i file registrati.

Siamo circa 40 relatori, trasmettiamo live dalle 8:00 alle 24:00… non è qualcosa che un essere umano vuole (e può) fare. Quindi per questo tipo di problemi i sistemi informatici sono la soluzione. Ho bisogno

qualcosa che automaticamente può capire se un file è sbilanciato, troppo alto o troppo basso di volume

Penso che Linux sia un super sistema operativo ed è pieno di librerie, strumenti, script e comunità che possono aiutarti a trovare la soluzione giusta, ma a volte non è così semplice. Il coltello siwss che stavo cercando si chiama sox. Sox è uno strumento a riga di comando che può fare un sacco di cose (vedi qui per la documentazione). Quello che ho usato per questo è l’opzione stats

sox FILE_NAME.mp3 -n stats

stats restituisce molte informazioni e quello che stavo guardando era il livello RMS db, globale e per ogni canale (sinistra destra). Per filtrare questi risultati possiamo usare un semplice comando grep:

sox FILE_NAME.mp3 -n stats | grep 'RMS lev dB'

E con un po’ di “magia” ottieni le informazioni numeriche sul livello TOTALE, SINISTRO e DESTRO:

LINE=$(sox FILE_NAME.mp3 -n stats | grep 'RMS lev dB')

TOTAL=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 4)
LEFT=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 5)
RIGHT=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 6)
BAL_DIFF=$(echo "($LEFT)-($RIGHT)" | bc)

Cosa abbiamo fatto qui? Salvato l’output del comando sox nella variabile LINE:

LINE=$(sox FILE_NAME.mp3 -n stats | grep 'RMS lev dB')

e poi l’abbiamo analizzato 3 volte:

TOTAL=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 4)
LEFT=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 5)
RIGHT=$(echo $LINE | tr -s ' ' | cut -d ' ' -f 6)

e memorizzato la differenza LEFT/RIGHT in una variabile BAL_DIFF

BAL_DIFF=$(echo "($LEFT)-($RIGHT)" | bc)

d’ora in poi ciò che devi fare con questi valori dipende da te, puoi verificare se i valori sono inferiori a una soglia e inviare un’e-mail, archiviare il valore da qualche parte, inviare un avviso.

 

MiroAdmin