inglow Blog

Tech Blog
エンジニアブログ

pythonに作曲してもらう 第2弾

2020.07.28

このエントリーをはてなブックマークに追加

こんにちは。inglowの開発担当です。
今回は、近年超キテる「python」を使った作曲の第2弾です。
今回は、「Keras」を利用してメロディを学習させてみました。
第1弾の記事はこちらです。
▼pythonに作曲してもらう
https://inglow.jp/techblog/python-scoremake/

開発環境は下記です。

  • バージョン:python3.8.3
  • ライブラリ:music21、keras
  • エディタ:notepad++、MuseScore3(musicXMLの表示用)

今回作るもの

前回は、「マルコフ連鎖」というアルゴリズムを使用して作曲をしてみましたが、今回は「LSTM」を使って作曲をしてみます。
学習の方法としては、前回と同じように、読み込んだmusicXMLの楽譜データをテキストにし、音符一つを1単語として学習をさせます。

学習させるプログラムの準備

musicXMLからテキストに変換する処理は前回から持ってきて、学習させる部分を変更します。
ソースコードは、kerasのサンプルコードを少し変更して利用しました。
Keras 文章生成 サンプルコード

学習させる

実装したプログラムを動かしてみます。
パラメーターや学習データ量、PCのスペックにによっては、丸1日かかったりすることもあるみたいです。
今回使用した学習データは、サビ部分のみの楽譜データを15個なので、だいたい10分~30分ほどで終わります。

もともとのソースをそのまま実行すると、動画のように、epochごとに学習した内容から文字列を生成しています。最初は同じ音符ばかりが出力されているみたいですが、だんだんいろんな音符が出てきます。

ひとまず、サンプルコードの状態で生成をしてみました。感がいい人にはわかるぐらい曲の原型がまだ残っています…。
また、同じメロディの繰り返しにもなってしまっています。

パラメーターを変更して試す

パラメーターをいろいろいじってみようと思いますが…。人工知能の開発についてはまだまだ勉強中なため、最初はどこをさわったらいいのか…と思っていました。
今回は、下記のパラメーターを変更してどのように変化があるか実験してみます。

  • model.add()で追加している、「LSTM()」レイヤーの第一引数
  • model.fit()で指定している「epochs」の数値

LSTM = 128 epochs = 120

epochsを2倍にしてみました。まだ原型は残っていますが、残り方が少しマイルドになってきました。

LSTM = 500 epochs = 120

LSTMの値をめっちゃ高く設定しました。
ちょっとぽくなって来ています。原型もあんまりわからなくなってきました。

LSTM = 500 epochs = 300/h3>

epochsをさらに大きくしてみました。
ここまでくると大分オリジナリティのあるメロディが生成されてきました。

さいごに

せっかくなので、一番気に入ったメロディに伴奏をつけてみました。

マルコフ連鎖とはまたちがった感じでメロディが生成されましたが、ド→シの動きが好きなのは学習したデータの影響なのでしょうか…。たびたび出現します。
私が最初に音楽の自動生成を体験したのは、2019年3月に公開されていた「Google Doodle」のロゴでした。
すげーーーー!!と感動したのですが、簡易的とはいえ、まさか自分でも作曲させるAIが作れる時がくるとは…と思っています。
音楽は理論がちゃんとあり、数学的な側面もあるにもかかわらず、感情に訴えかけることができるのが魅力だと思います。
今後さらに音楽×プログラミングの研究の分野に注目していきたいと思います。

Related Blog
関連記事

2020.08.06
[Django]初心者のためのDatabase
2020.08.05
Djangoのテンプレート機能を使ってページを作成する
2020.08.03
DjangoとjQueryで全選択と削除
2020.07.31
PythonでPDF編集をしてみよう
2020.07.30
機械学習で知るべきアルゴリズム