Come normalizzare l'audio nei file mp3


39

Sto cercando un modo per normalizzare il suono in MOLTI file MP3 che ho. Alcuni hanno un suono basso, mentre altri sono più forti, quindi devo alzare o abbassare il volume a seconda della canzone. Quali modi ci sono per farlo per tutti i file. In particolare, vorrei farlo tramite il terminale, ma sono accettati anche i modi della GUI.


Per la normalizzazione durante il gioco, consultare: askubuntu.com/questions/95716/… . Questo, tuttavia, non cambierà il contenuto del tuo file mp3 - potrebbe essere di vantaggio;)
Takkat,

Non durante il gioco, non voglio impostarlo ogni volta o fare in modo che un lettore imposti la normalizzazione ogni volta che voglio ascoltare le canzoni. Ad esempio, diciamo che voglio copiare i brani su un iPod shuffle o su una pen drive per ascoltarli in un lettore mp3.
Luis Alvarado,

@Takkat BTW ben fatto in quell'altra domanda. Buona informazione
Luis Alvarado,

1
Mia moglie ha appena testato il metodo Audacity e ha funzionato perfettamente! Consigliato. Per favore, quando le persone chiedono consigli è perché NON sono esperti. Quindi non dire loro di usare gli strumenti della riga di comando quando possono fare il lavoro con strumenti grafici di facile comprensione come Audacity. Dire ai nuovi utenti di Linux di aprire terminali ed eseguire strumenti da riga di comando li spaventerà da Ubuntu, con la sensazione che Windows sia semplice, Linux è difficile. Non è una sorpresa che DOS sia morto, ma Windows è vivo.

È bello che tua moglie sia stata in grado di capire il modo grafico, ma ti è sfuggita la parte in cui la persona che ha posto la domanda ha voluto realizzarlo tramite il terminale?
RichardP,

Risposte:


22

Audacia

Con Audacity possiamo facilmente elaborare in batch i file per applicare conversioni o effetti a molti file in un elenco. Per fare ciò dobbiamo prima definire una "Catena" contenente gli effetti che vogliamo applicare.

Questo viene fatto con "File -> Modifica catene ..." . Nella finestra che si apre ora premi il pulsante Aggiungi in basso a sinistra per inserire una nuova catena (assegnagli un nome ragionevole):

inserisci qui la descrizione dell'immagine

Quindi scegli l'effetto e i relativi parametri da inserire nella catena (qui mostrati per i valori predefiniti e l'effetto Normalizza).

Importante: dobbiamo sempre aggiungere anche l'effetto "Esporta MP3" (o qualsiasi altro formato di esportazione) per salvare la risultante conversione su disco.

Al termine, lasciare questa finestra con OK per aprire "File -> Applica catena ..." . Seleziona la catena che abbiamo appena creato e carica tutti i file necessari con "Applica ai file ..." . Diversi file possono essere selezionati dal selettore file che si apre.

inserisci qui la descrizione dell'immagine

I file elaborati verranno salvati in una nuova sottodirectory "ripulita" nel percorso dell'originale.


SoX

Dalla versione> 14.3 possiamo usare il filtro sox --normper normalizzare l'audio dalla riga di comando o per l'elaborazione batch:

sox --norm infile outfile

Il supporto MP3 è stato aggiunto a Sox con libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
Questi strumenti decodificano e ricodificano?
Qed

Non puoi normalizzare senza ricodificare, almeno i livelli ...
Takkat,

Per la normalizzazione live non distruttiva utilizzando LADSPA e pulseaudio, consultare askubuntu.com/questions/95716/…
Takkat,

Questo ricodifica, quindi riduce la qualità. Vedi la mia risposta se vuoi preservare la qualità del tuo file. La ricodifica non è necessaria se il lettore supporta il volume tagging.
Wil

1
per usare sox in un batch puoi usarefor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77,

30

Dai un'occhiata a mp3gain che per me è persino meglio di normalizzare l'audio

mp3gain -r *.mp3

un'altra versione utile potrebbe essere -c che impedisce di chiedere se si desidera apportare le modifiche per molti file:

mp3gain -c -r *.mp3

come detto nella pagina man:

mp3gain non esegue solo la normalizzazione di picco, come fanno molti normalizzatori. Al contrario, esegue alcune analisi statistiche per determinare la rumorosità effettiva del file sull'orecchio umano. Inoltre, le modifiche apportate da mp3gain sono completamente senza perdita di dati. Non c'è perdita di qualità nella modifica perché il programma regola direttamente il file mp3, senza decodifica e ricodifica.

Nota : quel pacchetto è stato rimosso di proposito su Ubuntu 15.04.

Debian propone il python-rgainpacchetto come sostituto (Il vantaggio è che 'replaygain' supporta diversi formati di file, vale a dire Ogg Vorbis, Flac, WavPack e MP3. Inoltre, consente di visualizzare le informazioni esistenti su Replay Gain in uno di questi tipi di file). Dopo averlo installato, esegui replaygain.

Per installare python-rgain dal terminale, eseguire il comando

sudo apt-get install python-rgain

In alternativa, ottenere il .debfile per 14.04 (l'ultimo) da qui . Installa come al solito. Successivamente, è necessario eseguire sudo apt-get -f installper correggere alcuni problemi di dipendenze.


1
Inoltre, se non si desidera utilizzare il terminale, è disponibile una GUI denominata easymp3gain-gtk, che lo rende molto utile!
Gilbertohasnofb,

Questo è super utile. Sono rimasto molto colpito dalla qualità della normalizzazione tramite la GUI di Windows di MP3Gain, quindi sono stato felice di trovare questa risposta quando avevo bisogno di una soluzione da riga di comando di Linux. Lo consiglierei sicuramente ad altri.
Alex P. Miller,

Potresti aggiungere alcune informazioni su come installarlo? Ubuntu non viene fornito per impostazione predefinita e non riesco a trovare il pacchetto.
Błażej Michalik,

Grazie ... installato python-rgain senza errori di dipendenza su Ubuntu 16.04.
Bharat Mallapur,

installare conmkdir 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 il

14

Vorrei usare questo progetto Normalize , è uno strumento da riga di comando per normalizzare i file audio. Sembra essere esattamente ciò di cui hai bisogno. Può eseguire l'elaborazione in batch e non richiede il ricampionamento in formati intermedi.

E 'nei repository pacchetto come normalizzare-audio, sudo apt-get install normalize-audio. Questa è una build mantenuta a monte da Debian, quindi dovrebbe essere in qualsiasi LTS o più recente ed è costruita con compatibilità mp3 (testata). C'è una buona manpage man normalize-audioper esplorare le opzioni ma i comandi predefiniti sembrano funzionare bene. Per l'elaborazione in batch (normalizzare il volume su più file) normalize-audio -b *.mp3o specificare singoli nomi di file anziché utilizzare caratteri jolly.


L'OP vuole istruzioni per farlo. Potete fornire quelli?
Seth,

@iSeth Inizialmente non ero corretto riguardo al solo commento della fonte perché non riuscivo a trovarlo con la ricerca nella cache apt. Ho aggiornato con i dettagli sul pacchetto deb.
sean_m,

Questa sembra una buona alternativa ma non riesco a trovare l'encoder corretto e sbarazzarsi di "nessun encoder disponibile" . Provato con libsox-fmt-mp3, libavcodec-extra. -b *.mp3fare qualcosa con un solo file (casuale?).
Pablo A

4

ReplayGain

Più veloce e facile replaygain:

Questo pacchetto fornisce un pacchetto Python per calcolare i valori di Replay Gain dei file audio e normalizzare il volume di tali file in base ai valori. Vengono inoltre forniti due script di base che sfruttano queste funzionalità.

Replay Gain è uno standard proposto progettato per risolvere il problema stesso della variazione dei volumi tra i file audio.

Installare: sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force Ricalcola Replay Gain anche se il file contiene già informazioni di guadagno.

Poiché calcola / modifica solo il valore del replaygain, è anche più veloce: con un PC medio (Intel i7-6500U, 8 GB di RAM) la velocità era di ~ 20 file / minuto.

Riferimento


3

Per il gusto, lancerò i miei 2 centesimi. Stavo cercando esattamente la stessa cosa (solo per i file ogg) e ho iniziato una discussione al Forum di Crunchbang. Puoi visualizzarlo qui: Normalize-audio non trova decoder mp3

Fondamentalmente la mia soluzione era la sceneggiatura nel post n. 8. Funziona con file di input mp3, flac e ogg, possibilmente altri ma sicuramente non wav.

Basta creare un file (chiamalo come vuoi, l'ho chiamato mio db_adjust_mp3), chmod + x e incollalo nella tua cartella ~ / bin. Riempie anche tutti i dati mancanti del codec. Esempio:

File originale: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

vs.

File normalizzato: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo

Ho modificato lo script per usare normalize-mp3 qui in modo da poterlo usare se vuoi:

#!/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

Questo script calcola la differenza tra l'attuale livello di db e -12db, quindi applica una regolazione del guadagno per mettere il guadagno esattamente a -12db, che è quello che ho trovato funziona meglio per me. È anche ricorsivo, il che lo rende perfetto per fare intere raccolte o file musicali in molte sottocartelle. Se si desidera impostare un livello db diverso, è sufficiente modificare entrambe le istanze del numero "12" in qualunque livello db si desideri utilizzare. Come ho pubblicato nel mio thread di Crunchbang, l'utilizzo è il seguente:

normalize-mp3 <directory> <file extenstion(with no leading dot)> <bitrate>

Tuttavia, quando tenevo la mia libreria musicale in formato mp3, usavo anche mp3gain, proprio come suggeriva Philippe. La semplicità morta è fantastica e mi è davvero piaciuta. Il problema con normalize-audio però è che decodifica un re-endcode dei file, quindi c'è un certo degrado del suono. Ma se non sei un audiofilo e i tuoi mp3 sono codificati con un bitrate elevato, non dovresti notare molta differenza.

La cosa che ho notato con mp3gain è che, indipendentemente dalle opzioni che ho provato, non sono riuscito a far sì che tutto nella mia collezione fosse esattamente allo stesso livello di db, che è quello che voglio in modo da non dover mai regolare il volume da una traccia a il prossimo. Questo script fa esattamente questo. Scusa se sono così a lungo senza fiato. Spero che sia di aiuto.


0

Mi è piaciuta di più la risposta di Neil, perché non introduce correlazione tra i file audio: basta scegliere un livello di guadagno e adattare tutto su di esso.

Tuttavia, ho riscontrato alcuni problemi durante l'analisi dell'output di normalize-oggalcuni file che ho. C'è anche un brutto problema con bc: non fa un vero arrotondamento, ma si tronca.

Quindi alla fine ho rinunciato allo scripting della shell e sono passato a Python.

Nota 1: la parte exiftool potrebbe essere eccessiva ma volevo essere sicuro al 100% che il bitrate originale sarebbe stato preservato.

Nota2: questo sovrascriverà gli originali, se vuoi preservarli, usa --backup nell'ultima chiamata per normalizzare-ogg. Ma ho trovato più pratico conservare una copia in una directory separata, più sicura.

Nota 3: questa soluzione si occupa di file ogg, ma è banale adattarlo a mp3, basta sostituire le occorrenze di "ogg" con "mp3".

Ecco la mia opinione sul problema. L'ultima versione può essere trovata qui: 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.