Comment normaliser le son dans les fichiers mp3

39

Je cherche un moyen de normaliser le son dans de nombreux fichiers MP3 que j'ai. Certains ont un son faible, alors que d'autres sont plus forts, je dois donc 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.

Luis Alvarado
la source
Pour normaliser en jouant, consultez: askubuntu.com/questions/95716/… . Cela ne changera cependant pas le contenu de votre fichier mp3 - peut être un avantage;)
Takkat
Pas tout en jouant, vous ne voulez pas avoir à le régler à chaque fois ou laisser un joueur régler la normalisation à chaque fois que je veux écouter les chansons. Par exemple, disons que je veux copier les chansons sur un iPod shuffle ou sur une clé USB pour les écouter sur un lecteur compatible MP3.
Luis Alvarado
@Takkat BTW bien fait dans cette autre question. Bonne information.
Luis Alvarado
1
Ma femme vient de tester la méthode Audacity, et cela a fonctionné parfaitement! Conseillé. S'il vous plaît, quand les gens demandent des conseils, c'est parce qu'ils ne sont PAS des experts. Donc, ne leur dites pas d’utiliser des outils en ligne de commande quand ils peuvent faire le travail avec des outils graphiques faciles à comprendre comme Audacity. Dire aux nouveaux utilisateurs Linux d’ouvrir un terminal et d’exécuter des outils de ligne de commande ne leur fera que fuir Ubuntu, avec le sentiment que Windows est simple, que Linux est difficile. Ce n'est pas une surprise que DOS soit mort, mais Windows est en vie.
C'est une bonne chose que votre femme ait pu comprendre la manière graphique, mais avez-vous oublié la partie où la personne qui pose la question voulait spécifiquement y répondre via le terminal?
RichardP

Réponses:

22

Audace

Avec Audacity, nous pouvons facilement 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 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 (donnez-lui un nom raisonnable):

entrez la description de l'image ici

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 également toujours ajouter l’effet "Export MP3" (ou tout autre format d’exportation) pour enregistrer la conversion obtenue sur disque.

Une fois terminé, quittez cette fenêtre en cliquant sur OK pour ouvrir "Fichier -> Appliquer la chaîne ..." . Sélectionnez la chaîne que nous venons de créer et chargez tous les fichiers dont vous avez besoin avec "Appliquer aux fichiers ..." . Plusieurs fichiers peuvent être sélectionnés dans le sélecteur de fichiers qui s’ouvre.

entrez la description de l'image ici

Les fichiers traités seront enregistrés dans un nouveau sous-répertoire "nettoyé" dans le chemin d'origine.


SoX

A partir de la version> 14.3, nous pouvons utiliser le filtre sox --normpour normaliser l'audio en ligne de commande ou pour le traitement par lots:

sox --norm infile outfile

Le support MP3 est ajouté à Sox avec libsox-fmt-all:

sudo apt install sox libsox-fmt-all
Takkat
la source
2
Est-ce que ces outils décodent et réencodent?
Qed
Vous ne pouvez pas normaliser sans ré-encoder, au moins les niveaux ...
Takkat
Pour une normalisation en direct non destructive à l'aide de LADSPA et de pulseaudio, consultez le site Web askubuntu.com/questions/95716/…
Takkat,
Ceci ré-encode, donc cela réduit la qualité. Voir ma réponse si vous voulez préserver la qualité de votre fichier. Le recodage n’est pas nécessaire si votre lecteur prend en charge le balisage de volume.
Wil
1
vous pouvez utiliser sox dans un lotfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77
30

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 normaliser les pics, 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 python-rgainpaquet en remplacement (l’avantage est que 'replaygain' supporte plusieurs formats de fichiers, à savoir Ogg Vorbis, Flac, WavPack et MP3. En outre, il vous permet d’afficher des informations sur le gain de rejeu existant 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 .debfichier 14.04 (le plus récent) à partir d’ ici . Installez comme d'habitude. Après cela, vous devez exécuter sudo apt-get -f installpour corriger certains problèmes de dépendance.

Philippe Gachoud
la source
1
De plus, si vous ne voulez pas utiliser le terminal, il existe une interface utilisateur graphique appelée easymp3gain-gtk, ce qui le rend très pratique!
gilbertohasnofb
C'est super utile. J'ai été très impressionné par la qualité de la normalisation à l'aide de l'interface graphique Windows de MP3Gain. J'ai donc été ravi de trouver cette réponse lorsque j'avais besoin d'une solution de ligne de commande Linux. Je recommanderais certainement à d'autres.
Alex P. Miller
Pourriez-vous s'il vous plaît ajouter quelques informations sur la façon de l'installer? Il ne vient pas avec Ubuntu par défaut et je ne trouve pas le paquet.
Commentaires
Merci ... installé python-rgain sans aucune erreur de dépendance sur Ubuntu 16.04.
Bharat Mallapur
installer avecmkdir 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
rubo77 le
14

Je voudrais utiliser ce projet Normaliser , 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.

Il est dans les prises en pension de paquet comme Normaliser 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 man normalize-audiode manuel 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 *.mp3ou spécifier des noms de fichiers individuels au lieu d'utiliser des caractères génériques.

sean_m
la source
Le PO veut des instructions pour le faire. Pouvez-vous fournir ceux-ci?
Seth
@ iSeth J'étais initialement incorrect sur le commentaire source seulement parce que je ne pouvais pas le trouver avec la recherche apt-cache. J'ai mis à jour avec des détails sur le paquet deb.
Sean_m
Cela semble être une bonne alternative, mais vous ne pouvez pas trouver le bon codeur et vous débarrasser de "pas de codeur disponible" . Essayé avec libsox-fmt-mp3, libavcodec-extra. -b *.mp3faire quelque chose avec un seul fichier (aléatoire?).
Pablo Un
4

rejouer

Plus rapide et facile replaygain:

Ce paquet fournit un paquet Python pour calculer les valeurs de gain de relecture des fichiers audio et normaliser le volume de ces fichiers en fonction de ces 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 de volumes entre fichiers audio.

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.

É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 d'environ 20 fichiers / minute.

Référence

Pablo A
la source
3

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 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 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 original: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

contre.

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 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 grande et j'ai vraiment aimé. Le problème avec Normalize-Audio 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 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 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.

Neil
la source
0

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-oggcertains 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é le script 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 binaire d'origine serait préservé.

Note2: ceci écrasera les originaux, si vous voulez 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()
Igor Stoppa
la source