librosa-Pythonで音声処理, 音楽解析


 

目次

1. librosaとは
– librosaのモジュール一覧
2. librosaの実験
2.1 librosaの環境構築
2.2 音声ロード
2.3 音楽情報検索
2.4 beat tracker
2.5 音声の可視化
2.6 harmonic-percussive
2.7 スペクトログラム

 

1. librosaとは

librosaは音楽・オーディオの処理と解析をするPythonパッケージです。

– librosaのモジュール一覧

librosa : ibrosaのコア
librosa.beat : テンポ、ビートを検出する機能
librosa.decompose: 調波打楽器音分離とスペクトログラムの分解に関する機能
librosa.display: 音声データの可視化する機能
librosa.effects: ピッチシフトとタイムストレッチといった音声処理機能
librosa.feature: 音声の特徴抽出機能
librosa.filters: フィルタバンクを生成する機能
librosa.onset: オンセット検出とオンセット強度計算に関する機能
librosa.segment: 再帰行列の構築、逐次制約付きクラスタリングなどのための関数の機能
librosa.sequence: ビタビ復号化、遷移行列といった逐次モデリングのために必要な関数の機能
librosa.util: 正規化、パディング、センタリングといった関数の機能

資料:https://librosa.org/doc/latest/index.html
Github:https://github.com/librosa/librosa

2. librosaの実験

2.1 librosaの環境構築

PyPIでのインストール

pip install librosa

 

Anacondaでのインストール

conda install -c conda-forge librosa

今回はGoogle Colabで実験します。Librosaがインストールされています。

 

2.2 音声ロード

Nutcrackerのサンプルデータをロードします。yの音声のデータとsrのサンプルレートを出力します。

サンプリングレートは、1秒間に実行する標本化処理の回数です。例えば、標準的なサンプリングレートである44.1kHzの場合、毎秒44100回標本化を行うということです。

# Load example

import librosa

 

filename = librosa.example(‘nutcracker’)

y, sr = librosa.load(filename, duration=20.0)

 

音声を確認します。

import IPython.display

 

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

 

2.3 音楽情報検索

結果を確認します。

22050のサンプルレート、441000のサンプルデータ、20秒です。

print(sr)        # sampling rate

print(y)

print(len(y))    # total sample

print(len(y)/sr) # second

22050

[ 2.2716861e-06  5.3327208e-06 -7.2473290e-06 …  7.9551965e-02

7.2584212e-02  6.9123745e-02]

441000

20.0

 

ビット深度(びっとしんど)は、ある単位あたりのビット数です。 ビットの深さ、ビットデプス (bit depth) とも表現します

これらは、以下の対応あります。

ただし以下の場合はビットレートで、下記のような音声の品質表です。

 

2.4 beat tracker

テンポ、ビートを検出するができます。

112 ビート・パー・ミニッツになります。

ビート・パー・ミニッツ(BPM:Beat Per Minute)は1分間の拍数を示す値で曲のテンポを示す数値。

# Run beat tracker

tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)

 

# tempo beats per minute

print(f’Estimate tempo {tempo :.2f} beats per minute’)

Estimate tempo 112.35 beats per minute

 

2.5 音声の可視化

Matplotlibで音声の可視化します。

import matplotlib.pyplot as plt

import librosa.display

 

plt.figure()

plt.subplot(3, 1, 1)

librosa.display.waveplot(y, sr=sr)

plt.title(‘Monophonic’)

2.6 harmonic-percussive

HPSS(Harmonic/Percussive Sound Separation)というのは、音源中の調波音/打楽器音が、それぞれ時間方向に滑らか/周波数方向に滑らかという異った性質を持つことを利用して、両者を分離する方法のことです。

y_harm, y_perc とのharmonic-percussiveの音声を簡単にできます。

# Separate harmonics and percussives into two waveforms

import librosa.display

 

y_harm, y_perc = librosa.effects.hpss(y)

 

print(y_harm.shape)

print(y_harm)

 

harmonic-percussiveの可視化

plt.subplot(3, 1, 3)

librosa.display.waveplot(y_harm, sr=sr, alpha=0.25)

librosa.display.waveplot(y_perc, sr=sr, color=’r’, alpha=0.5)

plt.title(‘Harmonic + Percussive’)

plt.tight_layout()

plt.show()

2.7 スペクトログラム

音声信号に「短時間フーリエ変換(Short-time Fourier transform : STFT)」を行うことでスペクトログラムが得られます。

harmonic-percussiveのスペクトログラムを可視化します。スペクトログラムの画像データは画像の深層学習ネットワークに入力することができます。

import numpy as np

import matplotlib.pyplot as plt

 

from IPython.display import Audio

 

import librosa

import librosa.display

 

D = librosa.stft(y)

 

D_harmonic, D_percussive = librosa.decompose.hpss(D)

 

# Pre-compute a global reference power from the input spectrum

rp = np.max(np.abs(D))

 

fig, ax = plt.subplots(nrows=3, sharex=True, sharey=True)

 

img = librosa.display.specshow(librosa.amplitude_to_db(np.abs(D), ref=rp),

y_axis=’log’, x_axis=’time’, ax=ax[0])

ax[0].set(title=’Full spectrogram’)

ax[0].label_outer()

 

librosa.display.specshow(librosa.amplitude_to_db(np.abs(D_harmonic), ref=rp),

y_axis=’log’, x_axis=’time’, ax=ax[1])

ax[1].set(title=’Harmonic spectrogram’)

ax[1].label_outer()

 

librosa.display.specshow(librosa.amplitude_to_db(np.abs(D_percussive), ref=rp),

y_axis=’log’, x_axis=’time’, ax=ax[2])

ax[2].set(title=’Percussive spectrogram’)

fig.colorbar(img, ax=ax)

 

担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト