Für einen Audio-Workflow wollte ich unter anderem Audio-Dateien normalisieren, damit diese mit einer identischen Lautheit verfügbar sind. Dazu kann das freie ffmpeg genutzt werden:
ffmpeg -i local.flac -filter:a loudnorm local.wav
Allerdings wird bei der Normalisierung eine 2-Pass-Lösung empfohlen. Dabei wird im ersten Durchlauf die Datei analysiert, um die entsprechenden Werte für die qualitativ hochwertige Normalisierung zu ermitteln:
ffmpeg -i local.flac -filter:a loudnorm=print_format=json -f null NULL
Für die entsprechende Datei wird dann eine Ausgabe erzeugt:
{ "input_i" : "-33.65", "input_tp" : "-8.11", "input_lra" : "7.10", "input_thresh" : "-44.96", "output_i" : "-25.28", "output_tp" : "-2.00", "output_lra" : "4.50", "output_thresh" : "-36.36", "normalization_type" : "dynamic", "target_offset" : "1.28" }
Mithilfe dieser Informationen kann dann der zweite Durchlauf gestartet werden:
ffmpeg -i local.flac -filter:a loudnorm=linear=true:i=-16:lra=7.0:tp=-2.0:offset=0.50:measured_I=-33.65:measured_tp=-8.11:measured_LRA=7.10:measured_thresh=-44.96 -ar 44100 local.wav
Da die Lösung mittels ffmpeg etwas umständlich ist, wurde ffmpeg-normalize entwickelt. Dieses Python-Tool kann über den Python-Paketmanager installiert werden:
pip3 install ffmpeg-normalize
Anschließend kann die Normalisierung und Konvertierung vorgenommen werden:
ffmpeg-normalize local.flac -o local.wav -ar 44100
In diesem Fall wird die FLAC-Datei normalisiert und in eine Wave-Datei konvertiert und die entsprechende Samplerate auf 44100 gestellt. Um das Kommando einfacher zugänglich zu machen, kann eine Bash-Funktion definiert werden. Unter macOS muss diese in der entsprechenden Konfigurationsdatei der Z shell angelegt werden:
nano ~/.zshrc
Anschließend kann die entsprechende Funktion in der Datei definiert werden:
normalize () { ffmpeg-normalize "$1" -o "$1".wav -ar 44100 }
Nachdem das Terminal neu gestartet wurde, kann das Kommando wie folgt benutzt werden:
normalize local.flac
Da stellt sich die Frage, was Normalisieren eigentlich ist. Irgendwie liest es sich für mich so, als ob das oben beschriebene Normalisieren ein wenig über das hinaus geht, was ich darunter verstehen würde. Es inkludiert offensichtlich eine Art Dynamikanpassung, was zur klassischen Normalisierung eigentlich nicht gehört. Huier wird eigentlich „nur“ die lauteste Stelle einer Audiodatei gesucht, diese mit dem Pegel-Zielwert verglichen und dann die Audiodatei im ganzen entsprechend angepasst.
Ja das ist richtig, dass es hier keine klassische Normalisierung ist. In dem Fall ist es die Lautstärke-Normalisierung nach EBU R128; wie schreiben sie so schön in der Dokumentation von ffmpeg: „Includes both dynamic and linear normalization modes“.