Python 実践 データ加工/可視化 100本ノック に挑戦 ノック76

Python 実践 データ加工/可視化 100本ノック」を購入したので、

一通りやっているところです。今日はノック76を行います。

資料は以下から入手できます。

Python実践 データ加工/可視化 100本ノック|サポート|秀和システム

 

ノック76 : 音データの大きさを取得してみよう

音の大きさは+1からー1の振幅で表します。

0に近いほど大きさは小さく、1やー1に近いほど大きいことになります。

 

マイナスの符号をなくすため、2乗した平均をとって音の大きさをみていきます。

2乗して平均値をとってさらにルートを付けたものをRMS(root mean sqare)と呼んでいます。

 

アスタリスク二つで2乗をとり、その値をmeanメソッドで平均し、最後にsqrtメソッドでルート演算を行っています。

import librosa
import numpy as np

audio1,sr1 = librosa.load('data/音声.mp3'         ,sr=None,offset=0,duration=1)
audio2,sr2 = librosa.load('data/携帯電話着信音.mp3',sr=None,offset=0,duration=1)

audio1_rma = np.sqrt(np.mean(audio1**2))
audio2_rma = np.sqrt(np.mean(audio2**2))

print(audio1_rma)
print(audio2_rma)

 

 

実行結果

0.11713616
0.07960435

 

duration=1のデータなので、実行結果の値は1秒間の平均値の値となります。

さらに細かくサンプリングしたRMSを求めていきます。

 

librosa.featureは縦軸、librosa,times_likeは横(時間軸)データとなります。

rms1=librosa.feature.rms(y=audio1)
rms2=librosa.feature.rms(y=audio2)

time1=librosa.times_like(rms1,sr=sr1)
time2=librosa.times_like(rms2,sr=sr2)

print(rms1.shape)
print(rms1)

 

実行結果

(87,)
[0.         0.01160998 0.02321995 0.03482993 0.04643991 0.05804989
 0.06965986 0.08126984 0.09287982 0.1044898  0.11609977 0.12770975
 0.13931973 0.15092971 0.16253968 0.17414966 0.18575964 0.19736961
 0.20897959 0.22058957 0.23219955 0.24380952 0.2554195  0.26702948
 0.27863946 0.29024943 0.30185941 0.31346939 0.32507937 0.33668934
 0.34829932 0.3599093  0.37151927 0.38312925 0.39473923 0.40634921
 0.41795918 0.42956916 0.44117914 0.45278912 0.46439909 0.47600907
 0.48761905 0.49922902 0.510839   0.52244898 0.53405896 0.54566893
 0.55727891 0.56888889 0.58049887 0.59210884 0.60371882 0.6153288
 0.62693878 0.63854875 0.65015873 0.66176871 0.67337868 0.68498866
 0.69659864 0.70820862 0.71981859 0.73142857 0.74303855 0.75464853
 0.7662585  0.77786848 0.78947846 0.80108844 0.81269841 0.82430839
 0.83591837 0.84752834 0.85913832 0.8707483  0.88235828 0.89396825
 0.90557823 0.91718821 0.92879819 0.94040816 0.95201814 0.96362812
 0.9752381  0.98684807 0.99845805]

 

rms.shapeの結果が87となっています。

サンプリング周波数が44100Hzなので、1秒間に44100データがあり、それを512件単位で平均値を収集した結果(44100÷512=86。0から始まっているので+1した87)です。

 

 

波形を表示します。

import matplotlib.pyplot as plt

plt.plot(time1,rms1[0],label='audio1')
plt.plot(time2,rms2[0],label='audio2')
plt.show()

RMSデータ

青色が音声データ、黄色が着信音です。

/* -----codeの行番号----- */