気軽に動画制作ができる時代である。それで、友人たちからビデオレターを集めて、結婚式やその他のイベントで再生したいという場面もあるだろう。そんなとき困るのが動画の音量だ。急に大きな音で再生されたりしないように、一定音量に合わせたい。そこで、今回は、PythonとFFmepgを使って、音量を一定にするプログラムを作ってみよう。

  • フォルダ内の動画をノーマライズ処理しよう

    フォルダ内の動画をノーマライズ処理しよう

プログラムの仕組み

動画ファイルというのは、映像と音声の組合せとなっている。FFmpegというツールを使うと手軽に、映像と音声を分割したり結合したりできる。また、FFmpeg自体に音量を最大音量でノーマライズする機能が備わっているので、これが利用できる。

ただし、FFmpegは細かいコマンドを指定する必要があり、操作が煩雑となっている。そこで、Pythonを利用して、FFmpegのコマンドを動的に生成して実行するプログラムを作ってみよう。

必要なツールとライブラリのインストール

本連載は、Pythonの連載なので、既にPythonがインストール済みとして作業を進めるが、もしインストールしていなければ、公式サイトからダウンロードしよう。WindowsにPythonをインストールする場合、インストールオプションにPATHに追加する(英語で「Add Python 3.x to PATH」)というものがあるのでチェックしてからインストールしよう。

  • Pythonの公式サイトからインストーラーをダウンロードしよう

    Pythonの公式サイトからインストーラーをダウンロードしよう

そして、オープンソースのFFmpegをインストールしよう。FFmpegのインストールについては、本連載の94回目で詳しく解説しているが、こちらのサイトから各OS向けのバイナリファイルがダウンロードできる。

  • FFmpegのバイナリをダウンロードしよう

    FFmpegのバイナリをダウンロードしよう

なお、FFmpegのサイトにある大きなボタン「Download Source Code」からはソースコードしかダウンロードできないので、executable filesで、OSを選びダウンロード用のサイトからダウンロードしよう。また、FFmpegをダウンロードしたら、コマンドラインから実行できるように環境変数PATHにインストール先のディレクトリを追加するか、今回のプログラムと同じディレクトリに、FFmpegの実行バイナリをコピーしよう。

FFmpegをインストールしたら、ターミナルを起動して「ffmpeg」コマンドを実行してみましょう。正しくFFmpegのバージョン情報が出たなら、正しくインストールできたことが分かります。また、Windowsでプログラムと同じディレクトリにFFmpegのバイナリを配置した場合には、「.¥ffmpeg」と入力して正しく動くかを確認してみてください。

続いて、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、Pythonのライブラリをインストールしよう。以下は手軽にGUIを利用するためにTkEasyGUIをインストールするコマンドだ。

python -m pip install TkEasyGUI

プログラムを作成しよう

それでは、プログラムを作成しよう。次のプログラムを「video_volume.py」という名前で保存しよう。

import os
import TkEasyGUI as eg
import subprocess

# FFmpegのパスを指定する --- (*1)
FFMPEG_PATH = "ffmpeg"

# 動画の入ったフォルダを選択する --- (*2)
target_dir = eg.popup_get_folder("動画のフォルダを選択")
# 出力先のフォルダを自動的に決定する
if target_dir is None or target_dir == "":
    quit()
save_dir = os.path.join(target_dir, "normalized")
os.makedirs(save_dir, exist_ok=True)

# フォルダ内の動画ファイルを列挙する --- (*3)
files = os.listdir(target_dir)
for f in files:
    # 動画ファイル以外は無視する
    if not f.endswith(".mp4"): continue
    # ファイルのパスを作成する
    in_video = os.path.join(target_dir, f)
    out_video = os.path.join(save_dir, f)
    # 音量を正規化する --- (*4)
    subprocess.run([
        FFMPEG_PATH, "-y", "-i", in_video, "-af",
        "loudnorm=I=-14:TP=-1.0:LRA=8",
        out_video
    ])
    print("音量を正規化しました:", f)
    # 比較テストのためWAVファイルを取り出す --- (*5)
    subprocess.run([
        FFMPEG_PATH, "-y", "-i", in_video,
        "-acodec", "pcm_s16le",
        f"{in_video}.wav"
    ])
    subprocess.run([
        FFMPEG_PATH, "-y", "-i", out_video,
        "-acodec", "pcm_s16le",
        f"{out_video}.wav"
    ])
print("正規化が完了しました")

そして、ターミルで次のコマンドを実行すると、プログラムが実行できる。

# Windowsの場合
python video_volume.py
# macOSの場合
python3 video_volume.py

プログラムが実行されると、次のように、フォルダの選択ダイアログが表示されるので、動画の入ったフォルダを選択しよう。すると、FFmpegを利用して動画の音量調整処理が行われる。

  • 動画フォルダを選択しているところ

    動画フォルダを選択しているところ

なお、プログラムを実行してフォルダを選択すると、選択したフォルダの下に「normalized」という名前のフォルダが作成され、そのフォルダに変換済みの動画が保存される。

それでは、プログラムを確認してみよう。(*1)ではFFmepgのパスを指定する。Windowsで、プログラムと同じフォルダに、ffmpeg.exeをコピーした場合、この部分を「FFMPEG_PATH = ".\ffmpeg.exe"」と指定すれば良いだろう。

(*2)では動画の入ったフォルダを指定している。eg.popup_get_folder関数を使うと、フォルダの選択ダイアログを表示できる。

(*3)ではフォルダ内の動画ファイルを列挙し、FFmpegコマンドをファイルの一つずつ実行する。(*4)ではFFmpegコマンドで音量の正規化(ノーマライズ)処理を実行する。

(*5)では比較テストのために、FFmpegを実行して動画からWAVファイルを取り出す処理を記述している。

それで、この(*5)で取り出したWAVファイルをオーディオ編集ツールなどで確認すると、音量が一定に揃えられているのを確認できるだろう。次の画像の上側が音量の調整前で、下側が音量の調整後の波形データだ。もともと、それほど小さな音量の動画ではなかったのだが、調整後では波形が太くなっており音量が大きくなったのを確認できる。

  • 動画の音量調整の結果 - 上が音量の調整前・下が調整後のもの

    動画の音量調整の結果 - 上が音量の調整前・下が調整後のもの

ちなみに、WAVファイルの出力が不要な場合、プログラムの(*5)以下の部分を削除すると良いだろう。

また、大きな音声の動画では、逆に音が小さくなる。音量の調整を行う場合、(*4)のパラメータを変更すれば良い。ここでは、"loudnorm=I=-14:TP=-1.0:LRA=8"を指定しているが、それぞれのパラメータは次のような意味を持つ。

- I=-14 … 目標音量レベル。一般的な放送音量は、-16LUFSだが今回は少し大きめにするために、-14を指定した
- TP=-1.0 … TP(真のピークレベル)を-1.0 dBに設定。-1から-3を指定するのが一般的
- LRA=8 … ラウンドネスレンジ。数字が小さいほど騒がしいところで聴くのに適しており、電車の中で聴く場合には5を、静かな場所であれば、15を指定できる

目的に合わせてパラメータを調整すると良いだろう。

まとめ

以上、今回は動画の音量の調整をするツールを作ってみた。本当は動画から音声を取り出し、波形処理をする必要があると思っていたのだが、結果FFmpegが万能で、最低限のプログラムを書くだけで良かった。PythonのPyDubなどのライブラリを使えば音声ファイルの波形処理も比較的に簡単にできるので、機会があれば波形処理も試してみよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「実践力をアップする Pythonによるアルゴリズムの教科書(マイナビ出版)」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。