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.