PythonでLUFSを自動調整!WAVファイルを一括でラウドネス統一

投稿者: | 2025年6月13日

音源をYouTubeやSpotifyなどにアップロードする際、「音量が他の曲と比べてバラバラだ」「LUFS基準に合わせたいけれど毎回手動で調整するのが大変」と感じたことはありませんか?

この記事では、PythonとFFmpegを使って、指定フォルダ内のWAVファイルを一括で-16 LUFSなどのターゲットに自動調整し、別フォルダに保存するバッチスクリプトを紹介します。
Audacity不要、完全自動化で音源管理が一気に効率化します。

GUIが必要な方、Audacityを使ったやり方を知りたいという方は初心者向けの記事を参照してください。

【保存版】YouTubeやSpotify配信!Audacityでラウドネス(LUFS)を設定する方法
こうたろう

この記事を担当:朝比奈幸太郎

1986年生まれ
音大卒業後日本、スウェーデン、ドイツにて音楽活動
ドイツで「ピアノとコントラバスのためのソナタ」をリリースし、ステファン・デザイアーからマルチマイクREC技術を学び帰国
金田式DC録音のスタジオにて音響学を学ぶ
独立後芸術工房Pinocoaを結成しアルゼンチンタンゴ音楽を専門にプロデュース
その後写真・映像スタジオで音響担当を経験し、写真を学ぶ
現在はヒーリングサウンド専門の音楽ブランド Curanz Sounds を立ち上げ、ピアニスト, 音響エンジニア, マルチメディアクリエーターとして活動中
当サイトでは音響エンジニアとしての経験、写真スタジオで学んだ経験を活かし、制作機材の解説や紹介をしています。
♪この記事には広告リンクを含みます♪

必要なライブラリと環境構築

PythonでLUFS(ラウドネス)を自動で調整するには、以下の2つの基本ツールが必要です。


🔹 ① FFmpeg(音声処理エンジン)

FFmpegは音声・映像の変換や処理を行うための高機能なCLI(コマンドラインツール)です。

  • LUFS測定と正規化を実現するのは、FFmpegの内部フィルター loudnorm
  • 事前にシステムにインストールしておく必要があります

✅ インストール方法(Mac / Windows / Linux)

macOS(Homebrew):

bashコピーする編集する
brew install ffmpeg

Windows:

  • 公式サイト からWindows用バイナリをダウンロード
  • ffmpeg.exeC:\ffmpeg\bin に置き、パスを通す

Ubuntu/Linux:

sudo apt install ffmpeg

🔹 ② Pythonパッケージ:ffmpeg-normalize

ffmpeg-normalize は Python で LUFS 正規化をスクリプト的に扱うためのラッパーツールです。

✅ インストール手順:

まず Python の仮想環境を作成(推奨):

python3 -m venv venv
source venv/bin/activate  # Windowsなら venv\Scripts\activate

次に ffmpeg-normalize をインストール:

pip install ffmpeg-normalize

このツールが内部で FFmpeg を呼び出し、LUFS の指定値(例:-16 LUFS)に調整してくれます。

基本的におかしくなったりしたときのために、仮想環境を構築するのは必須であると考えてください。

これ以外は標準ライブラリで動作しますのでここまででOKです。

Pythonスクリプトの全体構成とサンプル

ffmpeg-normalizeを使用しますので、事前に先述のインストールを確認するようにしてください。

"""
LUFS自動調整スクリプト(サンプリングレートは変更しない)
- 入力:/ソースフォルダ にあるWAVファイル群
- 出力:/出力フォルダ に正規化されたWAVを保存
- ラウドネス目標:-16 LUFS
"""

import os
import subprocess

# 入出力フォルダ
input_folder = "/ソースフォルダ"
output_folder = "/出力フォルダ"
target_lufs = "-16"  # 目標LUFS値

# 出力フォルダを自動生成(なければ)
os.makedirs(output_folder, exist_ok=True)

# WAVファイルのみ対象
for filename in os.listdir(input_folder):
    if filename.lower().endswith(".wav"):
        input_path = os.path.join(input_folder, filename)
        output_path = os.path.join(output_folder, filename)

        print(f"🔄 処理中: {filename}")

        try:
            # ffmpeg-normalizeコマンド(サンプリングレート指定なし)
            command = [
                "ffmpeg-normalize",
                input_path,
                "-o", output_path,
                "-f",             # 上書き
                "-nt", "ebu",     # EBU R128モードでLUFS調整
                "-t", target_lufs,
                "-p", "-1.0"      # ピーク制限 -1.0 dB
            ]

            subprocess.run(command, check=True)
            print(f"✅ 完了: {filename} を -16 LUFS に調整しました")

        except subprocess.CalledProcessError as e:
            print(f"⚠️ エラー: {filename} の処理中に問題が発生しました → {e}")

print("✅ 全ファイルの処理が完了しました")

MP3と同時に出力

マスターとともにメンバーやクライアントにプレビューを送りたいということがあるかと思います。

MP3 320kbpsでも同時に出力できると便利ですね。

"""
LUFS自動調整+MP3 320kbps変換スクリプト
- 入力:/元々のソースフォルダ にあるWAVファイル
- 出力1(WAV):/出力1 に -16 LUFS 正規化
- 出力2(MP3):/出力2 に 320kbps MP3 を保存
"""

import os
import subprocess

# 入出力パス
input_folder = "/元々のソースフォルダ"
wav_output_folder = "/出力1"
mp3_output_folder = "/出力2"

target_lufs = "-16"  # 目標LUFS

# 出力フォルダ作成
os.makedirs(wav_output_folder, exist_ok=True)
os.makedirs(mp3_output_folder, exist_ok=True)

# 処理対象は .wav ファイル
for filename in os.listdir(input_folder):
    if filename.lower().endswith(".wav"):
        input_path = os.path.join(input_folder, filename)
        output_wav_path = os.path.join(wav_output_folder, filename)

        # 拡張子を.mp3に変えたファイル名
        mp3_filename = os.path.splitext(filename)[0] + ".mp3"
        output_mp3_path = os.path.join(mp3_output_folder, mp3_filename)

        print(f"🔄 処理中: {filename}")

        try:
            # ① WAV形式でLUFS正規化(オリジナルレート保持)
            normalize_cmd = [
                "ffmpeg-normalize",
                input_path,
                "-o", output_wav_path,
                "-f",
                "-nt", "ebu",
                "-t", target_lufs,
                "-p", "-1.0"
            ]
            subprocess.run(normalize_cmd, check=True)
            print(f"✅ WAV書き出し完了: {output_wav_path}")

            # ② 正規化されたWAVをMP3 320kbpsに変換
            convert_cmd = [
                "ffmpeg",
                "-y",                    # 上書き許可
                "-i", output_wav_path,   # 入力WAV
                "-b:a", "320k",          # 音声ビットレート 320kbps
                output_mp3_path
            ]
            subprocess.run(convert_cmd, check=True)
            print(f"✅ MP3書き出し完了: {output_mp3_path}")

        except subprocess.CalledProcessError as e:
            print(f"⚠️ エラー: {filename} の処理中に問題が発生しました → {e}")

print("🎉 すべてのWAVとMP3の処理が完了しました")

エラーの時はまずffmpegのパスが通っているか?これを徹底して確認してください。

ffmpeg -version