Mp3 dosyalarında ses normalleştirmek nasıl


39

Sahip olduğum MANY MP3 dosyalarındaki sesi normalleştirmek için bir yol arıyorum. Bazılarının sesi düşük, diğerleri yüksek sesle, bu yüzden şarkıya bağlı olarak sesi açmam ya da azaltmam gerekiyor. Tüm dosyalar için bunu yapmak için hangi yolları vardır. Özellikle terminal üzerinden yapmak istiyorum, ancak GUI yolları da kabul ediliyor.


Oynarken normalleşmek için bakınız: askubuntu.com/questions/95716/… . Ancak bu mp3 dosya içeriğinizi değiştirmez - avantajlı olabilir;)
Takkat

Oynarken değil, her zaman ayarlamak zorunda kalmamak veya şarkıları her dinlemek istediğimde normalleştirmesini ayarlamak istemiyorum. Örneğin, mp3 özellikli bir oynatıcıyı dinlemek için şarkıları bir ipod shuffle'a veya bir pen sürücüye kopyalamak istediğimi söyleyelim.
Luis Alvarado,

@Takkat BTW diğer soruya güzelce uyuyor. İyi bilgi.
Luis Alvarado,

1
Karım Audacity yöntemini test etti ve mükemmel çalıştı! Önerilen. Lütfen, insanlar tavsiye istediğinde bunun nedeni uzman değillerdir. Bu yüzden, Audacity gibi kolay anlaşılır grafiksel araçlarla işi yapabildiklerinde komut satırı araçlarını kullanmalarını söyleme. Yeni Linux kullanıcılarına terminal açma ve komut satırı araçlarını çalıştırmalarını söylemek, onları basitçe Linux'un zor olduğunu düşünerek Ubuntu'dan uzak tutacaktır. DOS’un ölmüş olması bir sürpriz değil, ancak Windows yaşıyor.

Eşinizin grafiksel yolu çözebilmesi harika, ama soruyu soran kişinin özellikle terminal üzerinden ulaşmak istediği kısmı kaçırdınız mı?
RichardP

Yanıtlar:


22

küstahlık

Audacity ile , bir listedeki birçok dosyaya dönüşüm veya efekt uygulamak için işlem dosyalarını kolayca topluyoruz . Bunu yapmak için önce uygulamak istediğimiz etkileri içeren bir "Zincir" tanımlamamız gerekir .

Bu, "Dosya -> Zincirleri Düzenle ..." ile yapılır . Şimdi açılan pencerede, yeni bir zincir eklemek için sol alt kısımdaki Ekle düğmesine basın (makul bir isim verin):

görüntü tanımını buraya girin

Sonra efekti seçin ve zincire eklenecek parametreleri (burada varsayılan değerler ve Normalize efekti için gösterilmiştir).

Önemli: Elde edilen dönüştürmeyi diske kaydetmek için her zaman "MP3'ü Dışa Aktar" (veya başka bir dışa aktarma formatı) efekti eklememiz gerekir .

İşlem tamamlandığında, "Dosya -> Zinciri Uygula ..." açmak için bu pencereyi OK ile bırakın . Yeni oluşturduğumuz Zinciri seçin ve ihtiyacınız olan tüm dosyaları "Dosyalara uygula ..." ile yükleyin . Açılan dosya seçiciden birkaç dosya seçilebilir.

görüntü tanımını buraya girin

İşlenen dosyalar orijinalin yolunda "temizlenmiş" yeni bir alt dizine kaydedilecektir .


SOX

> 14.3 sürümünden itibaren sox filtresini --normkomut satırındaki sesi normalleştirmek için veya toplu işleme için kullanabiliriz:

sox --norm infile outfile

Sox'a libsox-fmt-all ile MP3 desteği eklendi:

sudo apt install sox libsox-fmt-all

2
Bu araçlar kod çözülür ve yeniden kodlanır mı?
qed

Yeniden kodlama olmadan normalleştiremezsiniz, en azından seviyeler ...
Takkat

LADSPA ve pulseaudio kullanarak tahribatsız canlı normalleştirme için bkz. Askubuntu.com/questions/95716/…
Takkat

Bu yeniden kodlanır, böylece kaliteyi düşürür. Dosya kalitenizi korumak istiyorsanız cevabımı görün. Oynatıcınız ses etiketlemeyi destekliyorsa, yeniden kodlama gerekmez.
Wil,

1
sox kullanabileceğiniz bir toplu iş kullanmak içinfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77

30

Benim için normalize-ses daha iyi olan mp3gain bir göz atın

mp3gain -r *.mp3

Başka bir kullanışlı sürüm, birçok dosya için değişiklikleri yapmak isteyip istemediğinizi sormayı engelleyen -c olabilir:

mp3gain -c -r *.mp3

man sayfasında dediğim gibi:

mp3gain , pek çok normalleştiricinin yaptığı gibi sadece normalleştirme işlemini gerçekleştirmez. Bunun yerine, dosyanın gerçekte insan kulağına ne kadar yüksek ses çıkardığını belirlemek için bazı istatistiksel analizler yapar. Ayrıca mp3gain'in yaptığı değişiklikler tamamen kayıpsız. Değişimde kalite kaybı yoktur çünkü program mp3 dosyasını kod çözme ve yeniden kodlama olmadan doğrudan ayarlar.

Not : Bu paket, ubuntu 15.04 tarihinde bilerek kaldırılmıştır .

Debian python-rgainpaketi değiştirmeyi önermektedir ('Replaygain' özelliği, Ogg Vorbis, Flac, WavPack ve MP3 gibi çeşitli dosya formatlarını desteklemektedir. Ayrıca, mevcut Replay Gain bilgilerini bu dosya türlerinden herhangi birinde görüntülemenizi sağlar). Kurduktan sonra çalıştırın replaygain.

Terminalden python-rgain'i kurmak için komutu çalıştırın.

sudo apt-get install python-rgain

Alternatif olarak, elde .debden (en yeni) 14.04 için dosyayı buraya . Her zamanki gibi yükleyin. Bundan sonra, sudo apt-get -f installbazı bağımlılık sorunlarını düzeltmek için kaçmanız gerekir .


1
Ayrıca, terminali kullanmak istemiyorsanız, easymp3gain-gtk adında bir GUI vardır, bu da onu kullanışlı kılar!
gilbertohasnofb

Bu süper kullanışlıdır. MP3Gain'in Windows GUI'sini kullanarak normalleştirme kalitesinden çok etkilendim, bu yüzden bir Linux komut satırı çözümüne ihtiyaç duyduğumda bu cevabı bulduğuma sevindim. Kesinlikle başkalarına tavsiye ederim.
Alex P. Miller

Lütfen nasıl kurulacağı hakkında biraz bilgi ekler misiniz? Varsayılan olarak Ubuntu ile gelmiyor ve paketi bulamıyorum.
Błażej Michalik

Teşekkürler ... yüklü python-rgain, Ubuntu 16.04'te herhangi bir bağımlılık hatası olmadan.
Bharat Mallapur 13:18

ile yüklemkdir 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 19

14

Bu projeyi normalize ederdim , ses dosyalarını normalleştirmek için kullanılan bir komut satırı aracı. Tam olarak ihtiyacın olan şey gibi görünüyor. Toplu işleme yapabilir ve ara formatlara yeniden örnekleme gerektirmez.

Bu paket repos normalize-ses olarak sudo apt-get install normalize-audio. Bu Debian tarafından sağlanan bir yapıdır, bu nedenle LTS'de veya daha yeni bir şeyde olmalı ve mp3 uyumluluğu ile üretilmiştir (test edilmiştir). man normalize-audioSeçenekleri keşfetmek için iyi bir sayfa var, ancak komutların varsayılanları iyi çalışıyor gibi görünüyor. Toplu işleme için (birden fazla dosyadaki birimi normalleştirme) normalize-audio -b *.mp3veya joker karakterler kullanmak yerine tek tek dosya adları belirtin.


OP bunu yapmak için talimatlar istiyor. Bunları sağlayabilir misin?
Seth

@Iseth Başlangıçta sadece kaynak hakkında yorum yanlıştı çünkü apt-cache search ile bulamadım. Deb paketiyle ilgili detayları güncellendi.
sean_m

Bu iyi bir alternatif gibi görünüyor, ancak doğru kodlayıcıyı bulamıyor ve "kodlayıcı yok" ifadesinden kurtulamıyorum . İle çalıştı libsox-fmt-mp3, libavcodec-extra. -b *.mp3tek bir (rastgele?) dosya ile bir şey yapmak.
Pablo A

4

Yeniden kazan

Daha hızlı ve kolay replaygain:

Bu paket, ses dosyalarının Replay Gain değerlerini hesaplamak ve bu dosyaların ses seviyesini değerlere göre normalleştirmek için bir Python paketi sunar . Bu yeteneklerden yararlanan iki temel komut dosyası da gönderilir.

Replay Gain, ses dosyalarındaki değişken hacimlerin problemini çözmek için tasarlanmış bir standarttır.

Yükleyin: sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force Yeniden Hesapla Yeniden Oynat Dosya zaten kazanç bilgisi içeriyor olsa bile Kazanç.

Yeniden oynatma değerini yalnızca hesapla / değiştirdiğinden, daha hızlı olduğu için: Ortalama bir PC (Intel i7-6500U, 8GB RAM) ile hız ~ 20 dosya / dakika idi.

Referans


3

Onun uğruna, 2 kuruşumu içeri atacağım. Tam olarak aynı şeyi arıyordum (sadece ogg dosyaları için) ve Crunchbang Forum'da bir iş parçacığı başlattım. Burada görüntüleyebilirsiniz: Normalize-audio mp3 kod çözücüyü bulamıyor

Temel olarak benim çözümüm 8 numaralı yazıdaki senaryo oldu. MP3, flac ve ogg giriş dosyaları için çalışıyor, muhtemelen diğerleri ancak kesinlikle wav değil.

Sadece bir dosya oluşturun (ne istersen onu adlandır, benimkini db_adjust_mp3 olarak adlandırdım), chmod + x ve ~ / bin klasörüne yapıştır. Herhangi bir eksik kodek verisini de dolduruyor. Örnek:

Orijinal dosya: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

vs.

Normalleştirilmiş dosya: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo

Burada normalize-mp3 kullanmak için betiği değiştirdim, böylece isterseniz kullanabilirsiniz:

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

Bu komut dosyası, mevcut db seviyesi ile -12db arasındaki farkı hesaplar, daha sonra kazancı tam olarak -12db'ye koymak için bir kazanç ayarı uygular, ki bu benim için en uygun olanı bulur. Aynı zamanda özyinelemelidir, bu da birçok alt klasördeki tüm müzik koleksiyonlarını veya dosyaları yapmak için mükemmeldir. Farklı bir db seviyesi belirlemek istiyorsanız, "12" sayısının her iki örneğini de kullanmak istediğiniz db seviyesine getirin. Crunchbang iplikime gönderdiğim gibi kullanım şu şekilde:

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

Ancak, müzik kütüphanemi mp3 formatında tutarken, Philippe'nin önerdiği gibi mp3gain'i kullanırdım. Ölü basitliği çok güzel ve gerçekten hoşuma gitti. Normalize-audio ile ilgili sorun, dosyaların yeniden kodlanmasının kodunun çözülmemesidir, bu yüzden bazı ses bozulmaları vardır. Ancak bir audiophile değilseniz ve mp3'leriniz yüksek bir bit hızında kodlanmış değilse, çok fazla fark görmemelisiniz.

Mp3gain ile dikkatimi çeken şey, hangi seçenekleri denediğim önemli değil, koleksiyonumdaki her şeyi tam olarak aynı db seviyesine getiremedim, istediğim bu; sonraki. Bu komut tam olarak bunu yapar. Çok uzun zamandır soluduğu için özür dilerim. Bu yardımcı olur umarım.


0

En çok Neil'in cevabını beğendim, çünkü ses dosyaları arasında korelasyon sağlamıyor: sadece bir kazanç seviyesi seçip her şeyi ona göre ayarla.

Ancak normalize-oggbazı dosyaların çıktılarını ayrıştırmada bazı sorunlar yaşadım. Aynı zamanda kötü bir konu var bc: gerçek yuvarlama yapmıyor, sadece kesiliyor.

Sonunda kabuk yazmasından vazgeçtim ve pitona geçtim.

Not1: Exiftool kısmı fazlaca olabilir ama orijinal bit hızının korunacağından% 100 emin olmak istedim.

Not 2: Bu edecektir üzerine siz, onları korumak normalize-ogg son çağrısında --backup kullanmak istiyorsanız, orijinalleri. Ancak bir kopyasını ayrı, daha güvenli bir dizinde tutmak için daha pratik buldum.

Not3: Bu çözüm ogg dosyaları ile ilgilidir, ancak mp3'e uyarlamak çok önemlidir, sadece "ogg" oluşumunu "mp3" ile değiştirirsiniz.

İşte benim problemim. En son sürüm burada bulunabilir: 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.