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


39

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


Для нормалізації під час гри дивіться: askubuntu.com/questions/95716/… . Це, однак, не змінить вміст вашого mp3-файлу - можливо,
виграє

Не граючи, не хочуть встановлювати це щоразу або програвач встановлювати нормалізацію кожного разу, коли я хочу слухати пісні. Наприклад, скажімо, що я хочу скопіювати пісні на переклад ipod або на привід пера, щоб слухати mp3-програвач.
Луїс Альварадо

@Takkat BTW чудово зроблено в тому іншому питанні. Хороша інформація.
Луїс Альварадо

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

Чудово, що ваша дружина змогла розібратися графічно, але ви пропустили ту частину, де особа, яка задає питання, спеціально хотіла досягти цього через термінал?
RichardP

Відповіді:


22

Сміливість

За допомогою Audacity ми можемо легко створювати файли обробних процесів, щоб застосувати перетворення або ефекти до багатьох файлів у списку. Для цього нам спочатку потрібно визначити "Ланцюжок", що містить ефекти, які ми хочемо застосувати.

Це робиться за допомогою "Файл -> Редагувати ланцюги ..." . У вікні, що зараз відкривається, натисніть кнопку Додати внизу зліва, щоб вставити новий ланцюжок (дайте йому розумну назву):

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

Потім виберіть ефект і його параметри потрібно вставити у ланцюг (тут показано значення за замовчуванням та ефект Normalize).

Важливо: нам завжди потрібно також додати ефект "Експорт MP3" (або будь-який інший формат експорту) для збереження отриманого перетворення на диск.

По завершенні залиште це вікно кнопкою ОК, щоб відкрити "Файл -> Застосувати ланцюг ..." . Виберіть ланцюжок, яку ми тільки що створили, і завантажте всі необхідні вам файли з "Застосувати до файлів ..." . Можна вибрати декілька файлів із вибору файла, який відкриється.

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

Оброблені файли будуть збережені в новому підкаталозі, "очищеному" на шляху оригіналу.


SoX

З версії> 14.3 ми можемо використовувати сокс-фільтр --normдля нормалізації звуку в командному рядку або для пакетної обробки:

sox --norm infile outfile

MP3-підтримка додана Sox з libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
Чи декодують та перекодують ці інструменти?
qed

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

Про неруйнівну нормалізацію живлення з
Takkat

Це робить перекодування, тому знижує якість. Дивіться мою відповідь, якщо ви хочете зберегти якість файлу. Перекодування не потрібно, якщо ваш плеєр підтримує тег гучності.
Віл

1
використовувати sox у партії, яку ви можете використовуватиfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77

30

Погляньте @ mp3gain, що для мене навіть краще, ніж нормалізувати звук

mp3gain -r *.mp3

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

mp3gain -c -r *.mp3

як сказано на сторінці чоловіка:

mp3gain не просто робить пікову нормалізацію, як це роблять багато нормалізаторів. Натомість він робить деякий статистичний аналіз, щоб визначити, наскільки голосно файл насправді звучить людському вуху. Крім того, зміни, які вносить mp3gain, є абсолютно без втрат. Якість не втрачається в зміні, оскільки програма безпосередньо налаштовує mp3-файл, без декодування та повторного кодування.

Примітка . Цей пакет було видалено спеціально на ubuntu 15.04.

Debian пропонує python-rgainпакет як заміну (Перевага полягає в тому, що функція "перезавантаження" підтримує декілька форматів файлів, а саме 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 GUI MP3Gain, тому я був радий знайти цю відповідь, коли мені потрібне рішення командного рядка Linux. Однозначно рекомендую іншим.
Алекс П. Міллер

Не могли б ви додати трохи інформації про її встановлення? Він не поставляється з Ubuntu за замовчуванням, і я не можу знайти пакет.
Błażej Michalik

Дякую ... встановлено 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 , це інструмент командного рядка для нормалізації звукових файлів. Схоже, саме те, що вам потрібно. Може робити пакетну обробку і не вимагає перекомпонування в проміжні формати.

Це в пакеті РЕПО як нормалізують-аудіо sudo apt-get install normalize-audio. Це збірка, яку підтримує Debian, тому вона повинна бути в будь-якому LTS або більш новій версії, і вона побудована з сумісністю mp3 (перевірена). Існує хороша сторінка man normalize-audioдля вивчення параметрів, але, як видається, за замовчуванням команди працюють добре. Для пакетної обробки (нормалізація обсягу в декількох файлах) normalize-audio -b *.mp3або вкажіть окремі імена файлів замість використання символів.


ОП хоче інструкцій щодо цього. Ви можете їх надати?
Сет

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

Це здається гарною альтернативою, але не вдається знайти правильний кодер і позбутися від "недоступного кодера" . Пробував з libsox-fmt-mp3, libavcodec-extra. -b *.mp3зробити щось лише з одним (випадковим?) файлом.
Пабло А

4

відтворити

Швидше і простіше replaygain:

Цей пакет надає пакет Python для обчислення значень посилення відтворення аудіофайлів та нормалізації гучності цих файлів відповідно до значень. Два основних сценарії, що використовують ці можливості, також поставляються.

Replay Gain - це запропонований стандарт, розроблений для вирішення самої проблеми щодо різного обсягу в аудіофайлах.

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

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

Оскільки лише обчислити / змінити значення відтворення, це також швидше: із середнім ПК (Intel i7-6500U, 8 Гб оперативної пам’яті) швидкість склала ~ 20 файлів / хвилину.

Довідково


3

Заради цього я закину свої 2 копійки. Я шукав саме те саме (лише для файлів ogg) і розпочав нитку на форумі Crunchbang. Ви можете переглянути його тут: нормалізація-аудіо не може знайти mp3-декодер

В основному моїм рішенням був сценарій у посту №8. Він працює для вхідних файлів mp3, flac та ogg, можливо, інших, але, безумовно, не для WAV.

Просто створіть файл (назвіть його все, що завгодно, я назвав mine db_adjust_mp3), chmod + x, і вставте його у папку ~ / bin. Він також заповнює будь-які відсутні дані кодека. Приклад:

Оригінальний файл: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

vs.

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

Я змінив сценарій, щоб використовувати нормалізувати-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

Цей сценарій обчислює різницю між поточним рівнем db та -12db, потім застосовує коригування посилення, щоб поставити коефіцієнт підсилення точно на -12db, що, як я знайшов, працює найкраще для мене. Він також є рекурсивним, що робить його чудовим для створення цілих колекцій музики або файлів у багатьох підпапках. Якщо ви хочете встановити інший рівень db, просто змініть обидва екземпляри числа "12" на будь-який рівень db, який ви хочете використовувати. Як я публікував у своїй темі Crunchbang, використання полягає в наступному:

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

Однак, коли я зберігав свою музичну бібліотеку у форматі mp3, я також використовував mp3gain, як і запропонував Філіпп. Мертва простота його велика, і мені це дуже сподобалось. Проблема нормалізації звуку, однак, полягає в тому, що він декодує повторно ендокодування файлів, тому є деяка деградація звуку. Але якщо ви не аудіофіл, а ваші mp3 кодуються на високому бітрейті, ви не повинні помічати великої різниці.

Що я помітив у програмі mp3gain, це те, що незалежно від того, які варіанти я намагався, я не зміг зробити так, щоб все в моїй колекції було точно таким же рівнем db, що я хочу, щоб мені ніколи не довелося регулювати гучність з однієї доріжки на наступний. Цей сценарій робить саме це. Вибачте за те, що так довго звивали. Сподіваюсь, це допомагає.


0

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

Однак у мене були проблеми з розбором результатів роботи normalize-oggз деякими файлами. Існує також одна неприємна проблема з bcтим, що вона не робить справжнього округлення, вона лише скорочує.

Тож врешті-решт я відмовився від сценаріїв оболонок і перейшов до python.

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

Примітка2: це замінить оригінали, якщо ви хочете їх зберегти, використовуйте --backup в останньому дзвінку, щоб нормалізувати-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.