Как нормализовать звук в mp3 файлах


39

Я ищу способ нормализовать звук в МНОГИХ MP3-файлах, которые у меня есть. Некоторые из них имеют низкий звук, а другие громче, поэтому я должен увеличить или уменьшить громкость в зависимости от песни. Какие есть способы сделать это для всех файлов. Я специально хотел бы сделать это через терминал, но способы GUI также принимаются.


Для нормализации во время игры смотрите: askubuntu.com/questions/95716/… . Это, однако, не изменит содержание вашего mp3 файла - это может быть преимуществом;)
Takkat

Не во время игры, я не хочу устанавливать его каждый раз или заставлять проигрыватель устанавливать нормализацию каждый раз, когда я хочу слушать песни. Например, допустим, я хочу скопировать песни на iPod Shuffle или на флешку для прослушивания в MP3-плеере.
Луис Альварадо

@Takkat Кстати, хорошо сделано в этом другом вопросе. Хорошая информация
Луис Альварадо

1
Моя жена только что проверила метод Audacity, и он работал отлично! Рекомендуемые. Пожалуйста, когда люди спрашивают совета, это потому, что они НЕ эксперты. Поэтому не говорите им использовать инструменты командной строки, когда они могут выполнять работу с простыми для понимания графическими инструментами, такими как Audacity. Попросить новых пользователей Linux открыть терминал и запустить инструменты командной строки просто отпугнет их от Ubuntu с ощущением, что Windows проста, Linux сложна. Неудивительно, что DOS мертв, а Windows жива.

Здорово, что твоя жена смогла понять графический способ, но ты упустил ту часть, где человек, задающий вопрос, специально хотел добиться этого через терминал?
RichardP

Ответы:


22

дерзость

С помощью Audacity мы можем легко пакетировать файлы процессов, чтобы применять преобразования или эффекты ко многим файлам в списке. Для этого сначала нужно определить «цепь», содержащую эффекты, которые мы хотим применить.

Это делается с помощью «Файл -> Редактировать цепочки ...» . В открывшемся окне нажмите кнопку « Добавить» в левом нижнем углу, чтобы вставить новую цепочку (дайте ей разумное имя):

введите описание изображения здесь

Затем выберите эффект и его параметры для вставки в цепочку (здесь показаны значения по умолчанию и эффект нормализации).

Важно: нам всегда нужно также добавлять эффект «Экспорт MP3» (или любой другой формат экспорта) для сохранения полученного преобразования на диск.

Когда закончите, оставьте это окно с OK, чтобы открыть «Файл -> Применить цепочку ...» . Выберите только что созданную цепочку и загрузите все нужные вам файлы с помощью «Применить к файлам ...» . В открывшемся окне выбора файлов можно выбрать несколько файлов.

введите описание изображения здесь

Обработанные файлы будут сохранены в новом подкаталоге, «очищенном» по пути к оригиналу.


SoX

С версии> 14.3 мы можем использовать фильтр sox --normдля нормализации звука в командной строке или для пакетной обработки:

sox --norm infile outfile

В Sox добавлена ​​поддержка MP3 с помощью libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
Эти инструменты декодируют и перекодируют?
Qed

Вы не можете нормализовать без перекодирования, по крайней мере, уровней ...
Таккат

Для неразрушающего нормализации жизни с использованием LADSPA и pulseaudio см. Askubuntu.com/questions/95716/…
Takkat

Это перекодирует, поэтому снижает качество. Смотрите мой ответ, если вы хотите сохранить качество файла. Перекодирование не требуется, если ваш плеер поддерживает тегирование громкости.
Уил

1
использовать sox в пакете, который вы можете использоватьfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77

30

Посмотрите @ mp3gain, что для меня даже лучше, чем normalize-audio

mp3gain -r *.mp3

другой полезной версией может быть -c, которая не спрашивает, хотите ли вы внести изменения для многих файлов:

mp3gain -c -r *.mp3

как сказано в справочной странице:

mp3gain не просто выполняет пиковую нормализацию, как многие нормализаторы. Вместо этого он выполняет некоторый статистический анализ, чтобы определить, насколько громко файл на самом деле звучит для человеческого уха. Кроме того, изменения, сделанные mp3gain, абсолютно без потерь. При изменении не теряется качество, поскольку программа корректирует mp3-файл напрямую, без декодирования и перекодирования.

Примечание . Этот пакет был специально удален в Ubuntu 15.04.

Debian предлагает python-rgainпакет в качестве замены (преимущество заключается в том, что replaygain поддерживает несколько форматов файлов, а именно Ogg Vorbis, Flac, WavPack и MP3. Кроме того, он позволяет просматривать информацию о коэффициенте усиления воспроизведения в любом из этих типов файлов). После установки запустите replaygain.

Чтобы установить python-rgain из терминала, выполните команду

sudo apt-get install python-rgain

В качестве альтернативы, получите .debфайл для 14.04 (самый последний) отсюда . Установите как обычно. После этого вам нужно запустить, sudo apt-get -f installчтобы исправить некоторые проблемы с зависимостями.


1
Кроме того, если вы не хотите использовать терминал, для него доступен графический интерфейс с именем easymp3gain-gtk, что делает его очень удобным!
gilbertohasnofb

Это супер полезно. Я был очень впечатлен качеством нормализации с помощью графического интерфейса Windows MP3Gain, поэтому я был рад найти этот ответ, когда мне нужно решение для командной строки Linux. Определенно рекомендую другим.
Алекс П. Миллер

Не могли бы вы добавить информацию о том, как его установить? Он не поставляется с Ubuntu по умолчанию, и я не могу найти пакет.
Блажей Михалик

Спасибо ... установил python-rgain без каких-либо ошибок зависимостей на Ubuntu 16.04.
Бхарат Маллапур

установить сmkdir 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

14

Я бы использовал этот проект Normalize , это инструмент командной строки для нормализации аудио файлов. Похоже, именно то, что вам нужно. Может выполнять пакетную обработку и не требует повторной выборки в промежуточные форматы.

Это в репозитории пакета как Normalize-Audio sudo apt-get install normalize-audio. Это сборка, поддерживаемая Debian в апстриме, поэтому она должна быть в любом LTS или новее и построена с совместимостью с mp3 (проверено). Существует хорошая справочная страница man normalize-audioдля изучения вариантов, но команды по умолчанию, кажется, работают хорошо. Для пакетной обработки (нормализации громкости по нескольким файлам) normalize-audio -b *.mp3или укажите отдельные имена файлов вместо использования подстановочных знаков.


ОП хочет инструкции для этого. Можете ли вы предоставить те?
Сет

@iSeth Сначала я ошибался в комментарии только к источнику, потому что не смог найти его с помощью поиска в apt-cache. Я обновил информацию о пакете deb.
sean_m

Это кажется хорошей альтернативой, но не может найти правильный кодировщик и избавиться от «недоступного кодировщика» . Пробовал с libsox-fmt-mp3, libavcodec-extra. -b *.mp3сделать что-то только с одним (случайным?) файлом.
Пабло А

4

ReplayGain

Быстрее и проще replaygain:

Этот пакет предоставляет пакет Python для расчета значений усиления воспроизведения звуковых файлов и нормализации объема этих файлов в соответствии со значениями. Также поставляется два основных скрипта, использующих эти возможности.

Replay Gain - это предлагаемый стандарт, разработанный для решения самой проблемы разной громкости аудиофайлов.

Установка: sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force Пересчитать усиление воспроизведения, даже если файл уже содержит информацию об усилении.

Так как только вычислять / изменять значение воспроизведения можно и быстрее: со средним ПК (Intel i7-6500U, 8 ГБ ОЗУ) скорость составляла ~ 20 файлов / минуту.

Ссылка


3

Ради этого я добавлю свои 2 цента. Я искал точно такую ​​же вещь (только для файлов ogg) и начал тему на форуме Crunchbang. Вы можете просмотреть его здесь: Normalize-audio не может найти mp3-декодер

В основном моим решением был сценарий в посте № 8. Он работает для входных файлов mp3, flac и ogg, возможно, других, но определенно не wav.

Просто создайте файл (назовите его как хотите, я назвал его db_adjust_mp3), chmod + x и вставьте его в папку ~ / bin. Он также заполняет все недостающие данные кодека. Пример:

Исходный файл: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

против

Нормализованный файл: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo

Я изменил скрипт для использования normalize-mp3 здесь, чтобы вы могли использовать его, если хотите:

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

Этот скрипт вычисляет разницу между текущим уровнем дБ и -12 дБ, затем применяет регулировку усиления, чтобы установить усиление точно на -12 дБ, что, как я обнаружил, работает лучше всего для меня. Он также рекурсивный, что делает его идеальным для создания целых музыкальных коллекций или файлов во многих подпапках. Если вы хотите установить другой уровень БД, просто измените оба экземпляра числа «12» на тот уровень БД, который вы хотели бы использовать. Как я писал в своей ветке Crunchbang, использование выглядит следующим образом:

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

Однако, когда я держал свою музыкальную библиотеку в формате mp3, я также использовал mp3gain, как и предлагал Филипп. Мертвая простота этого великолепна, и мне очень понравилось. Однако проблема с normalize-audio заключается в том, что он декодирует файлы с повторным концом, поэтому происходит некоторое ухудшение звука. Но если вы не меломан и ваши mp3 не закодированы с высокой скоростью передачи, вы не заметите большой разницы.

Однако, что я заметил с mp3gain, так это то, что независимо от опций, которые я пробовал, я не мог сделать так, чтобы все в моей коллекции было точно такого же уровня дБ, чего я и хочу, чтобы мне никогда не приходилось регулировать громкость от одной дорожки до следующий. Этот скрипт делает именно это. Извините за то, что так долго одолевался. Надеюсь это поможет.


0

Мне больше всего понравился ответ Нейла, потому что он не вводит корреляцию между аудиофайлами: просто выберите один уровень усиления и настройте все под него.

Однако у меня были некоторые проблемы с синтаксическим анализом вывода normalize-oggс некоторыми файлами, которые у меня есть. Есть еще одна неприятная проблема bc: он не выполняет реальное округление, он только усекает.

В конце концов я отказался от написания сценариев оболочки и перешел на python.

Примечание 1: часть exiftool может быть излишней, но я хотел быть на 100% уверен, что исходный битрейт будет сохранен.

Примечание 2: это перезапишет оригиналы, если вы хотите сохранить их, используйте --backup в последнем вызове normalize-ogg. Но я нашел более практичным хранить копию в отдельном, более безопасном каталоге.

Примечание 3: это решение имеет дело с файлами ogg, но адаптировать его к mp3 просто, просто заменив вхождения «ogg» на «mp3».

Вот мой взгляд на проблему. Последнюю версию можно найти здесь: 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()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.