Normalisieren, Kompressor und Split – MP3 under attack

Wenn ich geschäftlich unterwegs bin, höre ich gerne Hörbücher. Oder auch Musik. Das gilt natürlich auch privat – vor allen Dingen beim Sport. Die entsprechenden MP3-Dateien kommen dabei aus allen möglichen Quellen und sind einzeln gesehen meist ok, aber in Kombination gibt es ständig ärgerliche Kleinigkeiten. Vor allen Dingen die unterschiedliche Lautstärke, was zum Beispiel beim Radfahren oder Joggen ziemlich blöde ist. Ich will nicht permanent manuell die Lautstärke anpassen. Da heute in RLP Feiertag ist und ich Zeit habe, habe ich deshalb mal meine aktive MP3-Sammlung dahingehend vereinheitlich. Was bedeutet, dass ich eine Normalisierung (einheitliche Lautstärke) durchgeführt und dann die Dateien durch einen Kompressor gejagt habe.

Bei nur wenigen Dateien würde ich mein Standard-Tool Audacity nehmen, aber bei vielen Dateien ist das nicht praktikabel. Das muss ein „Batch-Lauf“ her, der auf viele Dateien automatisiert angewendet werden kann. Dazu kann man mp3gain und sox (Sound eXchange) verwenden, wobei zu beachten ist, dass ich Linux (Mint 22) verwende. Zum Aufspalten von zu großen Dateien (etwa Hörbücher) habe ich ffmpeg genutzt, wobei das Tool im Grunde auch für das Normalisierung als auch als Kompressor genutzt wreden kann. Aber ich habe  dafür wie gesagt mp3gain und sox verwendet.

Das Normalisieren mit gp3gain geht bei allen Dateien in einem Verzeichnis so:

mp3gain -r *.mp3

Das braucht also kein Shell-Skript oder so. Dann stellt sich die Frage, ob man die Dateien nach der Angleichung der Lautstärke nicht noch zusätzlich durch einen Kompressor jagt? Oder anders gefragt – ist das eigentlich sinnvoll oder kann man nicht einfach die Lautstärke des Wiedergabegeräts erhöhen? Es kommt wohl darauf an, denn ein Kompressor kann unter bestimmten Bedingungen einen großen Unterschied in der Klangqualität ausmachen. Ein Kompressor reduziert die Dynamik einer Aufnahme, indem er laute Passagen leiser und leise Passagen lauter macht. Dies sorgt dafür, dass der Ton gleichmäßiger und oft verständlicher wird und die Konsistenz für die Wiedergabe auf verschiedenen Geräten wird besser. Vor allen Dingen gibt es Musikrichtungen, die oft von Kompression profitieren. Gerade auch Rock und das ist die Art von Musik, die ich höre.  Hier sorgt Kompression für ein kraftvolles und konstantes Klangbild. Von daher habe ich also einen Kompressor auf meine MP3 losgelassen. Von Hand geht das mit sox und einigen Defaultwerten so:

sox input.mp3 output.mp3 compand 0.3,1 6:-70,-60,-20 -5 -90 0.2
  • compand ist der Kompressor-Befehl.
  • 0.3,1 sind die Attack- und Release-Zeiten.
  • 6:-70,-60,-20 legt das Kompressionsprofil fest (in diesem Fall mit einem Kompressionsverhältnis für leise und laute Stellen).
  • -5 ist die Lautstärkenanpassung nach der Kompression.
  • -90 0.2 sind die Stillepegel und die „Knie“-Anpassung (also wie weich oder hart der Kompressor einsetzt).

Nur besteht jetzt das Problem, dass ich so jede Datei einzeln anpacken müsste und dann könnte ich im Grunde auch Audacity nehmen. Aber ich habe ChatGPT (was mir auch mp3gain und sox vorgeschlagen hatte) gebeten, mir ein passendes Shell-Skript zu erstellen, dass sowohl mit mp3gain normalisiert und danach die Datei durch den sox-Kompressor drückt. Das kam raus und funktioniert wirklich gut:

#!/bin/bash

# Verzeichnis mit MP3-Dateien (alle Dateien werden in diesem Verzeichnis verarbeitet)
DIR="$1"

# Stelle sicher, dass ein Verzeichnis angegeben wurde
if [ -z "$DIR" ]; then
echo "Bitte das Verzeichnis mit MP3-Dateien als Argument angeben."
exit 1
fi

# Durchlaufe alle MP3-Dateien im Verzeichnis
for FILE in "$DIR"/*.mp3; do
# Überprüfe, ob eine MP3-Datei existiert
if [ -f "$FILE" ]; then
echo "Normalisiere $FILE..."
mp3gain -r -k "$FILE"

# Kompressionsprozess
echo "Komprimiere $FILE..."
sox "$FILE" "${FILE%.mp3}_compressed.mp3" compand 0.3,1 6:-70,-60,-20 -5 -90 0.2

# Ersetze die Originaldatei mit der komprimierten Version
mv "${FILE%.mp3}_compressed.mp3" "$FILE"

echo "$FILE wurde erfolgreich normalisiert und komprimiert."
else
echo "Keine MP3-Dateien gefunden in $DIR"
fi
done

Dann noch das Skript ausführbar machen und auf ein Verzeichnis mit MP3 anwenden.

chmod +x normalize_and_compress.sh
./normalize_and_compress.sh ~/Musik

Nun noch kurz zu den Hörbüchern. Wenn ich die als eine Datei von vielleicht 6 oder 7 Stunden vorliegen habe, kann das insbesondere dann blöd sein, wenn ich die vom USB-Stick auf dem Autoradio wiedergebe. Man kann da sehr schlecht die Timecodes ansteuern. Zumindest bei mir. Aber so kann man die Datei aufspalten. Angenommen, man will die MP3-Datei an der Marke 00:03:30 in zwei Teile aufteilen:

ffmpeg -i input.mp3 -t 00:03:30 -acodec copy part1.mp3
ffmpeg -i input.mp3 -ss 00:03:30 -acodec copy part2.mp3

Gegebenfalls braucht es ein paar Abwandlungen der Parameter.