人工知能に津軽三味線の自動作曲をさせてみた
Googleが、人工知能(ディープラーニング)を音楽・芸術分野に活用するMagentaというプロジェクトを進めています。
ソースコードが公開されていて、誰でも自由にツールをダウンロードすることができるので、今回はこのMagentaと和楽一筋を組み合わせて、人工知能に津軽三味線の曲弾きを作曲してもらい、三味線用に譜面化するところまでをやってみようと思います。
この記事の最後で、実際に作曲したものを公開します。結果だけ知りたい!という人は途中を読み飛ばしてください。
目次
Magentaとは?
Magentaは、Googleのディープラーニングプロジェクト「Google Brain」のチームが2016年に立ち上げたプロジェクトです。
機械学習ソフト「TensorFlow」を使用して、優れた芸術作品や音楽を生み出すことを目指しています。
こちらの記事に概要や目的が紹介されていますが、
- 機械学習を音楽や芸術創造の領域に発展させる研究
- アーティスト、コード開発者、機械学習研究者によるコミュニティの構築をテストする
という目的があるそうです。
参考サイト
今回この実験をする上で、以下のサイトを参考にしました。
環境構築
それでは、まずMagentaを動かすための環境を構築します。
OSは、Ubuntu 14.04を使用します。
自分は元々VMware ESXi 5.5 で自宅サーバを運用しているので、そこに仮想マシンを新規作成してUbuntuをインストールしました。
ここは各自の環境に合わせて適宜変更してもらえればと思います。Ubuntuが動けば大丈夫です。
ちなみに使用しているサーバのスペックは、
- CPU:Intel core i7-4790 3.60GHz
- メモリ:24GB
- GPU:なし(オンボード)
となっています。実験用マシンには、CPU4コア、メモリ4GBを割り当てました。
(1)OSのインストール
ここではUbuntuの詳細なインストール手順は割愛しますが、インストール途中で表示される
- 「Ubuntuのインストール中にアップデートをダウンロードする」
- 「サードパーティーソフトウェアをインストールする」
にはチェックを入れました。
Magentaのインストール時にパッケージが足りないとか言われたら嫌ですからね。
インストールが終わり、デスクトップ画面が表示されたら準備完了です。
念のため、インストール済のパッケージは最新化しておきましょう。
$ sudo apt-get update $ sudo apt-get upgrade
(2)関連ツールのインストール
後続の作業の中で必要となるパッケージをインストールしておきます。
- gitとcurlをインストール
$ sudo apt-get install git curl
- Python関連のパッケージをインストール
$ sudo apt-get install python-pip python-dev
(3)Magentaのダウンロード
基本的には公式の手順に従い進めましたが、途中でエラーが出た箇所は都度変更しています。
- とりあえずホームディレクトリに作業用ディレクトリを作成
$ cd ~ $ mkdir python $ cd python
- MagentaのGitリポジトリをクローン
$ git clone https://github.com/tensorflow/magenta.git
- Bazelのインストール
$ sudo su - # add-apt-repository ppa:webupd8team/java # apt-get update # apt-get install oracle-java8-installer # echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list # curl https://bazel.build/bazel-release.pub.gpg | apt-key add - # apt-get update # apt-get install bazel
- TensorFlowのインストール
# pip install --upgrade pip # pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.2.1-cp27-none-linux_x86_64.whl
- 公式の手順のままだと次項のコマンドでエラーが出まくるので、設定ファイルの編集&足りないパッケージをインストール
# apt-get install libfreetype6-dev # vi /etc/python2.7/sitecustomize.py # apt-get install libblas-dev liblapack-dev libatlas-base-dev gfortran
参考サイト:
Ubuntu running pip install gives error ‘The following required packages can not be built: * freetype’
sitecustomize.py の設置位置がわからなくてハマった件
Installing SciPy and NumPy using pip
Installing ipython 5.0 (lower then 6.0) compatible with python 2.6/2.7 - Magentaで必要となる関連パッケージをインストール
# pip install matplotlib scipy bokeh IPython==5.0 pandas
- 動作確認
# exit $ cd ~/python/magenta $ bazel test //magenta/...
自分の環境では1件だけFAILEDが出ましたが、とりあえず動いているようなので環境構築は完了として、次に進みます。
学習データの準備
次は、メロディを人工知能に学習させるためのネタを準備します。
津軽三味線を作曲してもらいたいので、津軽民謡のmidiファイルをできるだけたくさん用意しましょう。
midiファイルは、学習させたいメロディを含んでいるトラック一つのみとなるようにします。
自分は、まず手元にあった以下の和楽一筋用楽譜ファイルをmidiファイルに保存しました。
津軽じょんから節新節
津軽じょんから節旧節
津軽よされ節
津軽おはら節
津軽三下り
津軽じょんから節一段
津軽じょんから節六段
津軽じょんから節新節 白川軍八郎曲弾き
ネット上で公開されているmidiファイルも探したのですが、あまりないですね。。。
最終的に9個のファイルで学習させることになりました。
- 準備したmidiファイルを、以下のディレクトリに保存
~/python/magenta/magenta/models/melody_rnn/midi_data
- TensorFlowで扱えるNoteSequenceデータに変換
$ cd ~/python/magenta/ $ INPUT_DIRECTORY=~/python/magenta/magenta/models/melody_rnn/midi_data $ SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord $ bazel run //magenta/scripts:convert_dir_to_note_sequences -- \ --input_dir=$INPUT_DIRECTORY \ --output_file=$SEQUENCES_TFRECORD \ --recursive
- NoteSequenceデータからメロディを抽出して、SequenceExamplesを作成
$ bazel run //magenta/models/melody_rnn:melody_rnn_create_dataset -- \ --config=basic_rnn \ --input=/tmp/notesequences.tfrecord \ --output_dir=/tmp/melody_rnn/sequence_examples \ --eval_ratio=0.10
–configでは、学習に用いるアルゴリズムを指定します。
「Basic RNN」「Lookback RNN」「Attention RNN」の3種類があるそうなので、全部試してみようと思います。
コマンドはBasic RNNの例です。
注意:
NoteSequenceデータを作成する際、以下のエラーが出る場合があります。
WARNING:tensorflow:Could not parse MIDI file (midiファイルのパス). It will be skipped. Error was: Midi decoding error <type 'exceptions.IOError'>: data byte must be in range 0..127
いろいろ調べたところ、midiファイルにピッチベンドなどのイベントが含まれている際にエラーとなるようです。
和楽一筋でmidiファイルを作る場合は、三味線の「スリ」などを使用している場合にピッチベンドが出力されるので、これを取り除く必要があります。
midiファイルを出力する際にピッチベンドを使用しないよう、Ver 2.0.1からソフトウェア設定で指定できるようにしました。
実験してみたい方は、注意願います。
学習させる
SequenceExamplesの準備ができたら、いよいよ人工知能に学習させます。
$ bazel run //magenta/models/melody_rnn:melody_rnn_train -- \ --config=basic_rnn \ --run_dir=/tmp/melody_rnn/logdir/run1 \ --sequence_example_file=/tmp/melody_rnn/sequence_examples/training_melodies.tfrecord \ --hparams="batch_size=64,rnn_layer_sizes=[64,64]" \ --num_training_steps=20000
ここでは、20000回繰り返し学習するよう、指定してみました。
こんな感じで学習が進みます。
INFO:tensorflow:Perplexity = 38.1396, Loss = 3.63952, Global Step = 1, Accuracy = 0.0563033 INFO:tensorflow:Perplexity = 27.3188, Loss = 3.11241, Global Step = 11, Accuracy = 0.241335 (1.869 sec) INFO:tensorflow:global_step/sec: 5.34998 INFO:tensorflow:Perplexity = 27.398, Loss = 2.52059, Global Step = 21, Accuracy = 0.296638 (1.796 sec) INFO:tensorflow:global_step/sec: 5.56963 INFO:tensorflow:Perplexity = 27.1158, Loss = 2.29959, Global Step = 31, Accuracy = 0.289972 (1.798 sec) INFO:tensorflow:global_step/sec: 5.56064 INFO:tensorflow:Perplexity = 23.7119, Loss = 2.20526, Global Step = 41, Accuracy = 0.286624 (1.806 sec) INFO:tensorflow:global_step/sec: 5.53837 INFO:tensorflow:Perplexity = 18.976, Loss = 2.13748, Global Step = 51, Accuracy = 0.315726 (1.828 sec) INFO:tensorflow:global_step/sec: 5.46995 INFO:tensorflow:Perplexity = 16.1457, Loss = 2.05575, Global Step = 61, Accuracy = 0.296229 (1.791 sec)
学習が終わるまでには数十分~数時間かかります。
気長に待ちましょう。
作曲させる
学習が完了したら、作曲させてみます。
$ bazel run //magenta/models/melody_rnn:melody_rnn_generate -- \ --config=basic_rnn \ --run_dir=/tmp/melody_rnn/logdir/run1 \ --output_dir=/tmp/melody_rnn/generated \ --num_outputs=5 \ --num_steps=512 \ --hparams="batch_size=64,rnn_layer_sizes=[64,64]" \ --primer_melody="[60]"
–num_outputs: 生成されるmidiファイルの数です。
–num_steps: 曲の長さです。512で1分くらいの長さになりました。
–primer_melody: 最初の1個目の音符の高さは手動で指定する必要があります。津軽三味線の場合は、60(C=一の糸0)、63(D#=一の糸3)、65(F=一の糸4)などを指定すれば良いかと思います。
–output_dirで指定したフォルダに作曲されたmidiファイルが保存されます。
こんな曲が生成されました。
■Basic RNN
■Lookback RNN
■Attention RNN
いやあ、もう衝撃的ですよ。
元の曲の特徴をよく捉えつつ、人工知能ならではの自由な曲を作ってくれて、感激です!
予想以上の出来に驚いています!
Basic RNNは、2種類ほどのフレーズをランダムに取り入れている感じでしょうか。
ある意味一番津軽民謡らしいですが、曲弾きとしては単調ですね。
Lookback RNNは、津軽民謡らしさを表現しつつ、オリジナル性にも溢れています。
なかなかいい感じです。
Attention RNNは、型にとらわれず、今まで聞いたことないフレーズを駆使して自由な曲を作り上げています。
あまり津軽民謡っぽさはないかもですが、これはこれでありです!
曲弾きに向いているのはLookback RNNでしょうか。
個人的にはAttention RNNが一番気に入りました!
楽譜にする
midiファイルが出来たので、次は楽譜に起こします。
今回は、Lookback RNNで作曲したものから一曲選び、譜面にしてみます。
ここからは和楽一筋の出番です。
最初に和楽一筋でmidiファイルを開こうとしたら、音符が正しく認識されませんでした。
理由は不明ですが、バイナリエディタでmidiを見たところ、自分の知っているフォーマットと違うものになっているようです。
Dominoで一度開いて上書き保存したら、和楽一筋でも読み込めるようになりました。
今後、和楽一筋を改善予定です。⇒ 2017年9月11日追記:和楽一筋 Ver 2.0.2で改善しました。
- Magentaで生成されたmidiファイルを和楽一筋で読み込みます。
- こんな感じで、西洋音階トラックになります。
- 西洋音階・和楽器譜変換機能を使って、三味線譜に変換します。
Magentaは調律を考慮してくれないので、調律を「二上り 四本」にした上で、変換後に移調します。
今回はキーを「-9」変更したら、演奏し易そうな譜面になりました。
このタイミングで、明らかに音が外れている音符は移動なり削除なりしておきましょう。
- 機械変換ではどうしても演奏しずらい運指になるので、少し修正します。
押さえる絃を変えて、開放弦にできる箇所は修正したり、できるだけ指の移動が少なくて済むポジションにします。(メロディそのものは変えていません)
最終的に出来上がったのがこちら。
AIが作曲したので、津軽エーアイ節と名付けていますww
最終目標である「譜面化」までできました!
難しそうな曲ですが、練習すれば演奏可能なものが仕上がったと思います。
まとめ
紆余曲折ありましたが、人工知能による津軽三味線自動作曲が実現できました!たぶん世界初!
今回は学習に用いたサンプル曲がわずか9曲だったため、元の曲の特徴がかなり色濃く残った結果になりました。
今後、世の中の三味線奏者が楽譜データをネット上に広く共有してくれるようになれば、さらにサンプル曲が充実し、もっと多様なフレーズの曲を作れるようになるのではないかと思います。
学習データが充実したら、ボタン一つで自動作曲できるWebアプリとか作ってみたいですね。
というわけで皆さん、和楽一筋の更なる利用と楽譜データの公開・シェアを、ぜひよろしくお願いします!
「サンプル曲のデータはソフトに同梱」と説明されていますが、ダウンロードした
ソフトでサンプル曲を再生するには、どのような手順で操作すればよいのでしょうか?
和楽一筋のサンプル曲のことでしょうか?
それであれば、和楽一筋の実行ファイル(wagaku.exe)と同じフォルダに、サンプル曲(.wgkファイル)が入っているので、和楽一筋の「ファイル」メニュー⇒「開く」で開くことができます。
すみません。たにしさんは実験用のパソコンを用いて自動学習させているようですが、windows上のubuntsで自動作曲することは可能でしょうか?
Windows10のWindows Subsystem for Linuxで動くUbuntuのことでしょうか?
試していないので、明確には回答できませんが、もしかしたら動くかもしれません。