วิธีปรับมาตรฐานเสียงในไฟล์ MP3


39

ฉันกำลังมองหาวิธีที่จะทำให้ปกติเสียงในไฟล์ MP3 ที่ฉันมี บางคนมีเสียงต่ำในขณะที่คนอื่นดังกว่าดังนั้นฉันจึงต้องปรับระดับเสียงขึ้นหรือลงขึ้นอยู่กับเพลง มีวิธีใดในการทำเช่นนี้สำหรับไฟล์ทั้งหมด ฉันต้องการทำผ่านเทอร์มินัลเป็นพิเศษ แต่วิธี GUI ได้รับการยอมรับเช่นกัน


สำหรับ normalizing ในขณะที่เล่นดูที่: askubuntu.com/questions/95716/... อย่างไรก็ตามสิ่งนี้จะไม่เปลี่ยนเนื้อหาไฟล์ mp3 ของคุณ - อาจเป็นข้อได้เปรียบ;)
Takkat

ไม่ในขณะที่เล่นไม่ต้องการตั้งค่าทุกครั้งหรือมีผู้เล่นตั้งค่าปกติทุกครั้งที่ฉันต้องการฟังเพลง ตัวอย่างเช่นให้เราบอกว่าฉันต้องการคัดลอกเพลงไปยัง ipod shuffle หรือไปที่ไดรฟ์ปากกาเพื่อฟังในเครื่องเล่น mp3 ที่มีความสามารถ
Luis Alvarado

@Takkat BTW ทำได้ดีมากในคำถามอื่น ๆ ข้อมูลที่ดี
Luis Alvarado

1
ภรรยาของฉันเพิ่งทดสอบวิธีความกล้าและมันก็ทำงานได้อย่างสมบูรณ์แบบ! แนะนำ กรุณาเมื่อมีคนขอคำแนะนำก็เพราะพวกเขาไม่ใช่ผู้เชี่ยวชาญ ดังนั้นอย่าบอกให้พวกเขาใช้เครื่องมือบรรทัดคำสั่งเมื่อพวกเขาสามารถทำงานได้ด้วยเครื่องมือกราฟิกที่เข้าใจง่ายเช่นความกล้า การบอกผู้ใช้ลีนุกซ์ใหม่เพื่อเปิดเทอร์มินัลและเรียกใช้เครื่องมือบรรทัดคำสั่งจะทำให้พวกเขากลัวห่างจาก Ubuntu, ด้วยความรู้สึกว่า Windows นั้นง่าย, Linux นั้นยาก ไม่แปลกใจที่ DOS ตายไปแล้ว แต่ Windows ยังมีชีวิตอยู่

เป็นเรื่องที่ดีที่ภรรยาของคุณสามารถเข้าใจถึงวิธีการทางกราฟิก แต่คุณพลาดส่วนที่คนถามคำถามที่ต้องการได้รับผ่านเทอร์มินัลโดยเฉพาะหรือไม่?
RichardP

คำตอบ:


22

ความกล้า

ด้วยความกล้าเราสามารถแบตช์ไฟล์ประมวลผลเพื่อนำการแปลงหรือเอฟเฟกต์ไปใช้กับไฟล์หลาย ๆ ไฟล์ในรายการได้อย่างง่ายดาย ในการทำเช่นนั้นก่อนอื่นเราต้องกำหนด"เชน"ที่มีเอฟเฟกต์ที่เราต้องการใช้

นี้จะกระทำด้วย"File -> แก้ไขโซ่ ..." ในหน้าต่างที่เปิดอยู่ในขณะนี้กดปุ่มเพิ่มที่ด้านล่างซ้ายเพื่อแทรกสายโซ่ใหม่ (ตั้งชื่อที่สมเหตุสมผล):

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเลือกเอฟเฟกต์และพารามิเตอร์ของมันเพื่อแทรกลงในห่วงโซ่

สำคัญ:เราจำเป็นต้องเพิ่มเอฟเฟกต์"ส่งออก MP3" (หรือรูปแบบการส่งออกอื่น ๆ เสมอ) เพื่อบันทึกการแปลงผลลัพธ์ลงดิสก์

เมื่อลาทำหน้าต่างนี้กับตกลงที่จะเปิด"File -> Apply โซ่ ..." เลือกโซ่ที่เราเพิ่งสร้างและโหลดไฟล์ทั้งหมดที่คุณต้องการด้วย"ใช้กับไฟล์ ..." สามารถเลือกได้หลายไฟล์จากตัวเลือกไฟล์ที่เปิดขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

ไฟล์ที่ดำเนินการแล้วจะถูกบันทึกไว้ในไดเรกทอรีย่อยใหม่"กำจัด"ในเส้นทางของต้นฉบับ


SoX

จากเวอร์ชั่น> 14.3 เราสามารถใช้ตัวกรอง sox --normเพื่อปรับมาตรฐานเสียงในบรรทัดคำสั่งหรือสำหรับการประมวลผลแบบแบตช์:

sox --norm infile outfile

รองรับ MP3 เพิ่มไปยัง Sox พร้อม libsox-fmt-all:

sudo apt install sox libsox-fmt-all

2
เครื่องมือเหล่านี้ถอดรหัสและเข้ารหัสอีกครั้งหรือไม่
qed

คุณไม่สามารถปกติโดยไม่ต้องเข้ารหัสอย่างน้อยระดับที่ ...
Takkat

สำหรับการทำให้เป็นปกติแบบไม่ทำลายโดยใช้ LADSPA และ pulseaudio ดูaskubuntu.com/questions/95716/…
Takkat

วิธีนี้จะเข้ารหัสใหม่จึงลดคุณภาพ ดูคำตอบของฉันหากคุณต้องการรักษาคุณภาพของไฟล์ การเข้ารหัสซ้ำไม่จำเป็นถ้าเครื่องเล่นของคุณรองรับการติดแท็กระดับเสียง
Wil

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

ดังที่ได้กล่าวไว้ในหน้า man:

mp3gain ไม่เพียง แต่ปรับสภาพให้เป็นมาตรฐานสูงสุดเท่านั้น แต่จะมีการวิเคราะห์ทางสถิติเพื่อตัดสินว่าเสียงดังกังวานต่อหูของมนุษย์อย่างไร นอกจากนี้การเปลี่ยนแปลง mp3gain ทำให้สูญเสียอย่างสมบูรณ์ ไม่มีการสูญเสียคุณภาพของการเปลี่ยนแปลงเนื่องจากโปรแกรมปรับไฟล์ mp3 โดยตรงโดยไม่ต้องถอดรหัสและเข้ารหัสใหม่

หมายเหตุ : แพคเกจนั้นถูกลบโดยมีวัตถุประสงค์บน ubuntu 15.04

Debian เสนอpython-rgainแพ็กเกจแทน (ข้อดีคือ 'replaygain' รองรับไฟล์ได้หลายรูปแบบคือ Ogg Vorbis, Flac, WavPack และ MP3 นอกจากนี้ยังช่วยให้คุณดูข้อมูล Replay Gain ที่มีอยู่ในประเภทไฟล์เหล่านั้น) replaygainหลังจากติดตั้งแล้วเรียกใช้

ในการติดตั้ง python-rgain จากเทอร์มินัลให้รันคำสั่ง

sudo apt-get install python-rgain

หรือมิฉะนั้นจะได้รับ.debไฟล์ 14.04 (ล่าสุด) จากที่นี่ ติดตั้งตามปกติ หลังจากนั้นคุณต้องเรียกใช้sudo apt-get -f installเพื่อแก้ไขปัญหาการอ้างอิงบางอย่าง


1
นอกจากนี้หากคุณไม่ต้องการใช้เครื่องเทอร์มินัลก็มี GUI สำหรับมันชื่อ easymp3gain-gtk ซึ่งทำให้มีประโยชน์มาก!
gilbertohasnofb

มันมีประโยชน์มาก ฉันประทับใจมากกับคุณภาพของการทำให้เป็นมาตรฐานโดยใช้ Windows GUI ของ MP3Gain ดังนั้นฉันจึงดีใจที่พบคำตอบนี้เมื่อฉันต้องการโซลูชันบรรทัดคำสั่ง Linux อยากจะแนะนำให้คนอื่น ๆ
Alex P. Miller

คุณช่วยเพิ่มข้อมูลเกี่ยวกับวิธีการติดตั้งได้ไหม มันไม่ได้มาพร้อมกับ Ubuntu โดยค่าเริ่มต้นและฉันไม่สามารถหาแพ็คเกจได้
Błażej Michalik

ขอบคุณ ... ติดตั้ง python-rgain โดยไม่มีข้อผิดพลาดในการพึ่งพาบน Ubuntu 16.04
Bharat Mallapur

ติดตั้งด้วย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มันเป็นเครื่องมือบรรทัดคำสั่งสำหรับ normalizing ไฟล์เสียง ดูเหมือนจะเป็นสิ่งที่คุณต้องการ สามารถทำการประมวลผลแบบแบตช์และไม่จำเป็นต้องมีการสุ่มใหม่เป็นรูปแบบกลาง

มันอยู่ในแพคเกจ repos เป็นเสียงปกติ, sudo apt-get install normalize-audio. นี่คือบิลด์ที่อัปเดตบำรุงรักษาโดย Debian ดังนั้นจึงควรเป็น LTS หรือใหม่กว่าและสร้างด้วย mp3 ที่ใช้งานร่วมกันได้ (ทดสอบแล้ว) มี manpage ที่ดีman normalize-audioในการสำรวจตัวเลือก แต่ค่าเริ่มต้นของคำสั่งจะทำงานได้ดี สำหรับการประมวลผลแบบแบตช์ (ปรับระดับเสียงให้เป็นมาตรฐานในหลาย ๆ ไฟล์) normalize-audio -b *.mp3หรือระบุชื่อไฟล์แต่ละรายการแทนที่จะใช้สัญลักษณ์แทน


OP ต้องการคำแนะนำสำหรับการทำสิ่งนี้ คุณสามารถให้สิ่งเหล่านั้นได้หรือไม่?
เซท

@iSeth ฉันเริ่มแรกไม่ถูกต้องเกี่ยวกับแหล่งความคิดเห็นเท่านั้นเนื่องจากฉันไม่สามารถค้นหาได้ด้วยการค้นหา apt-cache ฉันได้อัปเดตพร้อมรายละเอียดเกี่ยวกับแพคเกจ deb แล้ว
sean_m

นี้ดูเหมือนว่าทางเลือกที่ดี แต่ไม่สามารถหาเข้ารหัสที่ถูกต้องและได้รับการกำจัด"ไม่มีการเข้ารหัส" พยายามด้วยlibsox-fmt-mp3, libavcodec-extra. -b *.mp3ทำอะไรกับไฟล์เดียว (สุ่ม)
Pablo

4

ReplayGain

เร็วและง่ายreplaygain:

แพ็คเกจนี้มีแพ็คเกจ Python เพื่อคำนวณค่าReplay Gainของไฟล์เสียงและทำให้ระดับเสียงของไฟล์เหล่านั้นเป็นปกติตามค่า สคริปต์พื้นฐานสองตัวที่ใช้ประโยชน์จากความสามารถเหล่านี้ถูกจัดส่งเช่นกัน

Replay กำไรเป็นมาตรฐานที่เสนอออกแบบมาเพื่อแก้ปัญหาของไดรฟ์ข้อมูลที่หลากหลายในไฟล์เสียง

ติดตั้ง: sudo apt install python-rgain.

replaygain --force *.mp3
  • -f, --force คำนวณอัตรากำไรจากการเล่นซ้ำแม้ว่าไฟล์นั้นมีข้อมูลการรับอยู่แล้ว

เนื่องจากเพียงคำนวณ / เปลี่ยนค่าเล่นซ้ำก็เร็วขึ้นด้วยพีซีเฉลี่ย (Intel i7-6500U, RAM 8GB) อัตราคือ 20 ไฟล์ / นาที

การอ้างอิง


3

เพื่อประโยชน์ของมันฉันจะโยน 2 เซ็นต์ของฉันฉันกำลังมองหาสิ่งเดียวกัน (เฉพาะไฟล์ OGG) และเริ่มหัวข้อที่ Crunchbang Forum คุณสามารถดูได้ที่นี่: Normalize-audio ไม่พบตัวถอดรหัส mp3

โดยพื้นฐานแล้วโซลูชันของฉันคือสคริปต์ในโพสต์ # 8 มันใช้งานได้กับไฟล์อินพุต mp3, flac และ ogg ซึ่งอาจเป็นไฟล์อื่น แต่ก็ไม่แน่นอน

เพียงแค่สร้างไฟล์ (ตั้งชื่อตามที่คุณต้องการฉันเรียกว่า 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

สคริปต์นี้จะคำนวณความแตกต่างระหว่างระดับ db ปัจจุบันและ -12db จากนั้นนำการปรับเกนไปใช้เพื่อทำให้ได้รับที่ -12db ซึ่งเป็นสิ่งที่ฉันได้พบว่าทำงานได้ดีที่สุดสำหรับฉัน มันเป็นแบบเรียกซ้ำได้เช่นกันซึ่งทำให้ยอดเยี่ยมสำหรับการทำคอลเลคชันเพลงหรือไฟล์ทั้งหมดในโฟลเดอร์ย่อยจำนวนมาก หากคุณต้องการตั้งค่าระดับ db อื่นให้เปลี่ยนทั้งสองอินสแตนซ์ของตัวเลข "12" เป็นระดับ db ที่คุณต้องการใช้ เมื่อฉันโพสต์ในกระทู้ Crunchbang การใช้งานมีดังนี้:

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

อย่างไรก็ตามเมื่อฉันเคยเก็บไลบรารีเพลงของฉันในรูปแบบ mp3 ฉันก็เคยใช้ mp3gain เช่นกันตามที่ Philippe แนะนำ ความเรียบง่ายที่ตายแล้วของมันเยี่ยมมากและฉันชอบมันมาก ปัญหาเกี่ยวกับเสียงปกติแม้ว่ามันจะทำการถอดรหัสไฟล์ใหม่อีกครั้งดังนั้นจึงมีการลดเสียงลง แต่ถ้าคุณเป็นออดิโอไฟล์และ mp3 ของคุณถูกเข้ารหัสด้วยอัตราบิตสูงคุณไม่ควรสังเกตเห็นความแตกต่างมากนัก

สิ่งที่ฉันสังเกตเห็นด้วย mp3gain แม้ว่าจะไม่ว่าตัวเลือกใดที่ฉันพยายามฉันไม่สามารถทำให้ทุกอย่างในคอลเลกชันของฉันให้อยู่ในระดับ db เดียวกันซึ่งเป็นสิ่งที่ฉันต้องการเพื่อที่ฉันจะได้ไม่ต้องปรับระดับเสียงจากแทร็คเดียว ต่อไป. สคริปต์นี้ทำสิ่งนั้นอย่างแน่นอน ขออภัยที่ยืดเยื้อมานาน หวังว่านี่จะช่วยได้


0

ฉันชอบคำตอบของนีลมากที่สุดเพราะมันไม่ได้มีความสัมพันธ์กันระหว่างไฟล์เสียง: เพียงแค่เลือกระดับการเพิ่มและเพิ่มทุกอย่าง

อย่างไรก็ตามฉันมีปัญหาในการแยกวิเคราะห์ผลลัพธ์ของnormalize-oggบางไฟล์ที่ฉันมี นอกจากนี้ยังมีปัญหาหนึ่งที่น่ารังเกียจด้วยbc: มันไม่ได้ปัดเศษที่แท้จริง แต่จะตัดทอนเท่านั้น

ในที่สุดฉันก็ยอมแพ้กับเชลล์สคริปต์และย้ายไปที่ไพ ธ อน

Note1:ส่วน exiftool อาจ overkill แต่ฉันต้องการให้แน่ใจ 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.