音楽解析ライブラリlibrosaで津軽三味線をスペクトル解析してみた
音声信号は、様々な周波数の成分から構成されています。
このデータから、周波数毎の強さをフーリエ変換によって調べる処理をスペクトル解析といいます。
スペクトル解析を応用することで、
・類似楽曲の分類
・和音の分離
・楽器の認識
・自動採譜
などが可能になります。
簡単なコードを書くだけでスペクトル解析をやってくれるライブラリ「librosa」を見つけたので、今回は津軽三味線のスペクトル解析を実施して、周波数のデータをグラフ化するところまでやってみます。
目次
librosaとは?
librosa(りぶろさ)は、音楽分析のためのPythonパッケージです。
2015年にリリースされたそうです。
スペクトル解析、テンポや拍子の分析、画像出力など、音楽の分析に必要な機能があらかじめ実装されていて、数行のコードを書くだけで様々な処理をしてくれる便利なライブラリです。
librosaのインストール
それでは、Ubuntu 14.04の環境にlibrosaをインストールしていきます。
- サーバにログインして、rootユーザになります。
$ su -
- サーバの各種パッケージは、あらかじめ最新にしておきましょう。
# apt-get update # apt-get upgrade
- Python関連のパッケージをインストール。
# apt-get install python-pip python-dev python-tk
- 音声コーデックライブラリffmpegをインストール。
# apt-get install software-properties-common # add-apt-repository ppa:mc3man/trusty-media # apt-get update # apt-get install ffmpeg
- librosaをインストール。
# pip install pip --upgrade # pip install librosa
- librosaで必要となる関連ツールをインストール。
既にインストール済であれば、コマンドに「–upgrade」オプションをつけて最新版にします。# pip install numba --upgrade # pip install colorama --upgrade # pip install scipy --upgrade # pip install matplotlib --upgrade
- ホームディレクトリに、作業用ディレクトリを作っておきます。
# exit $ cd ~ $ mkdir -p python/librosa $ cd python/librosa
短時間フーリエ変換
準備ができたので、さっそく試してみましょう。
通常、スペクトル解析では離散フーリエ変換が使われますが、離散フーリエ変換は時間の概念がないため、ノイズに弱く、音楽解析には不向きとのこと。
曲を短時間で区切ってフーリエ変換する「短時間フーリエ変換」(Short-Time Fourier Transform)が良いそうです。
今回は、津軽じょんから節新節のmp3ファイルを用意して、フーリエ変換をかけて、結果を画像に出力します。
こんなコードを書きました。
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt # ファイル読込 y, sr = librosa.load('shinbushi.mp3') # 短時間フーリエ変換 S = np.abs(librosa.stft(y)) # 画像出力 plt.figure(figsize=(10,4)) librosa.display.specshow(librosa.amplitude_to_db(S, ref=np.max), y_axis='log', x_axis='time') plt.title('Power spectrogram') plt.colorbar(format='%+2.0f dB') plt.tight_layout() plt.show()
では、これを実行してみます。
$ python spectrogram.py
こんな画像が出力されました。
たった数行のコードだけで、スペクトル解析ができました!
これは便利!
ただ、これだとちょっとわかりにくいので、曲の中から適当に10秒間抜き出して、拡大表示してみます。
特定の秒数だけ読み込む場合は、ファイル読込のコードを少し書き換えます。
以下の例では、曲の30秒目から10秒間を抜き出しています。
y, sr = librosa.load('shinbushi.mp3', offset=30.0, duration=10.0)
抜き出した部分の曲は以下です。
これで再実行したところ、こんな結果になりました。
予想以上にきれいなスペクトルが出力されました!
三味線の倍音成分も、はっきり確認できます。
これを分析すれば、自動採譜が実現できそうな気がします。
Constant-Q 変換
librosaには、他にも便利な変換機能が用意されています。
フーリエ変換を、さらに音楽解析向けに改良したのがConstant-Q変換(定Q変換)です。
詳細な仕組みはこちらの記事が詳しいですが、高周波数では分解能を低くして、低周波数では分解能を高くすることで、精度を上げようというものだそうです。
librosaでConstant-Q変換をすると、縦軸が音階になっているグラフを出力できるので、これも試してみます。
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt # ファイル読込 y, sr = librosa.load('shinbushi.mp3') # Constant-Q変換 C = np.abs(librosa.cqt(y=y, sr=sr, bins_per_octave=12*3, n_bins=7*12*3)) # 画像出力 plt.figure(figsize=(10,4)) librosa.display.specshow(librosa.amplitude_to_db(C, ref=np.max), y_axis='cqt_note', x_axis='time', bins_per_octave=12*3) plt.title('Constant-Q power spectrogram') plt.colorbar(format='%+2.0f dB') plt.tight_layout() plt.show()
出力結果はこんな感じ。
見やすくするため、10秒間を拡大表示。
音階がきれいに出力されました。
まとめ
librosaのおかげで、スペクトル解析がどんなものなのかを理解することができました。
津軽三味線の自動採譜で先行する八戸工業大学小坂谷教授の研究では、あらかじめ三味線の各音の周波数データを取り込んでおいて、入力データを順次比較していくことで、採譜をしているそうです。
自分も実装できそうな気がしてきたので、今回のスペクトル解析の実験を応用して、さらに研究を進めてみようと思います。