はじめに
Python の音楽信号分析モジュールである LibROSAには、楽曲の音高/メロディ/和音情報をより精度よく抽出するためのツールとして、Salience (顕著性)スペクトログラムを抽出する関数 librosa.salience
が実装されています。
今回は、librosa.salience
を使って音高を抽出をするサンプルコードを紹介します。
なお、Salience スペクトログラムの説明やlibrosa.salience()
の具体的な計算方法については、以下の記事にまとめています。
www.wizard-notes.com
librosa.salience の使い方
必要な入力と、始めに調整すべきパラメタについてコメントにて説明しております。
詳細は、LibROSAのドキュメントをご覧ください。
librosa.salience(
S,
freqs,
h_range,
weights=None,
aggregate=None,
filter_peaks=True,
fill_value=nan,
kind='linear',
axis=0
)
import numpy as np
import librosa
import librosa.display
import matplotlib.pyplot as plt
filepath = "./miku_doremi_bpm120.wav"
y, sr = librosa.load(filepath, mono=True, offset=0.3, duration=7)
h_range = [1, 2, 3, 4, 5, 6]
weights = [1.0, 0.5, 0.33, 0.25, 0.12, 0.06]
n_fft=1024
M = np.abs(librosa.stft(y, n_fft=n_fft))
fft_freqs = librosa.fft_frequencies(sr, n_fft=n_fft)
M_salience = librosa.salience(M, fft_freqs, h_range, weights, fill_value=0)
h_range = [1, 2]
weights = [1.0, 0.5]
n_bins=60
fmin = librosa.note_to_hz('C3')
C = np.abs(librosa.cqt(y, n_bins=n_bins, sr=sr, fmin=fmin))
cqt_freqs = librosa.cqt_frequencies(n_bins=n_bins, fmin=fmin)
C_salience = librosa.salience(C, cqt_freqs, h_range, weights, fill_value=0)
def plot(S_before, S_after, title_before, y_axis="linear"):
plt.subplot(2,1,1)
librosa.display.specshow(librosa.amplitude_to_db(S_before, ref=np.max),
sr=sr, y_axis=y_axis, x_axis='time')
plt.title(title_before)
plt.colorbar(format="%+2.0f dB")
plt.subplot(2,1,2)
librosa.display.specshow(librosa.amplitude_to_db(S_after, ref=np.max),
sr=sr, y_axis=y_axis, x_axis='time')
plt.title('Salience spectrogram')
plt.colorbar(format="%+2.0f dB")
plt.tight_layout()
plt.show()
plot(M, M_salience, 'Magnitude spectrogram', y_axis="log")
plot(C, C_salience, 'CQT spectrogram', y_axis='cqt_note')
分析する音源は、以下の合成音声(初音ミク)を使いました。
分析結果
振幅スペクトログラムベースの Salience スペクトログラム算出結果
CQT (クロマグラム) ベースの Salience スペクトログラム算出結果
どちらの結果でも、Salience スペクトログラムは入力スペクトログラムと比べて近隣周波数ビンへの漏れが軽減された信号となりました。
従って、 Salience スペクトログラムを使うことでメロディや音高、和音の分析アルゴリズムの精度が向上する可能性があります。
Fo抽出や
HPSSなどと組み合わせて使用するのもよいかもしれません。
www.wizard-notes.com
www.wizard-notes.com
実用時に参考になりそうなこと
- 分析対象の音の調波構造を確認し、
h_range
やweights
をチューニングするとよさそうです。