Я ищу способ нормализовать звук в МНОГИХ MP3-файлах, которые у меня есть. Некоторые из них имеют низкий звук, а другие громче, поэтому я должен увеличить или уменьшить громкость в зависимости от песни. Какие есть способы сделать это для всех файлов. Я специально хотел бы сделать это через терминал, но также принимаются способы графического интерфейса.
Посмотрите @ 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
, чтобы исправить некоторые проблемы с зависимостями.
С Audacity мы можем легко пакетно обработать файлов, чтобы применить преобразования или эффекты ко многим файлам в списке. Для этого мы сначала должны определить «Цепочку» , содержащую эффекты, которые мы хотим применить.
Это делается с помощью «Файл -> Редактировать цепочки ...» . В открывшемся окне нажмите кнопку Add в левом нижнем углу, чтобы вставить новую цепочку (дайте ей разумное имя):
Затем выберите эффект и его параметры для вставки в цепочку (здесь показаны значения по умолчанию и эффект нормализации).
Важно: нам всегда нужно также добавлять эффект «Экспорт MP3» (или любой другой формат экспорта) для сохранения полученного преобразования на диск.
blockquote>Когда закончите, выйдите из этого окна, нажав OK , чтобы открыть «Файл -> Применить цепочку ...» . Выберите только что созданную цепочку и загрузите все нужные вам файлы с помощью «Применить к файлам ...» . В открывшемся окне выбора файлов можно выбрать несколько файлов.
Обработанные файлы будут сохранены в новом подкаталоге , «очищены» по пути к оригиналу.
Sox
Начиная с версии> 14.3, мы можем использовать фильтр sox
--norm
для нормализации звука в командной строке или для пакетной обработки:sox --norm infile outfile
Добавлена поддержка MP3 в Sox с помощью libsox-fmt-all .
Я бы использовал этот проект Normalize , это инструмент командной строки для нормализации аудиофайлов. Похоже, именно то, что вам нужно. Может выполнять пакетную обработку и не требует повторной выборки в промежуточные форматы.
Он находится в репозитории пакета как normalize-audio, sudo apt-get install normalize-audio
. Это сборка, поддерживаемая Debian в апстриме, поэтому она должна быть в любом LTS или новее и построена с совместимостью с mp3 (проверено). Существует хорошая справочная страница man normalize-audio
для изучения опций, но команды по умолчанию работают хорошо. Для пакетной обработки (нормализации громкости по нескольким файлам), normalize-audio -b *.mp3
или укажите отдельные имена файлов вместо использования подстановочных знаков.
Ради этого я добавлю свои 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, так это то, что независимо от того, какие варианты я пробовал, я не мог получить все в своей коллекции точно такого же уровня дБ, чего я и хочу, чтобы мне никогда не приходилось регулировать громкость с один трек к другому. Этот скрипт делает именно это. Извините за то, что так долго одолевался. Надеюсь, это поможет.
В Ubuntu 16.04 у меня были проблемы с другими альтернативами CLI. Затем я нашел replaygain
:
Этот пакет предоставляет пакет Python для расчета значений Replay Gain для аудиофайлов и нормализации громкости этих файлов в соответствии со значениями. Поставляются также два основных скрипта, использующих эти возможности.
Replay Gain - это предлагаемый стандарт, разработанный для решения самой проблемы изменения громкости аудиофайлов.
Установить: sudo apt install python-rgain
.
replaygain --force *.mp3
-f, --force
Пересчитать усиление воспроизведения, даже если файл уже содержит информацию об усилении. Так как только вычислять / изменять значение воспроизведения можно и быстрее: со средним ПК (Intel i7-6500U, 8 ГБ ОЗУ): ~ 20 файлов / минуту.
Мне понравился ответ Neil больше всего, потому что он не представляет корреляцию между звуковыми файлами: просто выберите один уровень усиления и скорректируйте все к нему.
Однако у меня были некоторые проблемы при парсинге вывода normalize-ogg
с некоторыми файлами я имею. Существует также одна противная проблема с bc
: это не делает реального округления, это только усекает.
Таким образом, в конечном счете я разочаровался в сценариях оболочки и переместился в Python.
Note1: exiftool часть могла бы быть излишеством, но я хотел быть на 100% уверенным, что исходная скорость передачи будет сохранена.
Note2: это перезапишет оригиналы, если Вы захотите сохранить их, используйте - копируют в последней возможности нормализовать-ogg. Но я нашел более практичным для удержания копии отдельный, более безопасный, каталог.
Note3: это решение имеет дело с 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()
Это рекурсивно ffmpeg-нормализует
все .mp3
во всей структуре подпапки до частоты дискретизации 240k
find -name "*.mp3" -exec ffmpeg-normalize {} -b:a libmp3lame -b>a 240k \;
(вы можете изменить это для более высоких скоростей или используйте усиление вместо нормализации с тем же синтаксисом. Кто-нибудь?)
Еще один вариант для mp3gain — я только что использовал его для установки mp3gain на свой компьютер с Ubuntu 20.20 и его копирования через библиотеку по мере ввода
git clone https://github.com/Sound-Linux-More/mp3gain.git
cd mp3gain/
sudo apt-get install libmpg123-dev
make
sudo make install