OpenSMILEで音楽分析してみる | サイバーエージェント 公式エンジニアブログ

Goðan daginn!(こんにちは!)

秋葉原ラボのY.F.です。

 

ゴールデンウィーク、みなさんいかがお過ごしでしたか?

ブルーラグーン

アイスランドまで足を伸ばしてみました。

さて、連休明けにブログを書けと言われたもので、帰りの機内でぽつぽつ執筆しているのですが…

今回は、音楽から様々な特徴や情報を取り出すツール兼ライブラリ"OpenSMILE"で色々と遊んでみることにします。

※OpenSMILEは個人・研究(企業での基礎研究も含む)用と商用ではライセンスが異なります。今回はあくまで基礎研究として取り扱っています。

まずはOpenSMILEのダウンロードはこちら。[1]

おおむね、音楽分析の流れとしては

  • 音楽(=サンプリングされた数値の列)を入力
    • →これを基に一部情報を取得
  • フーリエ変換でもって周波数単位のデータに変換
  • 各種分析を行って結果を出力
  • 様々な曲の結果データから音楽の特性を判定したり、類似する音楽を探しだしたりする

となります。


今回はOpenSMILEの中の手法を使って、音楽の主旋律を取り出す処理を試してみることにします。とはいえ実際の曲を使うと色々と大変なのでテストデータ[2]で。
以下の図のように進めていきます。

(0) 元データの波形 元データ

(1) 時間単位に分割→窓関数をかける

音楽データを一定の秒数ごとに分割します。分析したい周波数領域によって長さを調整します。音楽であれば50ms-200ms程度。今回は50msごとに、前後50ms(合計100ms)ずつ分割しておきます。

さらに前後のデータの干渉をある程度取り除くために関数を掛け合わせます。

(2) フーリエ変換→周波数スペクトルを算出

大学で理工系を履修された方には聞き覚えがあるんじゃないかと思いますが、一応(離散フーリエ変換について)ざっくり書くと、ある数値ベクトルx_i(i=0, 1, ..., n-1)に対するフーリエ変換は

となります。これをうまいことバタフライ演算などでコンピュータ上で計算するもとを高速フーリエ変換(FFT)というわけですね。

フーリエ変換によって、元の波形データからは1波長~(データ数/2)波長の周波数ごとの強度が理屈の上では取得できます。

計算上、(1)で分割したデータからは、1波長=1/0.1(/s)=10Hz以上のデータが取得できることになるはずです。

今回のテスト用の音楽は22kHzがサンプリング周波数なので、上限は自ずと半分の11kHzになります(ナイキスト周波数)。

(3) 音程ごとに集約

現代音楽で一般的に使われている(と思われる)平均律は、A(ラの音)=27.5Hz の2の累乗をベースに、1音ごとに"2の1/12乗"ずつ積み上がっていくようになっています。

これを踏まえて、(2)で算出した周波数スペクトルを音階ごとに振り分けていきます。

Subtone結果

(4) CHROMA

(3)の結果をオクターブを外した音階(ドレミ…)ごとにまとめます。

CHROMA結果

(5) 主旋律を選択

(4)のうち、分割した単位ごとに最大の音階を計算すれば完成です。

CHROMA最大値(全域)

拡大してみると

CHROMA最大値(先頭25秒)

(3)の段階でも最大値を取ってみるとMIDIのようにデータが取れている(気がします)。

Subtone最大値(全域) Subtone最大値(先頭25秒)

いかがでしょうか? 簡単でしたが、皆さんもお試しあれ。

ただし著作権のある市販の音楽などで試す場合はあくまでも個人で楽しむ範囲にしましょう。

今回はゴールデンウィーク明けということで、こんな感じで失礼しますm(_ _)m

 

参考