Je cherche un moyen de normaliser le son dans de NOMBREUX fichiers MP3 que je possède. Certains ont un son faible, tandis que d'autres sont plus forts, de sorte que je dois augmenter ou diminuer le volume en fonction de la chanson. Quels sont les moyens de le faire pour tous les fichiers ? J'aimerais surtout le faire via le terminal, mais les interfaces graphiques sont également acceptées.
Réponses
Trop de publicités?Cela aura pour effet de récursivement ffmpeg-normalize
tous .mp3
dans toute la structure des sous-dossiers à la fréquence d'échantillonnage 240k
find -name "*.mp3" -exec ffmpeg-normalize {} -b:a libmp3lame -b>a 240k \;
(vous pouvez modifier cette valeur pour des taux plus élevés ou utiliser le gain au lieu de la normalisation avec la même synthèse. Quelqu'un ?)
C'est la réponse de Neil qui m'a le plus plu, car elle n'introduit pas de corrélation entre les fichiers audio : il suffit de choisir un niveau de gain et de tout régler en fonction de ce niveau.
Cependant, j'ai eu quelques problèmes pour analyser la sortie de normalize-ogg
avec quelques fichiers que j'ai. Il y a également un problème désagréable avec bc
Il ne fait pas d'arrondi réel, il se contente de tronquer.
J'ai donc fini par abandonner les scripts Shell et je suis passé à Python.
Note1 : la partie exiftool est peut-être exagérée mais je voulais être sûr à 100% que le bitrate d'origine serait préservé.
Note2 : cette volonté écraser les originaux, si vous voulez les préserver, utilisez --backup dans le dernier appel à normalize-ogg. Mais j'ai trouvé plus pratique de garder une copie dans un répertoire séparé, plus sûr.
Note3 : cette solution concerne les fichiers ogg, mais il est trivial de l'adapter au mp3, il suffit de remplacer les occurrences de "ogg" par "mp3".
Voici mon point de vue sur le problème. La dernière version est disponible ici : regain.py
#!/usr/bin/python3
"""
Parallel normalize gains
"""
'
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'
# Absolute value, in dB for the desired gain of each file
TARGET_GAIN = -12
#
MAX_THREADS = 2
from subprocess import Popen, PIPE
from multiprocessing.dummy import Pool as ThreadPool
from os import listdir
import logging
def initlogger(logfile="log.log", mainlevel=logging.DEBUG,
filelevel=logging.DEBUG, consolelevel=logging.DEBUG):
'''initlogger'''
# create logger
logger = logging.getLogger()
logger.setLevel(mainlevel)
# create file handler which logs even debug messages
fh = logging.FileHandler(logfile)
fh.setLevel(filelevel)
# create console handler also logging at DEBUG level
ch = logging.StreamHandler()
ch.setLevel(consolelevel)
# create formatter and add it to the handlers
formatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)
def logcommand(command=[]):
'''logcommand'''
if not isinstance(command, list):
return "", "", -1
logging.info("Command:\n" + " ".join(command) + "\n")
proc = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = proc.communicate()
output = output.decode("utf-8")
err = err.decode("utf-8")
logging.info("Output:\n" + output + "\n")
logging.info("Error:\n" + err + "\n")
logging.info("Return Code:\n" + str(proc.returncode) + "\n")
return output, err, proc.returncode
def regain(target):
'''regain'''
logging.info("============================ Start File ============================")
logging.warning(target["name"])
logging.info("Extracting gain info.\n")
commandgetlevels = ['normalize-ogg', '-n', target["name"]]
output, err, retcode = logcommand(commandgetlevels)
level = output.split()[0]
logging.debug("Level: " + level)
if "dBFS" in level:
level = level.split("dBFS")[0]
level = level.replace(',', '.')
level = int(round(float(level)))
delta = target["gain"] - level
logging.info("Required adjustment: " + str(delta) + "\n")
if delta is 0:
logging.warning(target["name"] + " is already at the correct level")
return 0
logging.info("Extracting average bitrate.\n")
commandgetinfo = ['exiftool', target["name"]]
output, err, retcode = logcommand(commandgetinfo)
bitrate = '0'
for line in output.split('\n'):
if 'Nominal Bitrate' in line:
bitrate = line.split(':')[1].split()[0]
break
logging.info("Average bitrate is: " + str(bitrate) + "\n")
if bitrate is '0':
logging.error("No valid bitrate found, aborting conversion.\n")
exit(-1)
logging.info("Re-normalizing.\n")
commandrenormalize = ['normalize-ogg', '--ogg', '--bitrate', bitrate,
'-g', str(delta) + 'db', target["name"]]
output, err, retcode = logcommand(commandrenormalize)
if retcode is not 0:
log.error("Output:\n" + output)
log.error("err:\n" + err)
exit(retcode)
return retcode
# function to be mapped over
def parallelregain(gain=TARGET_GAIN, threads=MAX_THREADS):
'''parallelregain'''
logging.info("Creating thread pool with " + str(threads) + " elements.\n")
pool = ThreadPool(threads)
targets = []
files_list = listdir(".")
files_list.sort()
counter = 0
for filename in files_list:
if filename.endswith("ogg"):
target = {
"name":filename,
"gain":gain,
}
targets.append(target)
counter = counter + 1
pool.map(regain, targets)
pool.close()
pool.join()
if __name__ == "__main__":
initlogger(logfile="normalize.log", consolelevel=logging.WARNING)
parallelregain()
Sox
Si vous ne vous souciez pas des pertes de qualité vous pouvez utiliser sox
en lot
for f in *.mp3; do
sox --norm "$f" /tmp/sox.mp3;
mv -v /tmp/sox.mp3 "$f";
done
Mais ce n'est pas parfait, cela réencode tous les fichiers et il n'y a aucun moyen de dire à Sox d'utiliser le bitrate le plus élevé possible.
mp3gain
Depuis que mp3gain a été retiré des dépôts debian, installez-le simplement avec
mkdir mp3gain;
cd mp3gain;
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/mp3gain/1.5.2-r2-6/mp3gain_1.5.2-r2.orig.tar.gz; tar -xvzf mp3gain_1.5.2-r2.orig.tar.gz;
make;
sudo make install
Les modifications apportées par mp3gain sont sans aucune perte. Il y a aucune perte de qualité dans le changement car le programme ajuste le fichier mp3 directement, sans décodage et réencodage.
Utiliser sur tous les fichiers du dossier en cours avec :
mp3gain -r *.mp3
LoudGain
Il semble que ce soit l'outil idéal : https://github.com/Moonbase59/loudgain
Il utilise le célèbre
mp3gain
mais ne modifiera jamais les données audio réelles. Tout ce que vous avez toujours voulu : Le meilleur de mp3gain, ReplayGain 2.0 et Linux combinés.
Il réduit le gain à -1 dBTP (au lieu de 0 dBTP, selon la recommandation de l'UER). Il s'agit presque d'une marge de sécurité dans le cas où la route de diffusion ultérieure comprend "seulement" ReplayGain, mais n'a pas de prévention de l'écrêtage.
Installer LoudGain (en utilisant Homebrew) :
wget https://raw.githubusercontent.com/Homebrew/install/master/install.sh
# first check what you get before install ;)
less install.sh
# press q and then install homebrew with:
/bin/bash -c install.sh
brew install Moonbase59/tap/loudgain
appliquer sur le dossier
utilisation recommandée pour numériser et étiqueter un album MP3 :
loudgain -I3 -S -L -a -k -s e *.mp3
Pour d'autres formats, voir https://github.com/Moonbase59/loudgain/blob/master/docs/loudgain.1.md#recommendations
accélère l'unité centrale pendant le traitement
Si vous avez un ordinateur portable avec intel >=8th gen. et que vous voulez l'utiliser sans être brûlé, désactiver le turbo-boost tout en traitant plusieurs fichiers en arrière-plan ;)
のことです。 normalize
Le nom de CLI a été modifié il y a quelque temps pour devenir normalize-audio
. Il est disponible dans le paquet normalize-audio
sur Debian/Ubuntu.
$ dpkg-query -S /usr/bin/normalize-audio
normalize-audio: /usr/bin/normalize-audio
normalize-audio
peut gérer à la fois les MP3, OGG et FLAC, il suffit d'utiliser l'interface de commande frontale (CLI) normalize-audio
.
NOTE : Il peut gérer à la fois ce qu'il appelle un mode mixte et un mode par lots.
MIX MODE
This mode is made especially for making mixed CD's and the like.
You want every song on the mix to be the same volume, but it
doesn't matter if they are the same volume as the songs on some
other mix you made last week. In mix mode, average level of all the
files is computed, and each file is separately normalized to
this average volume.
BATCH MODE
When operating on a group of unrelated files, you usually want all
of them at the same level, and this is the default behavior.
However, a group of music files all from the same album is
generally meant to be listened to at the relative volumes they were
recorded at. In batch mode, all the specified files are
considered to be part of a single album and their relative volumes
are preserved. This is done by averaging the volumes of all the
files, computing a single adjustment from that, and applying the
same adjustment to all the files. Some analysis is also done
so that files with volumes that appear to be statistical
aberrations are not considered in the average. This is useful if
you have albums (like many of the author's) in which there is one
"quiet song" that throws off the average.
Pour les CD de mixage contenant des pistes provenant de diverses sources, j'utilise généralement le MODE MIX.
Exemple
Vous pouvez l'exécuter avec la commande -n
qui est en fait un mode d'essai où il vous dira ce qui sera fait sans manipuler vos fichiers.
$ normalize-audio -m -n *.mp3
Computing levels...
level peak gain
-6.7043dBFS 0.0000dBFS -3.1662dB 01 - Danny Phantom theme.mp3
-6.9161dBFS 0.0000dBFS -2.9544dB 02 - Way Less Sad - AJR.mp3
-10.8860dBFS 0.0000dBFS 1.0154dB 03 - Ghost - Telehope.mp3
-10.5776dBFS 0.0000dBFS 0.7070dB 04 - Another One of Those Days - Cavetown.mp3
-7.0341dBFS 0.0000dBFS -2.8365dB 05 - 100 Years - OR3O.mp3
-10.5194dBFS -0.0252dBFS 0.6488dB 06 - Paul - Cavetown.mp3
-12.3048dBFS -0.5617dBFS 2.4343dB 07 - Sharpener's Calling Me Again (feat. Kina) - Cavetown.mp3
-7.7725dBFS 0.0000dBFS -2.0981dB 08 - Meet Me in the Woods - Lord Huron.mp3
-10.4332dBFS 0.0000dBFS 0.5626dB 09 - World Burn - Mean Girls (covered by Annapantsu).mp3
-9.3893dBFS 0.0000dBFS -0.4812dB 10 - What I Know Now - Leslie Kritzer, Beetlejuice Original Broadway Cast Recording Ensemble.mp3
-11.7401dBFS -0.6264dBFS 1.8695dB 11 - We're Through - The Hollies.mp3
-14.9380dBFS -1.4977dBFS 5.0674dB 12 - Catch You Catch Me - Cardcaptor Sakura.mp3
-16.2943dBFS 0.0000dBFS 6.4237dB 13 - I Don't Dance - High School Musical 2.mp3
-8.5112dBFS 0.0000dBFS -1.3594dB 14 - Everything Moves - Bronze Radio Return.mp3
-8.3120dBFS 0.0000dBFS -1.5586dB 15 - Shut It Down - Patent Pending.mp3
-25.5607dBFS -14.0065dBFS 15.6901dB 16 - 1 • 2 • 3 Pokemon Journeys OP - After the Rain.mp3
-11.3168dBFS 0.0000dBFS 1.4462dB 17 - Candle Queen - GHOST & Silverchordmusic (feat. Gumi English).mp3
-7.6292dBFS 0.0000dBFS -2.2413dB 18 - World's Smallest Violin - AJR.mp3
-7.4818dBFS 0.0000dBFS -2.3888dB 19 - Karma - OR3O.mp3
-8.5264dBFS 0.0000dBFS -1.3441dB 20 - Three-Thirty - AJR.mp3
-7.0809dBFS 0.0000dBFS -2.7897dB 21 - 3 O’Clock Things - AJR.mp3
-9.2129dBFS 0.0000dBFS -0.6577dB 22 - All Eyes On Me - OR3O.mp3
-9.7747dBFS 0.0000dBFS -0.0959dB 23 - Railroad Wrath - Cuphead OST.mp3
-11.8156dBFS 0.0000dBFS 1.9451dB 24 - 004 Fallen Down - Toby Fox.mp3
-13.4141dBFS 0.0000dBFS 3.5435dB 25 - 022 Snowdin Town - Toby Fox.mp3
-10.5288dBFS 0.0000dBFS 0.6582dB 26 - 014 Heartache - Toby Fox.mp3
-16.3542dBFS -5.1780dBFS 6.4836dB 27 - 033 Quiet Water - Toby Fox.mp3
-11.3877dBFS 0.0000dBFS 1.5172dB 28 - 063 It's Raining Somewhere Else - Toby Fox.mp3
-9.8706dBFS average level
Pour ce faire, il faut utiliser la fonction -n
de l'interrupteur.
$ normalize-audio -m *.mp3
Computing levels...
28 - 063 It's Rai 99% done, ETA 00:00:00 (batch 100% done, ETA 00:00:00)
Applying adjustment of -3.17dB to 01 - Danny Phantom theme.mp3...
01 - Danny Phanto 100% done, ETA 00:00:00 (batch 1% done, ETA 00:00:00)
Applying adjustment of -2.95dB to 02 - Way Less Sad - AJR.mp3...
02 - Way Less Sad 100% done, ETA 00:00:00 (batch 6% done, ETA 00:00:00)
Applying adjustment of 1.02dB to 03 - Ghost - Telehope.mp3...
03 - Ghost - Tele 100% done, ETA 00:00:00 (batch 9% done, ETA 00:00:00)
Applying adjustment of 0.71dB to 04 - Another One of Those Days - Cavetown.mp3...
04 - Another One 100% done, ETA 00:00:00 (batch 15% done, ETA 00:00:00)
...
...
Applying adjustment of 3.54dB to 25 - 022 Snowdin Town - Toby Fox.mp3...
25 - 022 Snowdin 100% done, ETA 00:00:00 (batch 93% done, ETA 00:00:00)
Applying adjustment of 0.66dB to 26 - 014 Heartache - Toby Fox.mp3...
26 - 014 Heartach 100% done, ETA 00:00:00 (batch 96% done, ETA 00:00:00)
Applying adjustment of 6.48dB to 27 - 033 Quiet Water - Toby Fox.mp3...
27 - 033 Quiet Wa 100% done, ETA 00:00:00 (batch 96% done, ETA 00:00:00)
Applying adjustment of 1.52dB to 28 - 063 It's Raining Somewhere Else - Toby Fox.mp3...
28 - 063 It's Rai 100% done, ETA 00:00:00 (batch 100% done, ETA 00:00:00)
NOTE : A utiliser avec précaution, car il écrasera vos fichiers existants. Si vous souhaitez préserver les fichiers originaux, vous pouvez simplement les dupliquer et travailler à partir des copies.
Autres scripts inclus
Si vous voulez garder plus de contrôle sur votre conversion, vous pouvez choisir d'utiliser l'un des deux autres scripts inclus, normalize-mp3
o normalize-ogg
.
$ dpkg -L normalize-audio | grep /usr/bin/no
/usr/bin/normalize-audio
/usr/bin/normalize-mp3
/usr/bin/normalize-ogg
L'utilisation de la normalize-mp3
script par exemple, vous pouvez spécifier de sauvegarder les originaux avant de les normaliser :
$ normalize-mp3 -m --backup *.mp3
Decoding 01 - Danny Phantom theme.mp3...
Decoding 02 - Way Less Sad - AJR.mp3...
Decoding 03 - Ghost - Telehope.mp3...
...
...
Decoding 27 - 033 Quiet Water - Toby Fox.mp3...
Decoding 28 - 063 It's Raining Somewhere Else - Toby Fox.mp3...
Running normalize...
Re-encoding 01 - Danny Phantom theme.mp3...
Re-encoding 02 - Way Less Sad - AJR.mp3...
Re-encoding 03 - Ghost - Telehope.mp3...
Re-encoding 04 - Another One of Those Days - Cavetown.mp3...
...
...
Re-encoding 26 - 014 Heartache - Toby Fox.mp3...
Re-encoding 27 - 033 Quiet Water - Toby Fox.mp3...
Re-encoding 28 - 063 It's Raining Somewhere Else - Toby Fox.mp3...
Ici, vous pouvez voir les fichiers sauvegardés avec un ~
ajouté à leur nom :
$ ls -l | head -7
total 220212
-rw-r--r-- 1 root users 897453 Apr 3 21:52 01 - Danny Phantom theme.mp3
-rw-r--r-- 1 root users 1711341 Apr 3 21:42 01 - Danny Phantom theme.mp3~
-rw-r--r-- 1 root users 3327405 Apr 3 21:52 02 - Way Less Sad - AJR.mp3
-rw-r--r-- 1 root users 6534189 Apr 3 21:42 02 - Way Less Sad - AJR.mp3~
-rw-r--r-- 1 root users 2944941 Apr 3 21:52 03 - Ghost - Telehope.mp3
-rw-r--r-- 1 root users 5572365 Apr 3 21:42 03 - Ghost - Telehope.mp3~
NOTE : Pour utiliser ces scripts, vous devrez vous assurer d'avoir mpg123
, oggenc
, oggdec
, & flac
installé pour réencoder des fichiers MP3, OGG ou FLAC.
Vous pouvez procéder de la manière suivante :
$ apt install mpg123 vorbis-tools flac
Références
- Réponses précédentes
- Plus de réponses