Je cherche un moyen de normaliser le son dans de nombreux fichiers MP3 que j'ai. Certains ont un son faible, tandis que d'autres sont plus forts, donc je dois augmenter ou diminuer le volume en fonction de la chanson. Quels sont les moyens de le faire pour tous les fichiers. Je voudrais spécialement le faire via le terminal mais les interfaces graphiques sont également acceptées.
Avec Audacity, nous pouvons facilement traitement par lots fichiers pour appliquer des conversions ou des effets à de nombreux fichiers d'une liste. Pour ce faire, nous devons d’abord définir une "chaîne" contenant les effets que nous voulons appliquer.
Ceci est fait avec "Fichier -> Editer les chaînes ..." . Dans la fenêtre qui s'ouvre maintenant, appuyez sur le bouton Ajouter en bas à gauche pour insérer une nouvelle chaîne (nommez-le de manière judicieuse):
Ensuite, choisissez l’effet et ses paramètres à insérer dans la chaîne (les valeurs par défaut et l’effet Normaliser apparaissent ici).
Important: nous devons toujours ajouter également l'effet "Export MP3" (ou tout autre format d'exportation) pour enregistrer la conversion obtenue sur disque.
Lorsque vous avez terminé, laissez cette fenêtre avec OK pour ouvrir "Fichier -> Appliquer une chaîne ..." . Sélectionnez la chaîne que nous venons de créer et chargez tous les fichiers nécessaires avec "Appliquer aux fichiers ..." . Plusieurs fichiers peuvent être sélectionnés dans le sélecteur de fichiers qui s’ouvre.
Les fichiers traités seront sauvegardés dans un nouveau sous-répertoire "nettoyé" dans le chemin de l'original.
A partir de la version> 14.3, nous pouvons utiliser le filtre sox --norm
pour normaliser l'audio sur la ligne de commande ou pour le traitement par lots:
sox --norm infile outfile
Le support MP3 est ajouté à Sox avec libsox-fmt-all .
Jetez un oeil à @ mp3gain, ce qui pour moi est encore meilleur que normaliser-audio
mp3gain -r *.mp3
une autre version utile pourrait être -c, qui empêche de vous demander si vous souhaitez effectuer les modifications pour de nombreux fichiers:
mp3gain -c -r *.mp3
comme indiqué dans la page de manuel:
mp3gain ne fait pas que la normalisation de pointe, comme le font de nombreux normalisateurs. Au lieu de cela, il procède à une analyse statistique pour déterminer le niveau sonore du fichier pour l’oreille humaine. En outre, les modifications apportées par mp3gain sont totalement sans perte. La qualité n’est pas perdue lors de la modification car le programme ajuste le fichier mp3 directement, sans décodage ni réencodage.
Remarque : Ce paquet a été supprimé volontairement sur Ubuntu 15.04.
Debian propose le paquet python-rgain
en remplacement (l’avantage est que 'replaygain' prend en charge plusieurs formats de fichier, à savoir Ogg Vorbis, Flac, WavPack et MP3. En outre, il vous permet d’afficher des informations existantes sur le gain de relecture dans l’un de ces types de fichiers). Après l’avoir installé, lancez replaygain
.
Pour installer python-rgain à partir du terminal, exécutez la commande
Sudo apt-get install python-rgain
Vous pouvez également obtenir le fichier .deb
pour 14.04 (le plus récent) auprès de ici . Installez comme d'habitude. Après cela, vous devez exécuter Sudo apt-get -f install
pour corriger certains problèmes de dépendance.
Je voudrais utiliser ce projet Normalize , c'est un outil de ligne de commande pour normaliser les fichiers audio. Semble être exactement ce dont vous avez besoin. Peut traiter par lots et ne nécessite pas de ré-échantillonnage vers des formats intermédiaires.
C'est dans le paquet reposant comme normalize-audio, Sudo apt-get install normalize-audio
. Ceci est une construction maintenue en amont par Debian, elle devrait donc être dans n'importe quelle version LTS ou plus récente et est construite avec la compatibilité mp3 (testée). Il existe une bonne page de manuel man normalize-audio
pour explorer les options, mais les commandes par défaut semblent bien fonctionner. Pour le traitement par lots (normaliser le volume sur plusieurs fichiers), normalize-audio -b *.mp3
ou spécifiez des noms de fichiers individuels au lieu d'utiliser des caractères génériques.
Plus rapide et facile replaygain
:
Ce package fournit un package Python pour calculer les valeurs Replay Gain des fichiers audio et normaliser le volume de ces fichiers en fonction des valeurs. Deux scripts de base exploitant ces fonctionnalités sont également livrés.
Replay Gain est une proposition de norme conçue pour résoudre le problème même de la variation des volumes d’un fichier audio à l’autre.
Installez: Sudo apt install python-rgain
.
replaygain --force *.mp3
-f, --force
Recalculer le gain de relecture même si le fichier contient déjà des informations sur le gain.Étant donné que seul le calcul/la modification de la valeur de répétition est également plus rapide: avec un PC moyen (Intel i7-6500U, 8 Go de RAM), le débit était de ~ 20 fichiers/minute.
Pour le plaisir, je vais jeter mes 2 centimes. Je cherchais exactement la même chose (uniquement pour les fichiers ogg) et j'ai lancé un fil de discussion sur Crunchbang Forum. Vous pouvez le voir ici: Normalize-audio ne trouve pas de décodeur mp
Fondamentalement, ma solution était le script de l'article n ° 8. Cela fonctionne pour les fichiers d’entrée mp3, flac et ogg, éventuellement d’autres fichiers, mais certainement pas avec wav.
Créez simplement un fichier (nommez-le comme vous voulez, j'ai appelé le mien db_adjust_mp3), chmod + x, et collez-le dans votre dossier ~/bin. Il remplit également les données de codec manquantes. Exemple:
Fichier d'origine: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:
vs.
Fichier normalisé: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo
J'ai modifié le script pour qu'il utilise normalize-mp3 afin que vous puissiez l'utiliser si vous le souhaitez:
#!/bin/bash
find "$1" -iname "*.""$2" > $HOME/file_list
cat $HOME/file_list | while read line; do
# echo "$line"
orig_gain="$(normalize-mp3 -n "$line" | cut -d 'd' -f1)"
larger=$(echo "$orig_gain"'>'-12 | bc)
if [[ larger ]]
then
gain_difference=$(echo "$orig_gain"*-1-12 | bc)
else
gain_difference=$(echo "$orig_gain"-12 | bc)
fi
echo "Gain Difference will be: $gain_difference""db"
normalize-ogg --mp3 --bitrate "$3" -g "$gain_difference""db" -v "$line"
done
Ce script calcule la différence entre le niveau actuel de la base de données et -12 dB, puis applique un ajustement du gain pour que le gain soit exactement à -12 dB, ce qui, selon moi, fonctionne le mieux pour moi. Il est également récursif, ce qui le rend idéal pour créer des collections de musique entières ou des fichiers dans de nombreux sous-dossiers. Si vous souhaitez définir un niveau de base de données différent, remplacez simplement les deux instances du nombre "12" par le niveau de base de données que vous souhaitez utiliser. Comme je l'ai posté dans mon fil Crunchbang, l'utilisation est la suivante:
normalize-mp3 <directory> <file extenstion(with no leading dot)> <bitrate>
Cependant, lorsque je conservais ma bibliothèque musicale au format mp3, j’utilisais aussi mp3gain, comme l’a suggéré Philippe. La simplicité morte de celui-ci est grande et j'ai vraiment aimé. Le problème avec normaliser-audio, c’est qu’il décode les codes de nouveau code, ce qui entraîne une dégradation du son. Mais à moins que vous ne soyez un audiophile et que vos fichiers MP3 soient codés à un débit binaire élevé, vous ne devriez pas remarquer beaucoup de différence.
Ce que j’ai remarqué avec mp3gain, c’est que quelles que soient les options choisies, je ne pouvais pas obtenir le même niveau de base de données dans ma collection. C’est ce que je veux pour ne jamais avoir à ajuster le volume d’une piste à l’autre. le suivant. Ce script fait exactement cela. Désolé d'être si long. J'espère que cela t'aides.
J'aime beaucoup la réponse de Neil, car elle n'introduit pas de corrélation entre les fichiers audio: il suffit de choisir un niveau de gain et de tout ajuster en conséquence.
Cependant, j'ai eu quelques problèmes pour analyser la sortie de normalize-ogg
avec certains fichiers que j'ai. Il existe également un problème épineux avec bc
: il ne fait pas l’arrondissement réel, il ne fait que tronquer.
Alors, finalement, j'ai abandonné les scripts Shell et je suis passé à Python.
Note1: La partie exiftool est peut-être excessive, mais je voulais être sûr à 100% que le débit d'origine serait préservé.
Note2: cela va écraser les originaux, si vous voulez les conserver, utilisez --backup dans le dernier appel à normaliser-ogg. Mais j’ai trouvé plus pratique de conserver une copie dans un répertoire séparé, plus sûr.
Note3: cette solution traite les fichiers ogg, mais il est trivial de l'adapter au format mp3, il suffit de remplacer les occurrences de "ogg" par "mp3".
Voici mon point de vue sur le problème. La dernière version peut être trouvée 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 __== "__main__":
initlogger(logfile="normalize.log", consolelevel=logging.WARNING)
parallelregain()