Magenta Session ハンズオンの自習で音楽生成してみた

先週 人工知能時代の音楽制作への招待 - Google Magenta 解説&体験ハンズオン - - connpass というイベントがあり、とても興味があったのですが参加はできなくて残念に思っていたところ、ハンズオンの自習用の記事 が公開されていたのでこちらを参考にして手元でやってみました。
はい、スリランカカリーの画像をDCGANで自動生成してみたのと同じく、単にやってみたというだけです。

手順は先ほどの記事に詳しく書かれているのでそれに従うだけです。わたしは miniconda で環境を作るのを避けて Docker イメージを使ったので環境準備については少しレールだけを外れましたが、特別なことはしてないです。
元となる音源は VGMusic.com - Sony PlayStation Music から FF7MIDI をいくつかとってきて使いました。mini batch size: 128 で 1500 step のトレーニング後*1のモデルを使って生成した MIDIGarageBand で適当に mix したのを Sound Cloud に上げました。

https://soundcloud.com/nagachika/magenta-session-with-ff7-1

うーん、まあ、なんか雰囲気は出てるような気も…。

と、これで終わってしまうと本当にやってみただけなので、すこし気になったところを。magenta_session の scripts/data/convert_to_melody_dataset.py を実行すると NoteSequence をデータ変換しつつ training 用と evaluation 用にデータを分割することもやってくれるのですが、どうやらこの分割は元の MIDI ファイル毎に行なわれているようです。この分割の処理は magenta_session ではなくて magenta 本体の magenta/pipelines/pipelines_common.py で定義されている RandomPartition というクラスが行なっているようで、乱数を元にしているので実行するたびに分割のしかたは変わるようなのですが、どうやら元の MIDI ファイル毎に分割しているっぽいです(コード未確認ですがおそらく transform が元の MIDI ファイル毎に呼ばれている)。データ分割をどのようにするのがいいかというのは結構奥が深い*2ですが、とにかく長い MIDI ファイル1つだけを元データとして処理しようとすると、トレーニングデータが空っぽになってしまうという可能性があります。あえて長い曲はいくつかのファイルに分割して投入するなどの前処理をしたほうがいいかもしれませんね。

今回のハンズオンでは単音のメロディ生成のみでしたが、Magenta のリポジトリをみてみると polyphony_rnn というモデルも存在しているので、複数のパートの旋律や和音の生成もできそうなので、もう少し遊んでみたいと思いました。

*1:手元のマシンで5時間くらいかかりました

*2:楽曲の演奏情報からデータを抽出した場合同じシークエンスが複数回出てくることが考えられますが、さて全く同じシークエンスは常に training か evaluation どちらか同じほうに分けられるべきでしょうか? モデルが何を学習しようとしているのかによって違いそう。また同じデータセットを何度も分割してみた時に同じ分割がされる(再現性のある分割)べきか、というあたりも。Magenta は再現性のない分割を提供しているみたいですね