MP3ファイルのサウンドを正規化する方法


39

私が持っている多くのMP3ファイルのサウンドを正規化する方法を探しています。音が小さいものもあれば大きいものもあるため、曲に応じて音量を上げたり下げたりする必要があります。すべてのファイルに対してこれを行う方法はありますか。私は特にターミナル経由でそれをしたいのですが、GUIの方法も受け入れられます。


プレイ中のノーマライズについては、askubuntu.com / questions / 95716 / …をご覧ください。ただし、これはmp3ファイルの内容を変更するものではありません-利点があるかもしれません;)
Takkat

プレイ中ではなく、毎回設定したり、曲を聴きたいときに毎回プレーヤーにノーマライズを設定させたりする必要はありません。たとえば、mp3対応プレーヤーで聴くために曲をiPod shuffleまたはペンドライブにコピーしたいとします。
ルイスアルバラード

@Takkat BTWは他の質問でもうまくできました。良い情報。
ルイスアルバラード

1
妻がAudacityメソッドをテストしたところ、完璧に機能しました!推奨。人々が助言を求めるとき、それは彼らが専門家ではないからです。したがって、Audacityのようなわかりやすいグラフィカルツールを使用してジョブを実行できる場合は、コマンドラインツールを使用するように指示しないでください。新しいLinuxユーザーにターミナルを開いてコマンドラインツールを実行するように指示すると、Ubuntuから離れてしまいます。Windowsはシンプルで、Linuxは難しいと感じています。DOSが死んだのは驚くことではありませんが、Windowsは生きています。

あなたの妻がグラフィカルな方法を理解できたのは素晴らしいことですが、質問をしている人が特にターミナルを介してそれを達成したかった部分を逃しましたか?
-RichardP

回答:


22

大胆さ

Audacityを使用すると、ファイルを簡単にバッチ処理して、リスト内の多くのファイルに変換または効果を適用できます。そのためには、まず、適用する効果を含む「チェーン」を定義する必要があります。

これは、「ファイル->チェーンの編集...」で行います。現在開いているウィンドウで、左下の[ 追加 ]ボタン押して新しいチェーンを挿入します(わかりやすい名前を付けます)。

ここに画像の説明を入力してください

次に、エフェクトとそのパラメーターを選択して、チェーンに挿入します(ここでは、デフォルト値とノーマライズエフェクトを示しています)。

重要:結果の変換をディスクに保存するために、エフェクト「Export MP3」(またはその他のエクスポート形式)を常に追加する必要があります。

完了したら、[ OK]クリックして[ファイル]-> [チェーンの適用...]を開きます。作成したばかりのチェーンを選択し、「ファイルに適用...」で必要なすべてのファイルをロードします。開いたファイル選択から複数のファイルを選択できます。

ここに画像の説明を入力してください

処理されたファイルは、元のパスの「クリーニング済み」の新しいサブディレクトリに保存されます。


SoX

バージョン> 14.3からは--norm、コマンドラインでのオーディオの正規化またはバッチ処理にsoxフィルターを使用できます。

sox --norm infile outfile

MP3サポートは、libsox-fmt-allを使用してSoxに追加されます。

sudo apt install sox libsox-fmt-all

2
これらのツールはデコードして再エンコードしますか?
2014年

することはできません正規再エンコードせずに、少なくともレベル...
Takkat

LADSPAとpulseaudioを使用した非破壊ライブノーマライズについては、askubuntu.com
questions /

これにより再エンコードされるため、品質が低下します。ファイルの品質を維持したい場合は、私の答えをご覧ください。プレーヤーがボリュームのタグ付けをサポートしている場合、再エンコードは不要です。
ウィル

1
使用できるバッチでソックスを使用するには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
また、ターミナルを使用したくない場合は、easymp3gain-gtkという名前のGUIを使用できます。これは非常に便利です。
gilbertohasnofb

これは非常に便利です。MP3GainのWindows GUIを使用した正規化の品質に非常に感銘を受けたので、Linuxコマンドラインソリューションが必要になったときにこの答えを見つけてうれしく思いました。間違いなく他の人にお勧めします。
アレックスP.ミラー

インストール方法に関する情報を追加していただけますか?デフォルトではUbuntuには付属していません。パッケージが見つかりません。
ブルワジミカリック

ありがとう...依存関係エラーなしでUbuntu 16.04にpython-rgainをインストールしました。
バーラトマラプル

インストール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を使用します。これは、オーディオファイルを正規化するためのコマンドラインツールです。まさにあなたが必要とするものに見えます。バッチ処理ができ、中間形式へのリサンプリングは不要です。

normalize-audioとしてパッケージリポジトリにありますsudo apt-get install normalize-audio。これはDebianによってアップストリームで維持されるビルドであるため、LTS以降である必要があり、mp3互換性(テスト済み)でビルドされます。man normalize-audioオプションを調べるのに適したマンページがありますが、コマンドのデフォルトはうまく機能しているようです。バッチ処理(複数のファイルにわたるボリュームの正規化)の場合、normalize-audio -b *.mp3またはワイルドカードを使用する代わりに個々のファイル名を指定します。


OPはこれを行うための指示を求めています。それらを提供できますか?
セス

@iSeth apt-cache検索で見つけることができなかったため、最初はソースのみのコメントについて間違っていました。debパッケージの詳細を更新しました。
sean_m

これは良い選択肢のように思えますが、正しいエンコーダーが見つからず、「使用可能なエンコーダーがありません」を取り除くことができません。にしようとしましたlibsox-fmt-mp3libavcodec-extra-b *.mp31つの(ランダム?)ファイルのみで何かを行います。
パブロA

4

リプレイゲイン

より速くて簡単replaygain

このパッケージは、オーディオファイルのリプレイゲイン値を計算し、値に従ってそれらのファイルのボリュームを正規化するPythonパッケージを提供します。これらの機能を活用する2つの基本的なスクリプトも同梱されています。

リプレイゲインは、オーディオファイル全体で音量が変化するという問題を解決するために設計された標準規格です。

インストール:sudo apt install python-rgain

replaygain --force *.mp3
  • -f, --force ファイルに既にゲイン情報が含まれている場合でも、リプレイゲインを再計算します。

リプレイゲイン値の計算/変更のみであるため、高速です。平均的なPC(Intel i7-6500U、8GB RAM)では、レートは約20ファイル/分でした。

参照


3

そのため、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

このスクリプトは、現在のdbレベルと-12dbの差を計算し、ゲイン調整を適用してゲインを正確に-12dbに設定します。再帰的であるため、多くのサブフォルダーで音楽コレクションやファイル全体を作成するのに最適です。別のdbレベルを設定する場合は、番号「12」の両方のインスタンスを、使用するdbレベルに変更します。Crunchbangスレッドに投稿したとおり、使用方法は次のとおりです。

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

ただし、音楽ライブラリをmp3形式で保存していたときは、Philippeが提案したように、mp3gainも使用していました。それの死のシンプルさは素晴らしく、私はそれが本当に好きだった。ただし、normalize-audioの問題は、ファイルの再エンドコードをデコードするため、音質がいくらか低下することです。しかし、あなたがオーディオマニアで、mp3が高ビットレートでエンコードされていない限り、大きな違いに気付かないはずです。

mp3gainで気付いたのは、どのオプションを試しても、コレクション内のすべてをまったく同じdbレベルにすることができなかったことです。これは、1つのトラックから次。このスクリプトはまさにそれを行います。長く巻き取られてすみません。お役に立てれば。


0

Neilの回答が最も好きでした。オーディオファイル間に相関関係が導入されないためです。ゲインレベルを1つ選択し、それに合わせてすべてを調整するだけです。

しかし、私が持っているいくつnormalize-oggかのファイルの出力を解析するのにいくつかの問題がありました。また、厄介な問題が1つありbcます。実際の丸めは行われず、切り捨てられるだけです。

だから最終的に私はシェルスクリプトをあきらめ、pythonに移動しました。

注1: exiftoolの部分は過剰かもしれませんが、元のビットレートが保持されることを100%確実にしたかったのです。

注2:オリジナルを上書きします。保存したい場合は、normalize-oggの最後の呼び出しで--backupを使用します。しかし、コピーを別の安全なディレクトリに保存する方が実用的だと感じました。

注3:このソリューションは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.