【Python】音楽を読み込んで波形を描画したい【librosa】

5 min read読了の目安(約4600字

祝Zenn初投稿。

こんにちは、IT系勤務のおっくソです。

ディープラーニングを勉強し始めて、「音楽を読み込んで波形を描画したい」という状況になり、なんとか最低限波形として描画できるところまで持っていけたので、まとめてみました。


和太鼓の音の描画結果

基本的な部分ですが、参考になれば嬉しいです。

前書き

AIが流行り始めてだいぶ経ち、「そろそろ勉強し始めないとやばいな」と感じるようになってきた今日この頃。

なので2年半前に買ったけど挫折してしまっていた、オライリーのDeep Learningを読み直すことにしたんですよね。

https://amzn.to/39efgnY

一念発起したツイートもしてました。

https://twitter.com/ok_kushun/status/1348238273244762114

ちなみに挫折した理由は、「作りたいものが浮かばなかったから」

当時は、「画像認識できたからって、結局自分は何を作りたいんだ?」と考えてしまったんです。

例えば画像認識のアルゴリズムを組めることに楽しさを感じるのであればよいのですが、僕は感じられず。

なので今回勉強し始めた時も、「自分は何を作りたいのか」を考えました。

そこで僕は思いました。

音楽だ。

僕は根っからのEDM大好きマンでして、クラブやフェスに行くタイプでした。

そこではDJが音楽をミックス(複数の音楽を一緒にかけたり、繋げていくこと)しているわけです。

「それをAIでできたらよくね!?」

僕は決めました。AIのDJを作る。

まあいつまでモチベーションが続くか分からないですが、とりあえず始めてみようと。

音楽を描画したい

音楽絡みのAIを作ることがなんとなくのゴールなので、「音楽 ディープラーニング」とかで検索してみました。
(ちなみに前書きに書いた通りオライリー本で勉強してたのですが、やはり理論だけじゃ楽しくないので、librosaにも手をつけ始めたって感じです。)

すると、「librosa」というパッケージが使えそうだなと。

たぶん読み方は「リブローサ」

librosa is a python package for music and audio analysis.

とあり、「librosaは音楽・音声分析のためのPythonのパッケージ」みたいですね。

要は音楽に特化したPythonコードのかたまり。

「これだ!」

で、librosaを調べていると、音楽を読み込んでそれを波形として描画してる方々がたくさんいたので、自分もまずは音楽を描画してみることにしました。

librosaで音楽ファイルを波形として描画する

librosaをインストールする

僕は勉強していたオライリー本に書いてあるように、Anacondaを使っていたので、それ前提で書かせてもらいます。

Anacondaはデータサイエンス向けの環境を提供するプラットフォームです。科学技術計算などを中心とした、多くのモジュールやツールのコンパイル済みバイナリファイルを提供しており、簡単にPythonを利用する環境を構築できます。[1]

(正確ではないですが、Node.jsのバージョン管理ツールのNodebrewみたいな位置付けだとイメージしてます)

Anacondaをインストールしたい方のために、インストール方法もまとめたのでご参考まで。

Anacondaのインストール方法
  1. まずAnacondaのホームページにいきましょう。

  2. ページ上部の「Products」タブから「Individual Edition」(個人利用のため)をクリック。

  3. Individual Editionのページに移動したら、Downloadをクリック。

  4. するとページ下部に勝手に移動し、Anaconda Installersという部分が表示されるので、自分のPC・環境にあったものを選択してください。(僕はMacを使っているので、「64-Bit Graphical Installer (435 MB)」をダウンロードしました)

  5. ダウンロードしたインストーラーを起動し、指示に従いインストールを進めていけば完了

  6. ターミナルを開いて、python --versionと打って、Pythonのバージョンが表示されれば成功です。

$ python --version
Python 3.8.5

ちなみにcondaというAnacondaのコマンドを打てば、以下のようにcondaコマンドのヘルプメッセージが出るはずです。

$ conda
usage: conda [-h] [-V] command ...

conda is a tool for managing and deploying applications, environments and packages.
.
.
.

Anacondaをインストールできていれば、Anacondaのcondaコマンドを使って、librosaをインストールすることができます。

ターミナルを開いて、以下コマンドを入力。

$ conda install -c conda-forge librosa

これで完了です。

Anacondaをインストールしていない方は、他の方法でもインストールできるみたいなので、librosaの公式ホームページを参考にしてみてください。

pythonファイルにコードを書いていく

では早速コードを書いていきます。

いろいろ調べて参考にさせてもらい[2][3]、以下の通り書いてみました。
(補足はすべてコメントに書いています)

librosa-01.py
# librosaをインポート
import librosa
# numpyをインポート(配列を生成するため)
import numpy as np
# matplotlibをインポート(グラフ描画するため)
import matplotlib.pyplot as plt

# 音楽ファイルのパスを設定(例:"/foldername/filename.mp3")
file_name = "{filepath}"
# loadメソッドでy=音声信号の値(audio time series)、sr=サンプリング周波数(sampling rate)を取得
# 参考:https://librosa.org/doc/latest/generated/librosa.load.html?highlight=load#librosa.load
y, sr = librosa.load(file_name)
# 時間 = yのデータ数 / サンプリング周波数
# 参考:https://note.nkmk.me/python-numpy-arange-linspace/
time = np.arange(0,len(y)) / sr

# xにtime、yにyとしてプロット
plt.plot(time, y)
# x軸とy軸にラベルを設定(x軸は時間、y軸は振幅)
# 参考:https://techacademy.jp/magazine/19316
plt.xlabel("Time(s)")
plt.ylabel("Sound Amplitude")

# グラフを表示
plt.show()

実行してみると...

$ python librosa-01.py
/Applications/anaconda3/lib/python3.8/site-packages/librosa/core/audio.py:162: UserWarning: PySoundFile failed. Trying audioread instead.
  warnings.warn("PySoundFile failed. Trying audioread instead.")

(実行した時に「PySoundFile failed.」と出たので、調べてみるとlibrosaのバージョンによるものようですが[4]、問題なく実行できたのでいったん無視)

下のような感じで、音楽ファイルの描画ができました。

読み込んだのが音楽だったので、信号がかなり大きくなってますね。

もう少し単調な音だと、波形がわかりやすいかなと思い、「和太鼓の音[5]」で試してみると...

和太鼓の「どんっ」という音の通りの波形になってくれました。

描画するときの細かいオプションはいろいろあるみたいですが、ひとまず音声ファイルを読み込んで波形として描画することができました!

脚注
  1. https://www.python.jp/install/anaconda/index.html ↩︎

  2. https://iq.opengenus.org/introduction-to-librosa/ ↩︎

  3. https://librosa.org/doc/latest/generated/librosa.load.html?highlight=load#librosa.load ↩︎

  4. https://www.wizard-notes.com/entry/python/dev/00000002 ↩︎

  5. https://soundeffect-lab.info/sound/anime/ ↩︎