見出し画像

音の三大要素について 第四回

この記事を書いたのは 山岡さん.

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を出力してみると以下のような結果になります

[[0.01727106 0.01674794 0.01771604 0.02478847 0.03537324 0.06161145
0.10624318 0.16736308 0.25021026 0.3040428 0.30964392 0.3208587
0.30811182 0.276137 0.26400056 0.22149463 0.16627681 0.15316159
0.17511398 0.20263863 0.20801426 0.19841498 0.19490165 0.16618592
0.14118153 0.12308647]]

RMSは音圧レベルを表しているため、単位が[Pa]になっています。したがって音量を表しているものの普段の生活では見慣れない値の連続になっています。これを見慣れた値にするにはdBに単位変換をする必要があります
dBの単位変換には以下のコードを用います。

【PaからdBへの単位変換の式】

import numpy as np
dBref = 2e-5 # 1Pa = 94dBとなるための定数
x = 20 * np.log10(rms/dBref) #単位変換の式

単位変換結果を出力してみると以下のような結果になります

[[58.72578 58.45863 58.94673 61.864395 64.952896 69.77263 74.50542
78.45259 81.9455 83.63809 83.79665 84.105675 83.75357 82.801895
82.4115 80.88666 78.396034 77.6824 78.84582 80.113846 80.34126
79.930885 79.77571 78.39128 76.97496 75.78361 ]]

これで音量を表すのに見慣れた数字になりました。
さらに以下のCodeを用いて平均を算出すると任意の音声ファイルに対しての平均の音量を算出することが可能です。

【平均値の算出】
y =  np.average(x) #xの平均値の算出

これを計算すると、以下の結果になります。

75.97132[dB]

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のイメージ図です。

図1 frame_lengthとhop_lengthのイメージ

実際変えた場合のdB値の平均の値の変化を載せておきます。

frame_length = 2048 , hop_length = 512 ,   音量=75.97132[dB]
frame_length = 4096 , hop_length = 512 ,   音量=77.14854[dB]
frame_length = 2048 , hop_length = 1024 , 音量=75.64399[dB]
frame_length = 4096,  hop_length = 1024 , 音量=76.78661[dB]

上記から分かるように基本的に結果に大きな差は見受けられないです。(なので基本的にデフォルトの値で問題ないです。)

3. まとめ

今回は、Pythonを用いて音量を算出してみました。liborosaでは他にも様々な値が出せるため少し遊んでみると面白いと思います。

次回の内容

次回は「音高」をpythonを用いて算出します。


この記事が参加している募集

学問への愛を語ろう

この記事が気に入ったらサポートをしてみませんか?