YOASOBI「アイドル」の音響分析(1) ー波形、メルスペクトログラムー
「小説を音楽にする」をコンセプトとするユニットYOASOBIの楽曲「アイドル」について、PhytonのライブラリLibrosaを使用して音響分析する方法を解説します。LibrosaはPythonの音響信号処理ライブラリであり、音楽データを様々に分析することができます。
本記事では、Librosaの基本的な使い方や機能について説明します。
具体的には、音楽データの読み込みや波形データの表示、スペクトログラムやメルスペクトログラムの作成方法などを解説します。
音楽や音響信号処理に興味がある人や、データ分析の基礎を学びたい人にとって、本記事は参考になるでしょう。
なぜYOASOBIの「アイドル」?
「夜に駆ける」以来のYOASOBIのファンだからです。
「アイドル」は2023年に世界的に大ヒットした曲です。
構成が複雑で、転調、テンポチェンジされていたりラップも含まれていますので、音響分析の対象として面白そうです。
譜面つきの演奏動画や、曲の解析記事も多く、音響分析結果と照合することができます。
Librosaとは
Librosaは、データサイエンスに強いプログラミング言語のPythonで使える、音楽信号や音声信号の解析や処理を専門とする強力なライブラリです。音楽や音声の研究、開発において、幅広く利用されています。テンポやキーなどの曲情報やMFCCなどの音声の特徴量を抽出できます。Librosaのdocumentationサイトには、各関数のアルゴリズムに関する論文が引用されていて、アルゴリズムを確認することができるのでとても安心感があります。
これまで、Librosaを使ってAdoさんとIKURAこと幾田りらさんの歌声のMFCC特徴量から学習モデルを作成して、幾田りらさんのような透明感のあるシンガーの探索を楽しんだりもしています。YouTubeやストリーミングサイトなどのレコメンドに満足できない方には、音響分析から自分だけのレコメンドシステム用の様々な小さな学習モデルを作成してみてはいかがでしょうか。
分析結果: Waveforms & Mel-frequency spectrogram
今回は、3つのプロットを作成しました。これらを眺めていると「アイドル」についてのおおよその特徴が見えてきます。
上から1番めのプロット 'Wabeforms,mono'は単純に波形の振幅の時間的推移を表しています。かなり密なので詳細はわかりませんが、特に2分30秒〜40数秒の振幅が減少していく部分が印象的で、大サビの前段ではないかと推測できます。
2番目のプロット 'Harmonic & Percussive waveforms' は 音響データをハーモニック成分とパーカッシブ成分に分けて表示しています。ハーモニック成分が顕著に小さくなっている1分30秒ごろと2分10秒あたりはラップの部分でしょうか。
3番めのプロットは 'Mel-frequency spectrogarm' です。メルスペクトログラム(Mel Spectrogram)とは、音声信号の周波数成分を可視化したグラフで、メル尺度という特殊なスケールを用いることで、人間の聴覚に近い分解能で周波数成分を表現していて、音声認識や音楽の感情認識の学習モデル作成などに利用されているようです。
この3つのプロットから曲の構成がおおよそ見えてきます。
上のプロット最下部に「アイドル」の曲の構成を付けています。'Harmonic & Percussive waveforms' と 'Mel-frequency spectrogarm' のプロットでの変化は曲の構成の変化と一致しています。
曲の構成は下記YouTubeの中村誠さんのドラム演奏動画の譜面を参考にしています。
Phytonコード
筆者はプログラミングと実行環境にGoogle Colab Proを使っています。今回はデフォルトのシステム RAM12.7GBで実行しています。Pythonのバージョンは下記コードで
'Python version: 3.10.12'
と出力されます。
import platform
print("Python version:", platform.python_version())
Librosaのインストール
pip install librosa
Import
import librosa
import matplotlib.pyplot as plt
import numpy as np
librosa.__version__
Librosaのバージョンは、'0.10.2.post1' です。
mp3ファイルの読み込み
「アイドル」のmp3ファイルはAmazonのデジタルミュージックで購入しました。250円です。
読み込みは下記コードを実行します。
librosa.loadのパラメータ sr は audio sampling rate で、分析できる周波数の上限がこのパラメータで決まってきます。srを指定しないとデフォルトは 22050 で周波数の上限は 22050/2 となります。mp3のオリジナルの sample rate で読み込むには sr=None とします。librosa.get_duration で曲の秒数を得られます。
y, sr = librosa.load('アイドル.mp3', sr=None)
print('sr',sr)
print('len(y)', len(y))
print('duration',f"{int(librosa.get_duration(y=y, sr=sr))}s")
出力:
sr 44100
len(y) 9403618
duration 213s
waveform 波形の視覚化
ひとつの枠に'waveform'と'harmonic and percussive'のプロットを作成します。
# wabeshow
fig, ax = plt.subplots(nrows=2, sharex=True, figsize=(12, 6))
librosa.display.waveshow(y, sr=sr, axis='time',ax=ax[0])
ax[0].set(title='Envelope view, mono')
ax[0].label_outer()
plt.minorticks_on() # 副メモリ
# harmonic and percussive components with transparency
y_harm, y_perc = librosa.effects.hpss(y)
librosa.display.waveshow(y_harm, sr=sr, alpha=0.5, ax=ax[1], label='Harmonic', axis='time')
librosa.display.waveshow(y_perc, sr=sr, color='r', alpha=0.5, ax=ax[1], label='Percussive', axis='time')
ax[1].set(title='Harmonic & Percussive waveforms')
ax[1].legend()
plt.minorticks_on()
melspectrogram
# メルスペクトログラムを計算
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
# デシベルスケールに変換
log_S = librosa.power_to_db(S, ref=np.max)
# スペクトログラムを表示
plt.figure(figsize=(12, 4))
librosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-frequency spectrogram')
plt.minorticks_on()
plt.tight_layout()
plt.show()