【2分で完成】Pythonでテンポ検出(曲のテンポ自動検出)

Contents

はじめに

こんにちは。Tepoです。

今回は、PythonでLibrosaという音声信号分析に非常に役立つライブラリを用いて、曲のテンポ検出プログラムについてご紹介したいと思います。

Pythonとは、人工知能(AI)やデータ分析など現在ホットな分野で多く用いられているプログラミング言語の1つです。

以前、本ブログではPythonで簡易シンセサイザとなる波形生成について紹介させていただきました(こちら)。

なお、本ブログではプログラム作成をGoogle Colaboratoryを用いて行っております。

Google ColaboratoryはGoogleアカウントさえあれば無料で使える非常に便利な作成ツールです。

Google Colaboratory+Python+librosaで、無料で曲のテンポ検出プログラムを実装してみたいと思います。

Google Colabで実行してみよう

Google Colaboratoryを使ったことがない方はこちらで初期ログイン方法等の使い方を紹介しております。

今回解析する楽曲について、事前に正解のテンポがわかっている必要があるので、自分のバンドの曲にしました。

この曲のbpmは90です。

テンポを求めたい曲をGoogle Driveに格納します(下記手順参照)。

解析したい曲をGoogle Driveに格納出来たら、曲のパスを取得しましょう。

パスとは、PC上の住所になります。

「ここにある曲を解析してね!」とプログラムに指示を出すために、どこにあるのかを確認しましょう。

Google Colab画面左側のフォルダアイコンをクリックし、ドライブをマウントを選択してください。

その後、「このノートブックにGoogleドライブのファイルへのアクセスを許可しますか?」と確認ダイアログが出てくるので「Googleドライブに接続」を選択します。

これにより、Google Colab上でGoogleドライブのファイルを扱えるようになります。

その後、フォルダアイコンをクリックすると、「drive」というフォルダが出現します。

その中のMyDriveというフォルダから、先ほどGoogleドライブに入れた曲を探します。

曲を見つけたら、当該曲上で右クリックをしてパスをコピーをクリックします。

これでパスがコピーされました。

試しに適当な場所でペースト(ctrl+v)すると実際のパスが見えるかと思います。

それでは、実際のプログラムを見てみましょう。

#ライブラリインポート
import librosa                                                  #音声解析用のライブラリ

#変数定義
sampling_rate = 44100                                           #サンプリングレート
filename = 'パス'                                               #解析する音声ファイルのパス

#演算
y, sr = librosa.load(path=filename, sr = sampling_rate)         #音声ファイルを1次元のNumPy浮動小数点配列(変数y)に格納
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)        #テンポを算出

#結果表示
print('Estimated tempo: {:.2f} beats per minute'.format(tempo)) #結果を表示

先ほどコピーしたパスはfilenameという変数に入れましょう。

具体的には「パス」と書かれているところに、先ほどのコードをペーストします。

実行してみましょう。

結果::>>Estimated tempo: 90.67 beats per minute

お~~!!!ほぼほぼ合ってます!

プログラムの詳細は各行#の後に記載していますので、気になる方は読み解いてみてください。

プログラム解説(超ざっくり)

超ざっくりですが解説したいと思います。

ライブラリインポート

どのプログラムでも共通のことですが、プログラムの先頭では「お道具箱」を準備します。

人工知能(AI)を構築したいならAIのお道具箱を、データ分析したいならデータ分析用のお道具箱を、音楽関連の分析等をしたいなら音楽関連のお道具箱を用意します。

このライブラリが音楽解析には超強力です。

import librosa  #音声解析用のライブラリ

変数設定

どのプログラムでも共通のことですが、プログラムの二番目あたりでは「変数」を準備します。

変数とは、中学校でやったxとかyとかです。

sampling_rate = 44100    #サンプリングレート
filename = 'パス’        #解析する音声ファイルのパス

演算

どのプログラムでも共通のことですが、ライブラリをインポートして変数を定義したら具体的な演算を行います。

librosaは音声ファイルを読み込んで、なんかしら解析するという流れなのですが、この「なんかしら」が非常に充実しています。

今回も、一見難しそうなテンポ算出を一行でやっちゃっています。

y, sr = librosa.load(path=filename, sr = sampling_rate)     #音声ファイルを1次元のNumPy浮動小数点配列(変数y)に格納
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)        #テンポを算出

結果表示

どのプログラムでも共通のことですが、演算の後は結果表示を行います。

print('Estimated tempo: {:.2f} beats per minute’.format(tempo)) #結果を表示

まとめ

今回はGoogle Colab+Pythonでlibrosaというライブラリを用いてテンポ解析をしました。

非常に簡単ですよね。内部が実際どのような演算が行われているかはさておき、結果を得るだけなら非常に簡単にできてしまいます。

実際の関数の中身については時間があれば紹介をしたいと思いますが、まずは動いて感動することが大事だと思います。

librosaはまだまだネタがいっぱいありますので、これからも引き続き紹介したいと思います。