Come aumentare il volume di una traccia audio


The media in this post is not displayed to visitors. To view it, please log in.

normalizzazioneQuando si deve aumentare il volume di una traccia audio, si deve ricorrere a ad un'operazione di “normalizzazione”.


1. Cos'è la normalizzazione


La normalizzazione è un'operazione lineare che consiste nell'analisi del file audio, nel calcolare la differenza (offset) fra il volume attuale ed un volume target, nell'applicare una correzione di guadagno (Gain).

La normalizzazione può essere distinta in base al “come” e al “dove”.

Il “come”La normalizzazione classica si basa sui picchi. Cerca il punto più alto della forma d'onda e lo porta a un valore massimo (es. 0 dB). Ignora la percezione umana; un brano con un singolo “click” molto forte risulterà comunque silenzioso perché quel picco blocca l'aumento del volume.

La normalizzazione più moderna si basa sui LUFS, ossia su come, mediamente, l'audio viene effettivamente percepito dall'orecchio umano (psicoacustica). Porta l'intero brano a un livello di pressione sonora media costante, rendendo l'ascolto uniforme tra diverse tracce.

Il “dove”Quando si normalizza una traccia audio si può scegliere di farla modificando ogni singolo sample della traccia audio oppure di agire sui metadati.

Nel primo caso il file originale viene modificato (ricodifica quasi sempre lossy), nel secondo viene lasciato inalterato.

Altro fattore di cui tenere conto è che una normalizzazione lossy funziona su ogni player, una normalizzazione che agisce sui metadati funziona solo se il player è in grado di leggerli.

Possiamo fare quindi una prima distinzione:

  1. normalizzazione di picco (RMS) o Peak Normalization: applicazione di un guadagno statico (RMS) in modalità lossy: non altera la dinamica del brano, richiede una ricodifica;
  2. normalizzazione della sonorità (LUFS) o Loudness Normalization:
    1. applicazione di un guadagno statico (LUFS) in modalità lossy: non altera la dinamica del brano, richiede una ricodifica;
    2. applicazione di un guadagno statico (LUFS) basato su tag: non altera la dinamica del brano, lascia il file inalterato (rsgain);
    3. agisce con un compressore / limiter in modalità lossy: altera la dinamica del brano, richiede una ricodifica.


A questo punto la domanda diventa: quale scegliere?

Per quel che mi riguarda, la salomonica risposta è: dipende.

Come si può immaginare, non c'è una risposta definitiva ma dipende dalla qualità della traccia, dal contesto ecc.

2. Come misurare il “picco”?


C'è bisogno di un elemento misurabile che mi permetta di capire come agire con la normalizzazione.

RMS (Root Mean Square): è un calcolo matematico asciutto su quanto sia potente elettricamente/digitalmente il segnale audio. È utile per capire l'energia costante, ma non tiene conto del fatto che l'orecchio umano è più sensibile ad alcune frequenze rispetto ad altre.

LUFS (Loudness Units Full Scale): È lo standard moderno (EBU R128). Simula l'udito umano applicando dei filtri che pesano maggiormente le frequenze medie.

Per misurare il picco RMS posso ricorrere ad ffmpeg

ffmpeg -hide_banner -i "audio.m4a" -filter:a "volumedetect" -f null -
...
[...] n_samples: 18522112
[...] mean_volume: -20.3 dB
[...] max_volume: -5.4 dB
[...] histogram_5db: 40
[...] histogram_6db: 1436
[...] histogram_7db: 6443
[...] histogram_8db: 18606
...

che mi mostrerà:
  • il numero dei samples di cui si compone la traccia
  • il volume medio (mean_volume)
  • il picco (max_volume)

Il picco mi dice di quanto possa alzare il volume (fino al limite fisico di 0dB) staticamente senza causare distorsioni.

La differenza fra volume medio e picco mi dà informazioni sulla dinamica del brano. Maggiore è la differenza, maggiore è la dinamica. Tipicamente:

  • valori < 5 sono tipici della musica dance, forte, uniforme, e molto compressa.
  • valori fra 5 e 15 sono tipici di brani pop-rock, ben bilanciati
  • valori > 15 sono attribuibili a brani di musica classica, jazz, con una dinamica ricca.

Per misurare il loudness, sempre con ffmpeg:

ffmpeg -hide_banner -i "audio.m4a" -filter:a "ebur128=peak=true" -f null - 
...
 Integrated loudness:
    I:         -18.1 LUFS
    Threshold: -28.4 LUFS

  Loudness range:
    LRA:         4.1 LU
    Threshold: -38.3 LUFS
    LRA low:   -21.2 LUFS
    LRA high:  -17.1 LUFS

  True peak:
    Peak:       -5.4 dBFS

La misurazione è più articolata rispetto alla precedente.

FFmpeg innanzitutto mostra due sezioni: Integrated Loudness, rappresentante il volume medio complessivo del file e la Loudness Range che mi descrive la dinamica del brano come differenza di volume fra le parti più silenziose e quelle più rumorose.

  1. Sezione Integrated loudness:
    • I: è il valore più importante. È il volume medio percepito dell'intero brano (come si può vedere, diverso rispetto all'RMS di prima. Il primo è pura potenza digitale, il secondo è volume percepito).
    • Threshold: è la soglia usata per evitare che i silenzi abbassino artificialmente la media del volume. L'algoritmo ignora tutto ciò che sta sotto questa soglia nel calcolo dell'Integrated Loudness.


  2. Sezione Loudness range:
    • LRA: è un indice della variazione dinamica del brano. Più è basso, più il suono tende ad essere uniforme e probabilmente compresso
    • Threshold: come prima, è la soglia oltre la quale i suoni vengono ignorati nel calcolo del range dinamico.
    • LRA Low: indica il limite inferiore del loudness
    • LRA High: indica il limite superiore
      quindi LRA = LRA High – LRA Low


  3. Sezione True peak:
    • Peak: Simile al max_volume dell'RMS, indica il picco reale del brano in termini di sonorità.


Un altro modo, forse meno pratico ma decisamente più scenografico, per analizzare un file audio è questo:

ffplay -f lavfi -i "amovie=audio.m4a,ebur128=video=1:meter=18 [out0][out1]"

Disegna un grafico dell'onda sonora in tempo reale.

3. Come leggere correttamente questa misura


L'integrated loudness mi dice qual è il volume medio del brano.True peak mi dice di quanto posso alzare prima di distorcere. Queste sono le due informazioni cruciali sufficienti per applicare un guadagno statico senza fare danni.

I valori High e Low del Loudness Range, che racchiudono asintoticamente il brano, tornano utili quando bisogna agire sulla dinamica.

Notare che Integrated loudness è sempre compreso fra LRA Low e LRA High.

3.1. Perché usare il loudness invece di RMS?


L'RMS è un calcolo puramente matematico che non tiene conto del fatto che l'orecchio umano è molto più sensibile alle frequenze medie che non ai bassi estemi e agli acuti altissimi.

A questo provvede il LUFS che è un'evoluzione dell'RMS perché include dei filtri di ponderazione che, prima di calcolare la media, esaltano le frequenze medie attenuando quelle basse.

La conseguenza è che se agisco sul volume dei brani prendendo LUFS come riferimento, questi suoneranno tutti allo stesso volume. Se considerassi un adeguamento basato su RMS, i brani con più bassi sembreranno avere meno volume di quelli con frequenze medie più marcate.

4. Come ti normalizzo il file


La scelta fra una normalizzazione di picco e una di volume (loudness) è abbastanza semplice in realtà.

A parte poche eccezioni in cui può avere senso avere RMS come riferimento, è sempre preferibile una normalizzazione della sonorità.

Quest'ultima può essere fatta modificando solo i metadati o agendo chirurgicamente sul file ricodificandolo.

4.1. Peak normalization


Una volta noti i dati di Max Volume e Mean Volume visti in precedenza, la normalizzazione è piuttosto semplice.

Supponendo Max Volume = 6dB

ffmpeg -i audio.m4a -filter:a "volume=6dB" -c:a aac -b:a 192k audio_normalized.m4a

Dovendo ricodificare, scelgo un bitrate piuttosto alto per limitare la perdita fisiologica di una ricodifica lossy.

Come si può immaginare, è una aggiunta lineare secca a tutta la traccia a cui aumento solo la potenza digitale senza tenere conto della percezione sonora.

Piccola nota: Conviene scegliere un valore che si avvicini, ma non equivalga, al limite di 0 dB perché altrimenti FFmpeg taglierà brutalmente le creste dell'onda sonora che superano lo zero, creando quella tipica distorsione metallica grattata chiamata clipping.

4.2. Loudness Normalization


La normalizzazione di volume, in base alla nostra scelta di alterare o meno la dinamica del brano, può essere fatta come detto applicando:

  • un guadagno statico LUFS (lossy)
  • un guadagno statico LUFS sui metadati (non lossy)
  • compressore / limiter (sempre lossy)

Il guadagno statico, quello con i metadati, avverrà con rsgain.

La normalizzazione con perdita di qualità (lossy) avverrà con ffmpeg usando il filtro loudnorm che dispone di un compressore/limiter piuttosto efficace.

Questo filtro è un processore dinamico (dual-pass o single-pass). Non si limita ad alzare il volume; se trova una parte troppo forte, può comprimere leggermente solo quella parte per permettere al resto della canzone di suonare più forte.

loudnorm porta il loudness di default a -24 LUFS che è lo standard per il broadcast televisivo.

I colossi dello streaming applicano automaticamente un loudness decisamente più marcato, salvo poche eccezioni, non si discostano da -14 LUFS. Ad es. Youtube, Amazon Music, Spotify, Soundcloud viaggiano mediamente su -14 LUFS, Deezer -15, Apple Music -16.

Si può verificare facilmente, come sappiamo fare, come un audio presente su una di queste piattaforme, abbia uno dei loudness indicati.

4.2.1. Loudness Normalization statica (ffmpeg)


Riprendiamo l'esempio di prima.

ffmpeg -hide_banner -i "audio.m4a" -filter:a "ebur128=peak=true" -f null - 
...
 Integrated loudness:
    I:         -18.1 LUFS
    Threshold: -28.4 LUFS

  Loudness range:
    LRA:         4.1 LU
    Threshold: -38.3 LUFS
    LRA low:   -21.2 LUFS
    LRA high:  -17.1 LUFS

  True peak:
    Peak:       -5.4 dBFS

Con ffmpeg e loudnorm in modalità single-pass, posso applicare un guadagno statico 5.4 dBFS, con un true peak di -1 (Il default è -2), per arrivare, da -18.1 LUFS, a -13.0 LUFS senza distorsioni.
ffmpeg -i audio.m4a -filter:a "loudnorm=I=-12.7:TP=-1.0" -c:a aac -b:a 160k -vn audio_norm.m4a

Verifichiamo:
ffmpeg -hide_banner -i "audio.m4a" -filter:a "ebur128=peak=true" -f null - 
...
   Integrated loudness:
    I:         -12.5 LUFS
    Threshold: -22.6 LUFS

  Loudness range:
    LRA:         4.0 LU
    Threshold: -32.6 LUFS
    LRA low:   -15.1 LUFS
    LRA high:  -11.1 LUFS

  True peak:
    Peak:       -0.4 dBFS
...

Come si vede, sono arrivato al limite, forse un po' troppo, del guadagno che potevo ottenere. Probabimente su dispositivi economici, l'analogico di un brano così potrebbe gracchiare un po'.

Se avessi applicato il default di loudnorm, la sonorità sarebbe stata livellata sui -24 LUFS con una soglia true peak pari a -2 dBFS.

4.2.2. Loudness Normalization dinamica


Nei casi in cui:

  • si vuole enfatizzare l'audio di un podcast, di un parlato in generale;
  • la dinamica del brano è composta da picchi altissimi e una sonorità media molto bassa (un guadagno statico farebbe cambiare poco o nulla)

con ffmpeg e loudnorm possiamo correggere ogni singolo sample del brano per rendere la dinamica più uniforme.

Per ottenere un risultato ottimale, si deve procedere col dual-pass, in cui ffmpeg nel primo passaggio analizza il file e raccoglie i dati, nel secondo passaggio applica le correzioni puntualmente avendo già conoscenza della dinamica e dei picchi presenti nel file.

ffmpeg -i "audio.m4a" -filter:a "loudnorm=I=-14:TP=-1.0:print_format=json" -f null -

Ecco il json risultante dall'analisi. I valori di input sono quelli che forniremo a ffmepg affinché possa impostare il loudness scelto da noi nel miglior modo possibile
{
	"input_i" : "-18.17",
	"input_tp" : "-5.41",
	"input_lra" : "4.20",
	"input_thresh" : "-28.47",
	"output_i" : "-13.36",
	"output_tp" : "-1.00",
	"output_lra" : "4.30",
	"output_thresh" : "-23.50",
	"normalization_type" : "dynamic",
	"target_offset" : "-0.64"
}

Configurazione ffmpeg.
ffmpeg -i "audio.m4a" -filter:a "loudnorm=I=-14:TP=-1.0:measured_I=-18.17:measured_TP=-5.41:measured_LRA=4.20:measured_thresh=-23.50:linear=true" -c:a aac -b:a 160k -vn "audio_norm.m4a"

Il compressore/limiter del filtro loudnorm è abbastanza intelligente da schiacciare i picchi affinche il guadagno di volume non produca clipping e alzerà le parti più “deboli”, livellando il suono e alterando la dinamica.
4.2.3. Loudness Normalization statica (rsgain)


Rsgain permette di applicare un guadagno statico loseless, senza ricodifica, agendo sui metadati del brano con l'applicazione dei tag.

Se da un lato questo metodo ha l'indubbio vantaggio di non alterare fisicamente il file, dall'altro è necessario che il player che eseguirà il brano dovra essere capace di leggere e interpretare i tag. Nel caso precedente, la ricodifica rende il file disponibile per chiunque.

Trattandosi di un guadagno statico, il campo d'applicazione è quello visto per la Peak Normalization, cioè quando si vuole preservare la dinamica del brano, Ma nei casi particolari cui accennavo in precedenza, presenza di picchi altissimi e maggioranza sonorità medie molto basse, anche rsgain non è sufficiente.

Come avevo detto all'inizio, rsgain è una normalizzaziome della sonorità ottenuta agendo sui metadati del brano, applicando dei tag, che così non viene alternato in alcun modo.

Rsgain è l'evoluzione del vecchio mp3gain e come il suo predecessore ha due modalità di lavoro

  • sul singolo brano (detta é custom)
  • su collezioni di brani (detta easy)

La modalità custom è considerato un approccio legacy fatta per intervenire puntualmente sul brano con configurazioni ad-hoc ideali per lo scripting, quella easy, basata su presets, permette di normalizzare intere collezioni di brani che è lo scopo principale di rsgain.

Analisi del file

rsgain custom -t audio.m4a
[✔] Scanning 'audio.m4a'
[✔] Container: QuickTime / MOV [mov,mp4,m4a,3gp,3g2,mj2]
[✔] Stream #0: AAC (Advanced Audio Coding), 44.100 Hz, 2 ch
 100% [====================================================]

Track: audio.m4a
  Loudness:   -18.12 LUFS
  Peak:     0.536630 (-5.41 dB)
  Gain:         0.12 dB

il flag -t individua il true peak
  • Loudness: è la sonorità del brano in LUFS
  • Peak: è il true peak, esprime il guadagno che posso ottenere prima di distorcere
  • Gain: è il guadagno per arrivare allo standard LUFS di rsgain che è -18

Nel nostro caso, Gain ci dice di diminuire di 0.12 LUFS mentre Peak ci dice che potrei aumentare di 5.41 LUFS

Gain

rsgain custom -s i -l -13 -c p audio.m4a
Track: audio.m4a
  Loudness:   -18.12 LUFS
  Peak:     0.534149 (-5.45 dB)
  Gain:         5.12 dB

  • -s i: scrive il tag
  • -l -13: imposta il loudness
  • -c p: protezione clipping

Portando il loudness a -13 è come se avessi aumentato il volume di 5,12 dB mantenendo un cuscinetto di -0.33 dB (differenza fra peak e gain).

Se provassi a spingere di più, il flag -c p impedisce al suono di distorcere.

rsgain custom -s i -l -10 -c p audio.m4a
Track: audio.m4a
  Loudness:   -18.12 LUFS
  Peak:     0.534149 (-5.45 dB)
  Gain:         5.45 dB  (adjusted to prevent clipping)

(adjusted to prevent clipping)” è la conferma che la protezione anti-clipping è entrata in azione.

Se non ci fosse stata:

rsgain custom -s i -l -10 audio.m4a
Track: audio.m4a
  Loudness:   -18.12 LUFS
  Peak:     0.534149 (-5.45 dB)
  Gain:         8.12 dB

La differenza fra peak e gain indica un'evidente distorsione.

Esempio di esecuzione del brano sfruttando il replaygain:

mpv --replaygain=track audio.m4a

Senza il flag --replaygain=track, il brano verrebbe letto normalmente.

Cancellazione del tagBasta cancellare il tag per riportare tutto alla normalità

# verifico la presenza del tag prima
ffprobe -hide_banner -i "audio.m4a" 2>&1 | grep -i "replaygain"
REPLAYGAIN_TRACK_GAIN: 8.12 dB
REPLAYGAIN_TRACK_PEAK: 0.534149
replaygain: track gain - 8.120000, track peak - 0.000012, album gain - unknown, album peak - unknown,

# cancello il tag
rsgain custom -s d audio.m4a

# verifico che il tag non si ci sia più
ffprobe -hide_banner -i "audio.m4a" 2>&1 | grep -i "replaygain"
**

Un altro modo più compatto per verificare la presenza del tag:
ffprobe -i "audio.m4a" -show_entries format_tags=REPLAYGAIN_TRACK_GAIN -v quiet -of csv="p=0"

Se c'è il tag, mostra solo il gain.

Easy modeI flag impostati nella modalità custom nella modalitò easy sono affidati ad un file di configurazione.

Su Gnu/Linux i file di default si trovano in /usr/share/rsgain/presets e sono 4

  • default.ini
  • ebur128.ini
  • loudgain.ini
  • no_album.ini

C'è una sezione globla e delle sezioni specifiche per tipo di file.

L'override di queste configurazioni o la creazione di nuove, si fa in:

~/.config/rsgain/presets

e per la corrispondenza campi – flag custom vi rimando alla documentazione: github.com/complexlogic/rsgain…

Una volta deciso il preset che fa per noi, basta chiamare rsgain su una directory in questo modo:

rsgain easy -s <nome_preset> <path_album>

rsgain farà la scansione e applicherà massivamente le configurazioni che potranno consistere per es.:
  • nell'applicazione di un loudness a tutti i brani per uniformare la sonorità;
  • nella cancellazione di tutti i tag;
  • nell'analisi dei brani;
  • ecc.

Esempio di file di configurazione per una scansione

[Global]
TagMode=s
Album=true
TargetLoudness=-18
ClipMode=p
MaxPeakLevel=-1.0
TruePeak=true
Lowercase=false
ID3v2Version=keep
OpusMode=d
PreserveMtimes=false
DualMono=false

In questo modo rsgain produrrà un'analisi in modalità “album” per tutta la collezione, il gain da applicare all'album e una sintesi sulla media dei valori di picco ottenuti.
rsgain easy -p scan <path_album> 
...
Track: <path_album>/track_1
  Loudness:   -17.80 LUFS
  Peak:     0.743221 (-2.58 dB)
  Gain:        -0.20 dB


Track: <path_album>/track_2
  Loudness:   -17.81 LUFS
  Peak:     0.790007 (-2.05 dB)
  Gain:        -0.19 dB


Track: <path_album>/track_3
  Loudness:   -17.47 LUFS
  Peak:     0.834655 (-1.57 dB)
  Gain:        -0.53 dB

...

Album:
  Loudness:   -16.51 LUFS
  Peak:     0.991804 (-0.07 dB)
  Gain:        -1.49 dB


Scanning Complete
Time Elapsed:      00:00:27
Files Scanned:     18
Clip Adjustments:  0 (0.0% of files)
Average Loudness:  -16.61 LUFS
Average Gain:      -1.39 dB
Average Peak:      0.823503 (-1.69 dB)
Negative Gains:    16 (88.9% of files)
Positive Gains:    2 (11.1% of files)

L'ultima sezione, “Album”, mi dà le informazioni sul guadagno da applicare, in questo caso poco o nulla perché sono brani già normalizzati,.

Con un altro presets, ad es. myGain.ini, posso normalizzare tutto l'album in colpo solo.

rsgain easy -p myGain <path_album>

In altre parole, tutto ciò che la modalità custom affida allo scripting, ora viene automatizzata dalla modalità easy.

Riferimenti:

#ffmpeg #rsgain #loudness #loudnorm


noblogo.org/aytin/come-aumenta…