Cách bình thường hóa âm thanh trong các tệp mp3


39

Tôi đang tìm cách để bình thường hóa âm thanh trong NHIỀU tệp MP3 tôi có. Một số âm thanh thấp, trong khi một số khác to hơn nên tôi phải tăng âm lượng lên hoặc xuống tùy theo bài hát. Có những cách nào để làm điều này cho tất cả các tập tin. Tôi đặc biệt muốn làm điều đó thông qua thiết bị đầu cuối nhưng cách GUI cũng được chấp nhận.


Để bình thường hóa trong khi chơi, hãy xem: askubfox.com/questions/95716/ trên . Tuy nhiên, điều này sẽ không thay đổi nội dung tệp mp3 của bạn - có thể là lợi thế;)
Takkat

Không phải trong khi chơi, không muốn phải đặt nó mọi lúc hoặc yêu cầu người chơi thiết lập chuẩn hóa mỗi khi tôi muốn nghe các bài hát. Ví dụ: giả sử tôi muốn sao chép các bài hát vào ipod shuffle hoặc vào ổ đĩa bút để nghe trong máy nghe nhạc có khả năng mp3.
Luis Alvarado

@Takkat BTW được thực hiện độc đáo trong câu hỏi khác đó. Thông tin tốt.
Luis Alvarado

1
Vợ tôi vừa thử nghiệm phương pháp Audacity, và nó hoạt động hoàn hảo! Đề nghị. Xin vui lòng, khi mọi người yêu cầu lời khuyên đó là vì họ KHÔNG phải là chuyên gia. Vì vậy, donnhot bảo họ sử dụng các công cụ dòng lệnh khi họ có thể thực hiện công việc với các công cụ đồ họa dễ hiểu như Audacity. Nói với người dùng Linux mới để mở terminal và chạy các công cụ dòng lệnh sẽ khiến họ sợ hãi khỏi Ubuntu, với cảm giác rằng Windows đơn giản, Linux rất khó. Không có gì ngạc nhiên khi DOS chết, nhưng Windows vẫn còn sống.

Thật tuyệt vời khi vợ bạn có thể tìm ra cách đồ họa, nhưng bạn có bỏ lỡ phần mà người hỏi câu hỏi đặc biệt muốn đạt được nó thông qua thiết bị đầu cuối không?
RichardP

Câu trả lời:


22

Khán giả

Với Audacity, chúng tôi có thể dễ dàng xử lý hàng loạt tệp để áp dụng chuyển đổi hoặc hiệu ứng cho nhiều tệp trong danh sách. Để làm như vậy, trước tiên chúng ta phải xác định "Chuỗi" chứa các hiệu ứng mà chúng ta muốn áp dụng.

Điều này được thực hiện với "Tệp -> Chỉnh sửa Chuỗi ..." . Trong cửa sổ đang mở, nhấn nút Thêm ở phía dưới bên trái để chèn chuỗi mới (đặt tên hợp lý):

nhập mô tả hình ảnh ở đây

Sau đó chọn hiệu ứng và tham số của nó để chèn vào chuỗi (ở đây hiển thị cho các giá trị mặc định và hiệu ứng Chuẩn hóa).

Quan trọng: chúng tôi luôn cần thêm hiệu ứng "Xuất MP3" (hoặc bất kỳ định dạng xuất nào khác) để lưu chuyển đổi kết quả vào đĩa.

Khi hoàn tất, hãy để cửa sổ này với OK để mở "Tệp -> Áp dụng Chuỗi ..." . Chọn Chuỗi chúng tôi vừa tạo và tải tất cả các tệp bạn cần với "Áp dụng cho các tệp ..." . Một số tệp có thể được chọn từ trình chọn tệp mở.

nhập mô tả hình ảnh ở đây

Các tệp được xử lý sẽ được lưu trong thư mục con mới "được dọn sạch" trong đường dẫn gốc.


SoX

Từ phiên bản> 14.3, chúng ta có thể sử dụng bộ lọc sox --normđể chuẩn hóa âm thanh trên dòng lệnh hoặc để xử lý hàng loạt:

sox --norm infile outfile

Hỗ trợ MP3 được thêm vào Sox với libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
Các công cụ này có giải mã và mã hóa lại không?
qed

Bạn không thể bình thường hóa mà không cần mã hóa lại, ít nhất là các cấp ...
Takkat

Để bình thường hóa không phá hủy bằng cách sử dụng LADSPA và pulseaudio, hãy xem Askubfox.com/questions/95716/ Kẻ
Takkat

Điều này không mã hóa lại, vì vậy nó làm giảm chất lượng. Xem câu trả lời của tôi nếu bạn muốn duy trì chất lượng tập tin của bạn. Không cần mã hóa lại nếu trình phát của bạn hỗ trợ gắn thẻ âm lượng.
Wil

1
để sử dụng sox trong một đợt bạn có thể sử dụngfor f in *.mp3; do sox --norm "$f" /tmp/sox.mp3; mv -v /tmp/sox.mp3 "$f"; done
rubo77

30

Hãy xem @ mp3gain mà đối với tôi thậm chí còn tốt hơn âm thanh bình thường

mp3gain -r *.mp3

một phiên bản hữu ích khác có thể là -c ngăn không hỏi bạn có muốn thực hiện các thay đổi cho nhiều tệp không:

mp3gain -c -r *.mp3

như đã nói trong trang man:

mp3gain không chỉ làm bình thường hóa cao điểm, như nhiều người bình thường hóa. Thay vào đó, nó thực hiện một số phân tích thống kê để xác định mức độ âm thanh của tệp thực sự đến tai người. Ngoài ra, những thay đổi mp3gain thực hiện là hoàn toàn không mất mát. Không có chất lượng bị mất trong thay đổi vì chương trình điều chỉnh trực tiếp tệp mp3 mà không cần giải mã và mã hóa lại.

Lưu ý : Gói đó đã bị xóa trên mục đích trên Ubuntu 15.04.

Debian đề xuất python-rgaingói thay thế (Ưu điểm là 'phát lại' hỗ trợ một số định dạng tệp, cụ thể là Ogg Vorbis, Flac, WavPack và MP3. Ngoài ra, nó cho phép bạn xem thông tin Replay Gain hiện có trong bất kỳ loại tệp nào). Sau khi cài đặt nó, chạy replaygain.

Để cài đặt python-rgain từ thiết bị đầu cuối, hãy chạy lệnh

sudo apt-get install python-rgain

Ngoài ra, lấy .debtệp cho 14.04 (mới nhất) từ đây . Cài đặt như bình thường. Sau đó, bạn cần chạy sudo apt-get -f installđể sửa một số vấn đề phụ thuộc.


1
Ngoài ra, nếu bạn không muốn sử dụng thiết bị đầu cuối, có một GUI có sẵn cho nó có tên là Easymp3gain-gtk, điều này làm cho nó rất tiện dụng!
gilbertohasnofb

Điều này là siêu hữu ích. Tôi rất ấn tượng về chất lượng chuẩn hóa bằng GUI Windows của MP3Gain, vì vậy tôi rất vui khi tìm thấy câu trả lời này khi tôi cần một giải pháp dòng lệnh Linux. Chắc chắn sẽ giới thiệu cho người khác.
Alex P. Miller

Bạn có thể vui lòng thêm một số thông tin về cách cài đặt nó? Nó không đi kèm với Ubuntu theo mặc định và tôi không thể tìm thấy gói.
Błażej Michalik

Cảm ơn ... đã cài đặt python-rgain mà không có bất kỳ lỗi phụ thuộc nào trên Ubuntu 16.04.
Bharat Mallapur

cài đặt vớimkdir 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

Tôi sẽ sử dụng dự án này Chuẩn hóa , nó là một công cụ dòng lệnh để chuẩn hóa các tệp âm thanh. Có vẻ là chính xác những gì bạn cần. Có thể thực hiện xử lý hàng loạt và không yêu cầu lấy mẫu lại thành các định dạng trung gian.

Nó nằm trong gói repos dưới dạng âm thanh chuẩn hóa , sudo apt-get install normalize-audio. Đây là bản dựng được duy trì ngược dòng bởi Debian vì vậy nó phải ở bất kỳ thứ gì LTS hoặc mới hơn và được xây dựng với khả năng tương thích mp3 (đã thử nghiệm). Có một manpage tốt man normalize-audiođể khám phá các tùy chọn nhưng các lệnh mặc định dường như hoạt động tốt. Để xử lý hàng loạt (bình thường hóa âm lượng trên nhiều tệp) normalize-audio -b *.mp3hoặc chỉ định tên tệp riêng lẻ thay vì sử dụng ký tự đại diện.


OP muốn hướng dẫn để làm điều này. Bạn có thể cung cấp những người?
Seth

@iSeth Ban đầu tôi không chính xác về nguồn chỉ nhận xét vì tôi không thể tìm thấy nó với tìm kiếm apt-cache. Tôi đã cập nhật thông tin chi tiết về gói deb.
sean_m

Đây có vẻ là một giải pháp thay thế tốt nhưng không thể tìm thấy bộ mã hóa chính xác và loại bỏ "không có bộ mã hóa có sẵn" . Thử với libsox-fmt-mp3, libavcodec-extra. -b *.mp3làm một cái gì đó chỉ với một tập tin (ngẫu nhiên?).
Pablo A

4

phát lại

Nhanh hơn và dễ dàng replaygain:

Gói này cung cấp gói Python để tính toán các giá trị Replay Gain của các tệp âm thanh và chuẩn hóa âm lượng của các tệp đó theo các giá trị. Hai kịch bản cơ bản khai thác các khả năng này cũng được vận chuyển.

Replay Gain là một tiêu chuẩn được đề xuất được thiết kế để giải quyết vấn đề rất khác nhau về âm lượng khác nhau trên các tệp âm thanh.

Cài đặt : sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force Tính toán lại Phát lại ngay cả khi tệp đã chứa thông tin khuếch đại.

Vì chỉ tính toán / thay đổi giá trị phát lại, cũng nhanh hơn: Với một PC trung bình (Intel i7-6500U, RAM 8GB), tốc độ là ~ 20 tệp / phút.

Tài liệu tham khảo


3

Vì lợi ích của nó, tôi sẽ ném 2 xu của mình vào. Tôi đang tìm kiếm chính xác điều tương tự (chỉ dành cho các tệp ogg) và bắt đầu một chủ đề tại Diễn đàn Crunchbang. Bạn có thể xem nó ở đây: Chuẩn hóa âm thanh không thể tìm thấy bộ giải mã mp3

Về cơ bản giải pháp của tôi là kịch bản trong bài # 8. Nó hoạt động cho các tệp đầu vào mp3, flac và ogg, có thể là các tệp khác nhưng chắc chắn không phải là wav.

Chỉ cần tạo một tệp (đặt tên bất cứ thứ gì bạn muốn, tôi đã gọi của tôi là db_adjust_mp3), chmod + x và dán nó vào thư mục ~ / bin của bạn. Nó cũng điền vào bất kỳ dữ liệu codec bị thiếu. Thí dụ:

Tệp gốc: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

so với

Tập tin chuẩn hóa: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo

Tôi đã sửa đổi tập lệnh để sử dụng mp3 chuẩn hóa tại đây để bạn có thể sử dụng tập lệnh nếu muốn:

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

Tập lệnh này tính toán sự khác biệt giữa mức db hiện tại và -12db, sau đó áp dụng điều chỉnh mức tăng để đặt mức tăng ở chính xác -12db, đây là điều tôi thấy phù hợp nhất với mình. Nó cũng được đệ quy, điều này làm cho nó tuyệt vời để thực hiện toàn bộ bộ sưu tập nhạc hoặc tệp trong nhiều thư mục con. Nếu bạn muốn đặt một mức db khác nhau, chỉ cần thay đổi cả hai trường hợp của số "12" thành bất kỳ mức db nào bạn muốn sử dụng. Như tôi đã đăng trong chủ đề Crunchbang của mình, cách sử dụng như sau:

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

Tuy nhiên, khi tôi thường giữ thư viện nhạc của mình ở định dạng mp3, tôi cũng thường sử dụng mp3gain, đúng như Philippe đề xuất. Sự đơn giản chết chóc của nó là tuyệt vời và tôi thực sự thích nó. Vấn đề với chuẩn hóa âm thanh là nó giải mã mã hóa lại các tập tin, do đó có một số suy giảm âm thanh. Nhưng trừ khi bạn là một audiophile và mp3 của bạn được mã hóa ở tốc độ bit cao, bạn không nên nhận thấy nhiều sự khác biệt.

Mặc dù vậy, điều tôi nhận thấy với mp3gain là dù tôi có thử tùy chọn nào đi chăng nữa, tôi không thể có được mọi thứ trong bộ sưu tập của mình chính xác ở cùng mức db, đó là điều tôi muốn để tôi không bao giờ phải điều chỉnh âm lượng từ một bản nhạc sang tiếp theo. Kịch bản này làm chính xác điều đó. Xin lỗi vì đã quá dài dòng. Hi vọng điêu nay co ich.


0

Tôi thích câu trả lời của Neil nhất, vì nó không đưa ra mối tương quan giữa các tệp âm thanh: chỉ cần chọn một mức tăng và điều chỉnh mọi thứ theo nó.

Tuy nhiên tôi có một số vấn đề khi phân tích cú pháp đầu ra normalize-oggvới một số tệp tôi có. Ngoài ra còn có một vấn đề khó chịu với bc: nó không làm tròn thực sự, nó chỉ cắt ngắn.

Vì vậy, cuối cùng tôi đã từ bỏ kịch bản shell và chuyển sang python.

Lưu ý1: phần exiftool có thể quá mức cần thiết nhưng tôi muốn chắc chắn 100% rằng bitrate gốc sẽ được bảo toàn.

Lưu ý2: điều này sẽ ghi đè lên bản gốc, nếu bạn muốn giữ chúng, hãy sử dụng --backup trong cuộc gọi cuối cùng để chuẩn hóa-ogg. Nhưng tôi thấy thực tế hơn để giữ một bản sao trong một thư mục riêng biệt, an toàn hơn.

Lưu ý 3: giải pháp này xử lý các tệp ogg, nhưng việc điều chỉnh nó thành mp3 không quan trọng, chỉ cần thay thế các lần xuất hiện của "ogg" bằng "mp3".

Đây là vấn đề của tôi. Phiên bản mới nhất có thể được tìm thấy ở đây: 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.