信号処理とか音楽の分析に大活躍しそうなlibrosa


振動センサーとかマイクとかを使って取得した振動や音、信号をPythonで処理するときに便利なツール見つけたので、自分の備忘録としてもQiitaに投稿します。
音響信号だったり、センサの信号だったりをディープラーニングや、機械学習になげるときに使えそうです。

LibROSA
https://librosa.github.io/librosa/

ドキュメントを見ると、音楽や音の分析につかうパッケージのようです。
音楽分析の機能が豊富ですが、信号処理の必要なものはあるていどそろっている気がします。

2019年12月現在では、v0.7.1が最新のようです。

インストール方法

pip もしくは、Anacondaでインストールできます。

pipの場合

pip install librosa

condaの場合

conda install -c conda-forge librosa

公式のドキュメントには、ソースからインストールする方法も記載されてます。
Pythonのバージョンやインストール環境(Linux, OSX, Windowsなど)ごとに注意点もあるようなのでチェックが必要。

Wavの読み込み

音楽用のファイル形式は色々ありますが、wavやmp3が使えるそうです。
あとで書きますが、読みだした信号は配列に数字がならんでいるだけなので他のライブラリを組み合わせれば、さまざまな音源に対応できそう。

ライブラリの確認のために、ESC-50の音源を使います。
環境は、Jupyter Lab上でPython3.6を使ってます。

ESC-50のエンジン音を読み込んでみます。
librosa.loadを使用します。
引数には、ファイル名とサンプリング周波数を指定します。

import librosa

file_name = '/home/sound_process/data/sound/engine/1-18527-A-44.wav'
wav, sr = librosa.load(file_name, sr=44100)

注意しないといけないのが、srの値です。
srの値がデフォルトで22,050Hzになっています。
なので、返ってくる値が22,050Hzになってしまいます。
読み込みに直接影響はないですが、周波数計算する時とかグラフの横軸に影響がでます。

波形の表示も簡単にできました。
内部でmatplotlibを使っているので、画像サイズや線の色もmatplotlibの書き方で変更できます。

import librosa.display
import matplotlib.pyplot as plt

plt.figure()
plt.figure(figsize=(15, 5))
librosa.display.waveplot(wav, sr)
plt.show()

実行するとこんな感じです。

信号の形式

loadで読み込まれた信号は1次元の配列に格納されています。
こんな感じ。

もし、信号のデータがcsvであってもPythonで読み込んで配列にしてしまえば、wavを読み込んだ時と同じようにlibrosaで扱えます。

フーリエ変換

信号処理といえば?フーリエ変換ですね。
stft というフーリエ変換の関数が用意されています。
Short-time Fourier transform (短時間フーリエ変換) ができます。

import numpy as np

stft_result = librosa.stft(wav)
abs_result = np.abs(stft_result)
power_spec = librosa.amplitude_to_db(abs_result, ref=np.max)

plt.figure(figsize=(25,5))
librosa.display.specshow(power_spec, y_axis='log', x_axis='time', sr = sr)
plt.title('Power Spectrogram')
plt.colorbar(format='%+2.0f dB')

plt.tight_layout()
plt.show()

他にも、信号分析系で言えばメル周波数ケプストラム係数(MFCC)が計算できたり、逆フーリエ変換も簡単にできます。
ピッチシフトができたり、クロマグラムも取得できるので音程に変換したりできるのも面白そうです。