web-dev-qa-db-fra.com

Comment normaliser le son dans les fichiers mp3

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.

38
Luis Alvarado

AudacityInstall audacity

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):

enter image description here

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.

enter image description here

Les fichiers traités seront sauvegardés dans un nouveau sous-répertoire "nettoyé" dans le chemin de l'original.


Sox Install sox

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 Install libsox-fmt-all .

22
Takkat

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.

29
Philippe Gachoud

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.

14
sean_m

rejouer

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.

Référence

4
Pablo Bianchi

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.

3
Neil

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()
0
Igor Stoppa