Comment normaliser le son dans les fichiers mp3

35

Je cherche un moyen de normaliser le son dans BEAUCOUP de 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.

    
posée Luis Alvarado 22.01.2013 - 18:59
la source

6 réponses

21

Audacity

AvecAudacity,nouspouvonsfacilement traiter par lots des 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 souhaitons appliquer.

Cette opération est effectuée avec "Fichier - > Modifier les chaînes ..." . Dans la fenêtre qui s'ouvre maintenant, cliquez sur le bouton Ajouter en bas à gauche pour insérer une nouvelle chaîne (attribuez-lui un nom logique):

Choisissezensuitel'effetetsesparamètresàinsérerdanslachaîne(indiquéicipourlesvaleurspardéfautetl'effetNormaliser).

Important:wealwaysneedtoalsoaddtheeffect"Export MP3" (or any other export format) for saving the resulting conversion to disk.

Une fois terminé, quittez cette fenêtre avec OK pour ouvrir "Fichier - > Appliquer la 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.

Lesfichierstraitésserontenregistrésdansunnouveausous-répertoire"nettoyé" dans le chemin de l'original.

Sox

Àpartirdelaversion>14.3nouspouvonsutiliserlefiltresox--normpournormaliserl’audiosurlalignedecommandeoupourletraitementparlots:

sox--norminfileoutfile

LesupportMP3estajoutéàSoxavec libsox-fmt-all .

    
réponse donnée Takkat 22.01.2013 - 19:36
la source
29

Jetez un oeil sur @ mp3gain, ce qui pour moi est encore meilleur que normaliser-audio

mp3gain -r *.mp3

Une autre version utile pourrait être le -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 normaliser les pics, comme le font de nombreux normalisateurs. Au lieu de cela, il procède à une analyse statistique pour déterminer le volume du fichier par rapport à l'oreille humaine. Aussi, les changements        les marques 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 package a été supprimé . sur Ubuntu 15.04.

Debian propose le paquet python-rgain comme remplacement (l’avantage est que 'replaygain' prend en charge plusieurs formats de fichier, à savoir Ogg Vorbis, Flac, WavPack et MP3. Il vous permet également de visualiser les informations existantes relatives au gain de rejeu dans aucun de ces formats. types de fichier). 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 résoudre certains problèmes de dépendance.

    
réponse donnée Philippe Gachoud 27.09.2013 - 14:02
la source
13

J'utiliserais ce projet Normalize , un outil de ligne de commande permettant de normaliser des 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.

Cela se trouve dans les dépôts du paquet en tant que normalize-audio, sudo apt-get install normalize-audio . Ceci est une construction maintenue en amont par Debian, elle devrait donc figurer dans n'importe quel LTS ou plus récent 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.

    
réponse donnée sean_m 22.01.2013 - 19:09
la source
3

Pour le plaisir, je mets mes 2 centimes. Je cherchais exactement la même chose (uniquement pour les fichiers ogg) et je commençais un fil de discussion sur Crunchbang Forum. Vous pouvez le voir ici: Normalize-audio ne trouve pas le décodeur mp3

Fondamentalement, ma solution était le script de l'article n ° 8. Cela fonctionne pour les fichiers d’entrée mp3, flac et ogg, éventuellement avec 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 toutes 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 de base de données actuel 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 signalé dans mon fil de discussion 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 géniale et j’ai vraiment aimé. Le problème avec Normalize-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 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 que j’ai essayées, 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 à partir de une piste à la suivante. Ce script fait exactement cela. Désolé d'être si long. J'espère que cela vous aidera.

    
réponse donnée Neil 20.10.2013 - 13:18
la source
3

replaygain

Sous Ubuntu 16.04, j’ai eu des problèmes avec d’autres alternatives de la CLI. Puis j'ai trouvé replaygain :

This package provides a Python package to calculate the Replay Gain values of audio files and normalize the volume of those files according to the values. Two basic scripts exploiting these capabilities are shipped as well.

Replay Gain is a proposed standard designed to solve the very problem of varying volumes across audio files.

Installer: 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.

Etant donné que seulement calculer / modifier la valeur de replaygain, est également plus rapide: Avec un PC moyen (Intel i7-6500U, 8 Go de RAM): ~ 20 fichiers / minute.

Référence

réponse donnée Pablo Bianchi 22.03.2017 - 21:01
la source
0

J'ai beaucoup aimé 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.

Cependant, j'ai eu quelques problèmes pour analyser la sortie de normalize-ogg avec certains fichiers que j'ai. Il y a aussi un problème avec bc : il ne fait pas l'arrondissement, il ne fait que tronquer.

Donc, 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ûre à 100% que le débit binaire d'origine serait préservé.

Note2: cela va écraser les originaux. Si vous souhaitez les conserver, utilisez --backup lors du dernier appel à normalize-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 __name__ == "__main__":
    initlogger(logfile="normalize.log", consolelevel=logging.WARNING)
    parallelregain()
    
réponse donnée Igor Stoppa 23.04.2017 - 17:48
la source

Lire d'autres questions sur les étiquettes