Cara menormalkan suara dalam file mp3


39

Saya mencari cara untuk menormalkan suara dalam file MP3 BANYAK yang saya miliki. Beberapa memiliki suara rendah, sementara yang lain lebih keras sehingga saya harus menaikkan atau menurunkan volume tergantung pada lagunya. Cara apa yang ada untuk melakukan ini untuk semua file. Saya secara khusus ingin melakukannya melalui terminal tetapi cara GUI juga diterima.


Untuk normalisasi saat bermain, lihat: askubuntu.com/questions/95716/… . Namun ini tidak akan mengubah konten file mp3 Anda - mungkin bermanfaat;)
Takkat

Tidak saat bermain, tidak ingin harus mengaturnya setiap kali atau memiliki pemain mengatur normalisasi setiap kali saya ingin mendengarkan lagu. Sebagai contoh, katakanlah saya ingin menyalin lagu ke ipod shuffle atau ke pen drive untuk mendengarkan di pemutar yang mampu mp3.
Luis Alvarado

@Takkat BTW dilakukan dengan baik dalam pertanyaan lain itu. Informasi yang baik
Luis Alvarado

1
Istri saya baru saja menguji metode Audacity, dan itu berhasil dengan sempurna! Direkomendasikan. Tolong, ketika orang meminta nasihat, itu karena mereka BUKAN ahli. Jadi jangan katakan kepada mereka untuk menggunakan alat baris perintah ketika mereka dapat melakukan pekerjaan dengan alat grafis yang mudah dipahami seperti Audacity. Memberitahu pengguna Linux baru untuk membuka terminal dan menjalankan alat-alat command line hanya akan menakuti mereka dari Ubuntu, dengan perasaan bahwa Windows itu sederhana, Linux itu sulit. Bukan kejutan bahwa DOS sudah mati, tetapi Windows masih hidup.

Sungguh hebat istrimu dapat menemukan cara grafisnya, tetapi apakah Anda melewatkan bagian di mana orang yang mengajukan pertanyaan secara khusus ingin mencapainya melalui terminal?
RichardP

Jawaban:


22

Keberanian

Dengan Audacity kita dapat dengan mudah mengelompokkan file untuk menerapkan konversi atau efek ke banyak file dalam daftar. Untuk melakukannya, pertama-tama kita harus mendefinisikan "Rantai" yang berisi efek yang ingin kita terapkan.

Ini dilakukan dengan "File -> Edit Chains ..." . Di jendela yang sekarang terbuka tekan tombol Tambah di kiri bawah untuk memasukkan rantai baru (berikan nama yang masuk akal):

masukkan deskripsi gambar di sini

Kemudian pilih efek dan parameter itu untuk dimasukkan ke rantai (di sini ditampilkan untuk nilai default dan efek Normalisasi).

Penting: kita selalu perlu menambahkan efek "Ekspor MP3" (atau format ekspor lainnya) untuk menyimpan konversi yang dihasilkan ke disk.

Setelah selesai tinggalkan jendela ini dengan OK untuk membuka "File -> Apply Chain ..." . Pilih Rantai yang baru saja kita buat dan muat semua file yang Anda butuhkan dengan "Terapkan ke file ..." . Beberapa file dapat dipilih dari pemilih file yang terbuka.

masukkan deskripsi gambar di sini

File yang diproses akan disimpan dalam subdirektori baru "dibersihkan" di jalur aslinya.


SoX

Dari versi> 14.3 kita dapat menggunakan filter sox --normuntuk menormalkan audio pada baris perintah atau untuk pemrosesan batch:

sox --norm infile outfile

Dukungan MP3 ditambahkan ke Sox dengan libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
Apakah alat-alat ini memecahkan kode dan menyandikan ulang?
qed

Anda tidak dapat menormalkan tanpa penyandian ulang, setidaknya level ...
Takkat

Untuk normalisasi langsung non-destruktif menggunakan LADSPA dan pulseaudio lihat askubuntu.com/questions/95716/…
Takkat

Ini mengkode ulang, sehingga mengurangi kualitas. Lihat jawaban saya jika Anda ingin mempertahankan kualitas file Anda. Pengkodean ulang tidak diperlukan jika pemain Anda mendukung penandaan volume.
Wil

1
untuk menggunakan sox dalam batch yang dapat Anda gunakanfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77

30

Lihatlah keuntungan @ mp3 yang bagi saya bahkan lebih baik daripada normalisasi-audio

mp3gain -r *.mp3

versi lain yang bermanfaat adalah -c yang mencegah untuk bertanya apakah Anda ingin melakukan perubahan untuk banyak file:

mp3gain -c -r *.mp3

seperti yang dikatakan di halaman manual:

mp3gain tidak hanya melakukan normalisasi puncak, seperti yang dilakukan banyak normalizer. Sebagai gantinya, ia melakukan beberapa analisis statistik untuk menentukan seberapa keras file tersebut sebenarnya terdengar di telinga manusia. Juga, perubahan mp3gain membuat sepenuhnya lossless. Tidak ada kualitas yang hilang dalam perubahan karena program menyesuaikan file mp3 secara langsung, tanpa decoding dan re-encoding.

Catatan : Paket itu sengaja dihapus di ubuntu 15.04.

Debian mengusulkan python-rgainpaket sebagai pengganti (Keuntungannya adalah 'replaygain' mendukung beberapa format file, yaitu Ogg Vorbis, Flac, WavPack dan MP3. Selain itu, Debian memungkinkan Anda untuk melihat informasi Replay Gain yang ada di salah satu tipe file tersebut). Setelah menginstalnya, jalankan replaygain.

Untuk menginstal python-rgain dari terminal, jalankan perintah

sudo apt-get install python-rgain

Atau, dapatkan .debfile untuk 14,04 (terbaru) dari sini . Instal seperti biasa. Setelah itu, Anda perlu menjalankan sudo apt-get -f installuntuk memperbaiki beberapa masalah dependensi.


1
Juga, jika Anda tidak ingin menggunakan terminal, ada GUI yang tersedia untuknya bernama easymp3gain-gtk, yang membuatnya sangat berguna!
gilbertohasnofb

Ini sangat berguna. Saya sangat terkesan dengan kualitas normalisasi menggunakan Windows GUI MP3Gain, jadi saya senang menemukan jawaban ini ketika saya membutuhkan solusi baris perintah Linux. Pasti akan merekomendasikan kepada orang lain.
Alex P. Miller

Bisakah Anda menambahkan beberapa informasi tentang cara menginstalnya? Itu tidak datang dengan Ubuntu secara default, dan saya tidak dapat menemukan paket.
Błażej Michalik

Terima kasih ... memasang python-rgain tanpa ada kesalahan ketergantungan pada Ubuntu 16.04.
Bharat Mallapur

instal denganmkdir 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

Saya akan menggunakan proyek ini Normalisasi , ini adalah alat baris perintah untuk menormalkan file audio. Tampaknya persis seperti yang Anda butuhkan. Dapat melakukan pemrosesan batch dan tidak perlu melakukan resampling ke format perantara.

Ada dalam paket repos sebagai normalisasi-audio sudo apt-get install normalize-audio,. Ini adalah build yang dikelola oleh Debian sehingga harus dalam LTS apa pun atau yang lebih baru dan dibangun dengan kompatibilitas mp3 (diuji). Ada manual yang baik man normalize-audiountuk menjelajahi opsi-opsi tetapi perintah-perintah defaultnya tampaknya bekerja dengan baik. Untuk pemrosesan batch (menormalkan volume di beberapa file), normalize-audio -b *.mp3atau tentukan nama file individual alih-alih menggunakan wildcard.


OP menginginkan instruksi untuk melakukan ini. Bisakah Anda menyediakannya?
Seth

@ iSeth Awalnya saya salah tentang sumber hanya komentar karena saya tidak dapat menemukannya dengan pencarian apt-cache. Saya telah memperbarui dengan detail tentang paket deb.
sean_m

Ini tampaknya alternatif yang baik tetapi tidak dapat menemukan encoder yang benar dan menyingkirkan "tidak ada encoder yang tersedia" . Mencoba dengan libsox-fmt-mp3, libavcodec-extra. -b *.mp3lakukan sesuatu hanya dengan satu file (acak?).
Pablo A

4

replaygain

Lebih cepat dan mudah replaygain:

Paket ini menyediakan paket Python untuk menghitung nilai Replay Gain file audio dan menormalkan volume file-file sesuai dengan nilai-nilai. Dua skrip dasar yang mengeksploitasi kemampuan ini juga dikirimkan.

Replay Gain adalah standar yang diusulkan yang dirancang untuk memecahkan masalah berbagai volume di file audio.

Install: sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force Hitung Ulang Replay Gain bahkan jika file tersebut sudah berisi informasi gain.

Karena hanya menghitung / mengubah nilai replaygain, juga lebih cepat: Dengan PC rata-rata (Intel i7-6500U, 8GB RAM), nilainya ~ 20 file / menit.

Referensi


3

Demi itu, saya akan memasukkan 2 sen saya. Saya mencari hal yang persis sama (hanya untuk file ogg) dan memulai utas di Forum Crunchbang. Anda dapat melihatnya di sini: Normalisasi-audio tidak dapat menemukan decoder mp3

Pada dasarnya solusi saya adalah skrip di posting # 8. Ini berfungsi untuk file input mp3, flac, dan ogg, mungkin yang lain tetapi jelas tidak wav.

Cukup buat file (beri nama apa pun yang Anda inginkan, saya memanggil mine db_adjust_mp3), chmod + x, dan menempelkannya di folder ~ / bin Anda. Itu mengisi setiap data codec yang hilang juga. Contoh:

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

vs.

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

Saya telah memodifikasi skrip untuk menggunakan normalize-mp3 di sini sehingga Anda dapat menggunakannya jika Anda mau:

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

Script ini menghitung perbedaan antara level db saat ini dan -12db, kemudian menerapkan penyesuaian gain untuk menempatkan gain pada tepat -12db, yang menurut saya merupakan yang terbaik bagi saya. Itu juga rekursif, yang membuatnya bagus untuk melakukan seluruh koleksi musik atau file di banyak subfolder. Jika Anda ingin mengatur level db yang berbeda, cukup ubah kedua instance dari angka "12" ke level db apa pun yang ingin Anda gunakan. Seperti yang saya posting di utas Crunchbang saya, penggunaannya adalah sebagai berikut:

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

Namun, ketika saya biasa menyimpan perpustakaan musik saya dalam format mp3, saya juga menggunakan mp3gain, seperti yang disarankan Philippe. Kemudahan kesederhanaannya sangat bagus dan saya sangat menyukainya. Masalahnya dengan menormalkan-audio adalah bahwa itu memang decode end-endcode file, sehingga ada beberapa degradasi suara. Tetapi kecuali Anda seorang audiophile dan mp3 Anda dikodekan pada bitrate tinggi, Anda tidak akan melihat banyak perbedaan.

Hal yang saya perhatikan dengan keuntungan mp3 adalah bahwa tidak peduli pilihan apa yang saya coba, saya tidak bisa mendapatkan semuanya dalam koleksi saya dengan level db yang persis sama, yang saya inginkan sehingga saya tidak perlu menyesuaikan volume dari satu trek ke trek yang lain. selanjutnya. Script ini melakukan hal itu. Maaf karena tele panjang. Semoga ini membantu.


0

Saya paling suka jawaban Neil, karena itu tidak memperkenalkan korelasi antara file audio: cukup pilih satu tingkat gain dan sesuaikan semuanya.

Namun saya punya beberapa masalah dalam mengurai output normalize-oggdengan beberapa file yang saya miliki. Ada juga satu masalah buruk bc: tidak melakukan pembulatan nyata, hanya memotong.

Jadi akhirnya saya menyerah pada skrip shell dan pindah ke python.

NOTE1: bagian ExifTool mungkin berlebihan tapi aku ingin menjadi 100% yakin bahwa bitrate asli akan dipertahankan.

Note2: ini akan menimpa yang asli, jika Anda ingin melestarikannya, gunakan --backup di panggilan terakhir untuk menormalkan-ogg. Tetapi saya menemukan lebih praktis untuk menyimpan salinan di direktori yang terpisah, lebih aman,.

Note3: solusi ini berkaitan dengan file ogg, tetapi mudah untuk menyesuaikannya dengan mp3, cukup ganti kemunculan "ogg" dengan "mp3".

Inilah pendapat saya. Versi terbaru dapat ditemukan di sini: 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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.