一括で音声データの音量調整をする 【Python】

Python

音声データをフォルダに入れておくと、一括で音量のレベル変換をする Python のスクリプトをまとめておきます。
具体的には、mp3 などの複数のファイルをフォルダに入れておくと、スクリプトで設定した比率だけ音量を調整し、出力用フォルダにファイルを一括で出力します。音楽などの音量を統一できます。
以下の環境で動作確認をしています。

環境:
・ Windows 10 パソコン、Python 3.X
・ Anaconda の仮想環境に ffmpeg をインストール・設定済み

背景 ~ 音声データの音量を統一したい!

日頃、音声ファイルや動画ファイルを多用しています。
音源としては、音楽であったり、動画、語学用の音声データであったりします。また、機械生成した音声も活用しています。

ところが、音源により音量がバラバラです。
音量が一定でないと、たとえば、Python などで音声を自動再生しようとしたとき、ファイルごとに音量が大きすぎたり、小さすぎたりしてとても不便です。
また、音楽などを聴くたびに、手動で音量を調整し続けるというのも時間の無駄です。

そこで、フォルダに音声ファイルを入れておくと、指定した比率だけ一括で音量を増減できるスクリプトをまとめ、公開しておくことにします。
たとえば、音量が小さすぎる/大きすぎる mp3 ファイルをピックアップして変換用のフォルダに入れておくと、音量が大きく/小さくなるよう一発変換できます。

なお、本スクリプトでは ffmpeg というソフトウェアを使用しています。設定方法については末尾の関連リンクにまとめており、この設定で動作確認をしています。
私の場合、Anaconda で設定した仮想環境内に ffmpeg を入れていますが、Anaconda をインストールしなくても、Windows 標準のコマンドプロンプトで ffmpeg をインストールした場合でも、同様に動くと思います。

設定方法

① デスクトップなどに任意のフォルダを作ってください。
例: “convert_soundlevel1”
② ①のフォルダ内に “folder1″ というフォルダを作ってください。音声ファイルを入れるフォルダです。
③ ②のフォルダ内に、さらに、”done1” というフォルダを作ってください。変換後のファイルが出力されるフォルダです。
④ ①のフォルダ内に “convert_soundlevel1.py” 等の名前でテキストファイルを作成し、下記のサンプルスクリプトをコピー&ペーストして保存してください。
★ 音声のレベルは、スクリプト内で … dB としたところで設定しています。最初はサンプルスクリプトのまま実行してみて、音声レベルの確認後、値を変えて微調整してください。

使い方

⑤ mp3 ファイルなどの音声ファイルを②の “folder1” 内に入れてください。
⑥ コマンドプロンプト(または Anaconda Prompt)を起動し、④のスクリプトを実行してください。
具体的には、コマンドプロンプト内で “python ” と入力し、④のスクリプトをドラッグ&ドロップし、[enter] キーを押して実行してください。
→ ③のフォルダ “done1” 内に、音声レベルが変換されたファイルが生成されます。

⑦ 大音量となる可能性がありますので必要によりスピーカーの音量を下げ、変換前の “folder1” フォルダ内のファイルと、変換後の “done1” フォルダ内のファイルを再生してみてください。音声レベルを確認し、調整量が妥当かどうかを確認してください。

★ 音量をさらに上げたい場合は、④のスクリプト内の … dB とした部分の値をより大きな値に変更してください。
★ 音量を、オリジナルの音声データよりも小さくしたい場合は、… dB の部分をマイナスの値に設定してください(例: -6dB など)。
★ スクリプトでは安全のため、変換後のファイルがすでに “done1” フォルダ内にあると、ファイルの上書きをスキップするようにしています。スクリプトを複数回実行する場合は、変換後のフォルダ “done1” は空にしておいてください。

音量設定のめやす

スクリプト内で、音量の増減の単位は、デシベル dB で設定するようになっています。

そこで、デシベルの定義と目安の数値を挙げておきます。
サンプルスクリプトの中では、音量の変換を +8dB として記載していますが、音量を2~3倍に増加させることに対応しています。
音量を下げたい場合は、マイナスの値を設定してみてください。
また、変換したい音源に応じて値を微調整し、聞き比べて確認してください。
対数の底に 10 を取っているので、10倍が 20 dB に対応する関係になっています。

デシベルの定義

$$ X, dB = 20 \log_{10} {\frac{P1}{P0}} $$
P1: 変換後の音圧
P0: 変換前の音圧

デシベルの変換表

倍率表示 P1/P0 デシベル表示 X, dB
0.1倍 -20dB
0.5倍 -6.0dB
0.8倍 -1.9dB
0.9倍 -0.9dB
1.0倍 0.0dB
1.1倍 0.82dB
1.2倍 1.6dB
1.5倍 3.5dB
2.0倍 6.0dB
3.0倍 9.5dB
4.0倍 12dB

※ 音圧の定義を確認すると、音圧は大気圧からの圧力の変化分となっています。バネの変位量とエネルギーの関係と同じように、エネルギーに換算すると音圧の2乗がエネルギーに比例することになります。すると、エネルギーの比を取ってデシベル表示にすると、20×log … の形になります。
なお、音ではなく、Wi-Fi などの電波の強度を扱う場合は、基準となる信号強度を 1mW にとっており、エネルギーの比で定義されているため、10×log … の形になります。

活用例

・ たとえば、音楽と比較すると、語学用の音声を再生する場合はハッキリと聞き取りたいことが多いです。
そこで音量を少し上げ、一括変換で微調整を行います。
・ 動画ファイル(mp4)についても音量のレベル調整が可能です。動画の場合、録音環境がよくない/バラバラなことも多いため、調整したくなることが多いと思います。
・ 私の場合、自動再生したい音声や音楽はローカルネットワーク内の Raspberry Pi (Linux)のフォルダに入れて、自動実行させて活用しています。フォルダが複数作ってあり、曜日ごとに異なる音楽ファイル等を自動再生しています。
・ これまで一部、音声のレベルが小さすぎるデータがありましたが、どの音声・動画ファイルも音量がほぼ一定で再生できるようになりました。

まとめ

音声ファイルの音量レベルを一括で変換する Python のスクリプトについてまとめました。
これで、自動再生する音源の音量レベルを一定に調整することができるようになりました。

当初、Python のプログラムを新たに作って、ファイル名ごとに音量を設定して再生するようにしようかなとも思いましたが、上記の方法が最もシンプルで見通しがよいと思います。

関連リンク
・ ffmpeg のインストール手順 【Windows】
・ フォルダ内のすべての音声・動画ファイルを再生する 【Raspberry Pi】
・ ドレミファソラシドを鳴らすサンプル【Python】
・ 動画のダウンロードに関するまとめ
・ ファイル名を一括変換する 【Python】
・ ファイルを一括で移動する 【Python】

サンプルスクリプト

import os
import glob 

path1 = os.path.dirname(__file__) + "/folder1/" 
print( path1 ) 

list1 = glob.glob( path1 + "*.*" ) 
print( list1 ) 

for file1 in list1: 
    print( file1 ) 
    file2 = path1 + "done1/" + os.path.split( file1 )[1] 
    print( file2 ) 
    if os.path.exists( file2 ): 
        print( "exist:" + file2 ) 
    else: 
        print( "convert:" + file2 ) 
        cmd1 = "ffmpeg -i " + '"' + file1 + '" -filter:a "volume=8dB" "' + file2 + '"' 
        print( cmd1 ) 
        os.system( cmd1 ) 

タイトルとURLをコピーしました