サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。

# はじめに
本投稿は、PyData.Okinawaさんの下記のイベント資料を参考にしています。
PyData.Okinawaさん、ありがとうございます。勉強させていただいてます。

[PyData.Okinawa Meetup #17 - Magentaで音楽生成
](https://github.com/PyDataOkinawa/meetup017)

上記のGitHubの通りに進めれば問題なく作曲できますが、大まかな流れと補足情報、作成した楽曲を下記記載しておきます。

1. Dockerイメージを準備する（要Docker)
2. PyData.Okinawaさんの作成されたスクリプトを配置する
3. MIDIファイルを配置する(要MIDI)
4. MIDIファイルをデータセットに変換する
5. モデル学習のスクリプトを実行する
6. 音楽の生成スクリプトを実行する
7. できた音楽を聴く


なお、もっと手軽に試したい、という方はMagentaの[GitHubページ](https://github.com/tensorflow/magenta)の内容をやってみる方が良いかもしれません。
[TensorFlow製アート・音楽生成プロジェクト「magenta」で曲を作ってみる。](http://qiita.com/tackey/items/cd75d385ec08094dbd7f)

# 1. Dockerイメージの準備
# 2. スクリプトの配置

GitHubの通りに進めました。


# 3. MIDIファイルを配置する(要MIDI楽曲)

僕がサカナクションさんが好きなので、そちらのMIDIファイルを準備することにしました。

[ヤマハミュージックデータショップ]
(https://yamahamusicdata.jp/artist/18336)で1曲200円で販売されているので、
・アイデンティティ
・Aoi
・アルクアラウンド
・新宝島
・ミュージック
・夜の踊り子
の6曲を購入しました。（最低何曲程度あるといいかについては、後述します。）
なおヤマハさんのサイト、IEかFireFoxでしか視聴できないと思います。


他にも、[midiworld](http://www.midiworld.com/)などにDisneyの楽曲などあるようです（著作権怪しい？）

準備したら、MagentaにMIDIファイルを入れましょう。


※注意※
MIDIフォルダに`beatles`フォルダがあると思いますが、
こちらを削除すると、学習が途中で止まってしまう？ようなので、削除しないようにすると良いと思います。

# 4. MIDIファイルをデータセットに変換する

`/magenta-data/script`配下で`./build_dataset.sh`を実行すると、MIDIファイルを適切なデータセットに変換してくれます。

```
root@f9b2fdc0d32a:/magenta-data/script# ./build_dataset.sh 
```

なお、下記のようなWARNINGがでますが、気にしなくて大丈夫かと思います。


```
Start generating dataset...
INFO: Reading 'startup' options from /root/.bazelrc: --batch
WARNING: Sandboxed execution is not supported on your system and thus hermeticity of actions cannot be guaranteed. See http://bazel.io/docs/bazel-user-manual.html#sandboxing for more information. You can turn off this warning via --ignore_unsupported_sandboxing.
WARNING: /root/.cache/bazel/_bazel_root/cb5f479c6a7afa91f510d7ce625f6aa5/external/protobuf/WORKSPACE:1: Workspace name in /root/.cache/bazel/_bazel_root/cb5f479c6a7afa91f510d7ce625f6aa5/external/protobuf/WORKSPACE (@__main__) does not match the name given in the repository's definition (@protobuf); this will cause a build error in future versions.
…
```

# 5. モデル学習のスクリプトを実行する

下記のスクリプトを実行します。

```
root@f9b2fdc0d32a:/magenta-data/script# ./train_rnn.sh -r basic_rnn
 ```


すると、
・学習データと評価データの分割
・モデルの学習
が実行されます。

下記のようなメッセージが表示され、学習が始まると成功です。

```
INFO:tensorflow:global_step/sec: 0
INFO:tensorflow:Starting training loop...
INFO:tensorflow:Global Step: 0 - Loss: 3.633 - Perplexity: 37.819 - Accuracy: 9.392
INFO:tensorflow:Global Step: 0 - Loss: 3.632 - Perplexity: 37.793 - Accuracy: 9.672
INFO:tensorflow:Global Step: 0 - Loss: 3.631 - Perplexity: 37.766 - Accuracy: 9.462
INFO:tensorflow:Global Step: 3 - Loss: 1.346 - Perplexity: 3.843 - Accuracy: 81.652
```

Stepは500に設定していただいてるようで、それまでお待ちください。

```
INFO:tensorflow:Training complete.
```

上記のメッセージが出たらEnterを叩いて完了です。

曲数等にもよると思いますが、Macだと1時間程度はかかると思います。
[AWSのGPUインスタンス](https://aws.amazon.com/jp/ec2/instance-types/p2/)などを借りたりすると良いかもしれません。


# 6. 音楽の生成スクリプトを実行する

下記を実行すると、数秒で曲が作成されます。

```
./generate_melodies.sh -r basic_rnn -n 160909-1
```

160909-1の部分は、生成したモデルの保存場所のフォルダ名を指定する必要があります。
学習済みモデルが`/magenta-data/script/tmp/basic_rnn/logdir`にどのようなフォルダ名で保存されたか確認し、適宜変更してください。


# 7. できた音楽を聴く

聞いてみましょう。
1分程度程度の曲が5種類作成されると思います。

ここではそのうち3曲掲載します。

・[Magenta-fish-1](https://clyp.it/55yshauf)
・[Magenta-fish-2](https://clyp.it/ygv2utae)
・[Magenta-fish-3](https://clyp.it/xxulihra)


作成された曲はピアノのみになってしまいますが、どこかサカナクションさんらしい・・・かな？
雰囲気が異なる曲がちゃんとできたのが驚きでした。


# 学習させる曲数について

適当な曲数はわからないのですが、3曲だけいれてやったところ、
(Beatlesフォルダ内の)楽曲のメロディラインが一部そのまま出てくることがあったため、
今回は6曲に増やしてみました。
（もしかしたら何かミスしていたのかも）

# 終わりに

PyData.Okinawaさんの資料のとおり進めるだけで、曲の学習を行うことができました。
今後はピアノ以外の楽器も含めて曲を作りたいと思うので、
PyData.Okinawaさんのコードや、magentaのレポジトリ等を読み進めてみたいと思います。

今更ながら、学習させる曲は北海道出身のサカナクションさんじゃなくて、
沖縄出身のMONGOL800さんにした方が良かったかもと思いました。

ありがとうございました。


# 追記
今回のモデルはBasicRNNというものでしたが、LookBackRNNでも試したので、こちらをご参考ください。

参考：[TensorFlow製音楽生成「Magenta」のLookBackRNNを試す](http://qiita.com/tackey/items/fba66d8e2bf54fd7eecf)