Music Transformerを動かしてみる

シグナル・コンポーズの大和です。
研究活動の一環で、機械学習/Deep Learningの音楽生成の仕組みを試しているところなのですが、MIDIベースでの今のところ一番性能が良さそうなMusic Transformerという仕組みがあります。

今回はそれをとりあえずMacBook Proで動かしてみたいと思います。
あまりメンテナンスされてないコードみたいでちょっと難ありだなーという感じですが、同じくシグナル・コンポーズのleicoにも手伝ってもらって「とりあえずは動いたかな、、、」というところまでは行ったのでそれの記録です。

Music Transformer tensorflow 2.0 のダウンロード、必要モジュールのインストール

基本的にはこちらに書いてある通りのことを上からやっていきます。

$ git clone https://github.com/jason9693/MusicTransformer-tensorflow2.0.git
$ cd MusicTransformer-tensorflow2.0
$ git clone https://github.com/jason9693/midi-neural-processor.git
$ mv midi-neural-processor midi_processor

International e-piano competition のデータダウンロード

github リポジトリ内に Midi/ecomp というディレクトリを作ってそこにダウンロードしました。

$ mkdir Midi
$ mkdir Midi/ecomp
$ sh dataset/script/ecomp_piano_downloader.sh

pyenv の環境構築

python 3.7.7 をインストール、ローカルで利用できるようにします。
この辺りはそれぞれやり方あると思うんで、最終的にTensorflow2.0(最新は2.1)が使えるようにすれば良いです。
僕の場合、このあたりはpyenvとcondaでやってしまうと思います。

参考リンク:
https://leico.github.io/TechnicalNote/Mac/homebrew-pyenv

pyenv で動作する Python のバージョン管理

  • Python 3.7.7 をインストールする
$ pyenv install 3.7.7
  • ローカルで利用するバージョンを 3.7.7 に設定
$ pyenv local 3.7.7
  • Pythonのパッケージを動作させる仮想環境を構築する

参考リンク
https://leico.github.io/TechnicalNote/Python/homebrew-pyenv-venv-tf-keras

  • MusicTransformer という仮想環境を作成する
$ python3 -m venv MusicTransformer
  • MusicTransformer 仮想環境を有効化する
$ source MusicTransformer/bin/activate
  • MusicTransformer 仮想環境に TensorFlow 2.0.1 をインストールする

最新のTensorflowのバージョンは2.1なのですが下記のようにあるので2.0系を入れます。

1. This Repository is perfectly compatible with tensorflow 2.0
---
https://github.com/jason9693/MusicTransformer-tensorflow2.0

  • pip で入れれるバージョンの一覧を取得する

https://www.monotalk.xyz/blog/pip-インストールする-ライブラリの-version-番号を調べる/

  • pip で TensorFlow 2.0.1 をインストールする
$ pip install tensorflow==2.0.1
  • $ python preprocess.py {midi_load_dir} {dataset_save_dir} がエラーになる
$ python preprocess.py Midi/ecomp/ Midi/ecomp_dataset
Traceback (most recent call last):
File "preprocess.py", line 6, in <module>
from progress.bar import Bar
ModuleNotFoundError: No module named 'progress'

ので、必要なモジュールをインストールします。

$ pip install progress
$ pip install pretty_midi
$ pip install config

ここまでが必要なモジュール。

ソースコードを修正する

今のソースでは動かないのでソースの修正をします。
https://github.com/jason9693/MusicTransformer-tensorflow2.0/pull/17/files

  • preprocess.py の17行目を修正
# return encode_midi(path, augumentation=False)
return encode_midi(path)
  • preprocess.py を動作させる

Midiデータのフォルダは Midi/ecomp データセットの出力フォルダはMidi/ecomp_dataset にしました。

$ python preprocess.py Midi/ecomp/ Midi/ecomp_dataset

train.py を使ってダウンロードしたMIDIデータを使って学習するために必要なモジュールをインストールする

$ python train.py --epochs=100 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset
  • で動作させたら tensorflow-probability が無いと言われたのでインストールする。

tensorflow-probability の最新版( 0.9 )を入れたら tensorflow 2.1 が必要と言われたので、
tensorflow 2.0 ※で動作させるために tensorflow-probability は 0.8 をインストールします(※ Music Transformer の推奨バージョンは tensorflow 2.0)。

$ pip install tensorflow_probability==0.8

train.py を修正する。

そのままでは現状動かない。44行目を修正する。

# load data #dataset = Data('dataset/processed')
dataset = Data(pickle_dir)

pickle_dir の引数が全く機能していなかった。

  • train.py の引数を追加する

macbook Pro 2016 のGPUは cuda 対応していないので GPU を false にします。

$ python train.py --epochs=100 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset --multi_gpu=False

これでとりあえず動いた。
これをそのままやるといつまでも学習が終わらないので、実際に学習が行われてモデルが作られるかを確認するために以下のようにして動かしてみた。

$ python train.py --epochs=1 --batch_size=5 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset --multi_gpu=False

で、結果としては以下のようになりました。

...
====================================================
Epoch/Batch: 0/0
Train >>>> Loss: 6.38114, Accuracy: 0.0016601562965661287
Eval >>>> Loss: 6.38903, Accuracy: 0.0011718750465661287 
...
====================================================
Epoch/Batch: 0/100
Train >>>> Loss: 5.52144, Accuracy: 0.03528263047337532
Eval >>>> Loss: 5.44073, Accuracy: 0.03563410043716431
====================================================
...
Epoch/Batch: 0/200
Train >>>> Loss: 5.06596, Accuracy: 0.04672827571630478
Eval >>>> Loss: 4.99958, Accuracy: 0.046788834035396576

一応ロスが減少していっており、正確性も上がっているようです。
とはいえこの状態ではかなり学習としては足らないので、Google ColabやGPUを積んだ火力の強いUbuntuとかのマシンが欲しいですね、、、。

generate.py が動かないので動くように改造する

コードがメンテナンスされてないみたいなので仕方ないっちゃ無いけど、機械学習系のコードはこういうの多いですね、、、。
ドキュメントもあまりちゃんとしてないし、コードが風化するのが早い、、、。

デフォルトだと dataset/midi/BENABD10.mid を generate の種、RNNで生成する時最初に必要な情報として読み込むことにしていのでこれを --prior_midi=path/to/midi という形に改良する。21行目に以下を追加します。

parser.add_argument('--prior_midi', default='dataset/midi/BENABD10.mid', type=str, help='prior data for generate midi file')

そして、34行目に以下を追加

prior_midi = args.prior_midi

次に、56行目を変更

#inputs = encode_midi('dataset/midi/BENABD10.mid')
   inputs = encode_midi(prior_midi) 

generate.py を動作させる

コマンドはこれ。

$ python generate.py --load_path=Midi/ecomp_model --prior_midi=Midi/ecomp/BENABD10.mid --length=1000

ただし、lengthをデフォルト(2048)で実行するとエラーになります。1000程度なら大丈夫なので、とりあえずはこれをもとに少しいろいろな組み合わせで学習させてみようかと思います。

で。生成できたのがこれ。

test.midをダウンロード

ご依頼/相談/お問い合わせ

シグナル・コンポーズでは機械学習やシステム制作、音楽制作、Max/Max for Liveデバイス制作など、各種テクニカルなコンサルティングやディレクション、R&D、プロトタイピング、制作などお受けしています。何かあればお気軽にお問い合わせください。お待ちしております!

  

執筆:大和 比呂志

関連記事

前の記事へ

自前サーバで HTTP Live Streaming 配信をする

次の記事へ

Max for Live デバイス製作①