Python | librosaを用いて音の大きさ(音圧)を数値化しよう

Python | librosaを用いて音の大きさ(音圧)を数値化しよう

皆さん、こんにちは。

今回注目するのは「音圧」です。

「音圧」と「音量」

音量と音圧の違いについてChatGPTに聞いたところ、以下のような回答がありました。

音量と音圧は密接に関連していますが、同じではありません。音量は我々が聞く音の主観的な大きさを指し、音圧は音の物理的な強さを示します。つまり、音量は私たちの感じ方に基づいている一方、音圧は音のエネルギーや振動の強さを表します。

音の発生源(楽器や声など)がより強く振動すると、その音はより高い音圧を持ちます。しかし、その音が我々の耳に届いたとき、我々はその音の大きさを感じるわけです。つまり、音の物理的な強さ(音圧)が高ければ、通常は我々が感じる音の大きさ(音量)も大きくなります。しかし、これには他の要因も影響を及ぼすことがあります。

また、音量は音圧の他に、音の周波数(ピッチ)や音の性質(音色)なども影響を与える要素です。例えば、同じ音圧でも低い音と高い音では、高い音の方がより大きく聞こえることがあります。これは、人間の聴覚が異なる周波数の音に対して敏感であるためです。

総括すると、音量は私たちの感じ方に基づいた主観的な大きさを表し、音圧は音の物理的な強さを示す指標です。音量は音圧に影響されることがありますが、その他の要素も関与しています。

以上のことから、定量的なデータとして扱うには「音圧」を見る必要があることが分かります。

「RMS」と「デシベル(dB)」

音がどれだけ大きいかを見る指標として「RMS(二乗平均平方根、Root Mean Square)」を用いる方法があります。

RMSは「音の振動の強さ」を平均化したものです。

一方、dBは「人間の聴覚の感じ方」と「音の物理的な性質」との関係を数値化したものです。

logで表現されることから、振幅と人間の聞こえ方は対数の関係があることが分かります。(振幅が100倍になったら、聞こえ方は2倍になる)

音圧レベル (dB) = 20 * log10(RMS振幅 / 基準振幅)

以上を踏まえてサンプルプログラムを作成します。

サンプル

今回は以下の音源を利用します。「残念でした~♪」って感じの音源ですね。

1)波形

先ずは波形を見てみましょう。

import librosa.display 
import matplotlib.pyplot as plt

y,sr = librosa.load("input.wav")

#波形の生成
librosa.display.waveshow(y)

plt.xlabel("Time(s)")
plt.ylabel("Sound Amplitude")
plt.show()

#再生
IPython.display.Audio(data=y, rate=sr)

2)RMS

次に音圧を計算します。

import librosa.display 
import matplotlib.pyplot as plt

y,sr = librosa.load("input.wav")

rms=librosa.feature.rms(y=y) #RMSを計算
time=librosa.times_like(rms,sr=sr) #時間軸の生成

plt.xlabel("Time(s)")
plt.ylabel("RMS")
plt.plot(time,rms[0])

※ librosa.times_likeについて↓

3)dB変換

次にdB変換を行います。

import librosa.display 
import matplotlib.pyplot as plt

y,sr = librosa.load("input.wav")

rms=librosa.feature.rms(y=y) #RMSを計算 

# 音圧レベル (dB) = 20 * log10(RMS振幅 / 基準振幅)
db=librosa.amplitude_to_db(rms) #dBを計算
time=librosa.times_like(db,sr=sr) #時間軸の生成

plt.xlabel("Time(s)")
plt.ylabel("dB")
plt.plot(time,db[0])

※ librosa.amplitude_to_dbについて

dBがマイナスで表記される理由として、デジタル信号は「0dBFS(フルスケール)」として0dBを超えた音はすべてハードクリップされてしまいます。そのため必ずマイナスで表記されるとのこと。

-∞に向かうほど音が小さくなるわけですが、 librosa.amplitude_to_dbを用いた場合は最小dBを「-100dB」として計算しています。

今回は以上です!

本日のAmazonおすすめ_Top10

2024-04-28 21:20:32時点