音の三大要素について 第四回
この記事を書いたのは 山岡さん.
0. 前回の記事の内容
前回は、「音の高さ」を音声波形から数値化する手法について紹介しました。
まだご覧になってない方はぜひ下のリンクから読んでみてください。
1. この記事から理解できることは?
Pythonを用いて音の大きさを算出する方法
2. Pythonを用いた音量の算出
音の三要素について第二回の記事で、音の大きさを表す指標についての記事を掲載しました。
今回は、RMSに注目して音量を算出していきます。
Pythonには様々なライブラリーが存在しますが今回はその中でもlibrosaを使用します。
librosaを用いて、音量を算出する場合には関数librosa.feature.rmsを用います。
【音量算出】
import librosa
filename = "001.wav" #音量を算出したファイルの指定
y, sr = librosa.load(filename) #音量を算出したファイルのサンプリングレート等を読み込み
rms = librosa.feature.rms(y) #音量の計算
計算されたRMSを出力してみると以下のような結果になります
RMSは音圧レベルを表しているため、単位が[Pa]になっています。したがって音量を表しているものの普段の生活では見慣れない値の連続になっています。これを見慣れた値にするにはdBに単位変換をする必要があります
dBの単位変換には以下のコードを用います。
【PaからdBへの単位変換の式】
import numpy as np
dBref = 2e-5 # 1Pa = 94dBとなるための定数
x = 20 * np.log10(rms/dBref) #単位変換の式
単位変換結果を出力してみると以下のような結果になります
これで音量を表すのに見慣れた数字になりました。
さらに以下のCodeを用いて平均を算出すると任意の音声ファイルに対しての平均の音量を算出することが可能です。
【平均値の算出】
y = np.average(x) #xの平均値の算出
これを計算すると、以下の結果になります。
rmsの引数を変更することでrmsを求める区間等を変更できます。
【rmsの幅の変更】
rms = librosa.feature.rms(y,frame_length = 4096,hop_length = 1024)
frame_lengthがrmsを求める区間の幅を表しており、デフォルトは2048です。hop_lengthがrmsを求める区間の重なりを表しおり、デフォルトは512です。どちらかのみを変更することも両方変更することも可能です。
これらの調節によりより細かい変化に注目することも可能になります。
図1はframe_lengthとhop_lengthのイメージ図です。
実際変えた場合のdB値の平均の値の変化を載せておきます。
上記から分かるように基本的に結果に大きな差は見受けられないです。(なので基本的にデフォルトの値で問題ないです。)
3. まとめ
今回は、Pythonを用いて音量を算出してみました。liborosaでは他にも様々な値が出せるため少し遊んでみると面白いと思います。
次回の内容
次回は「音高」をpythonを用いて算出します。