アイドルソングを自動生成してみた❸メロディ生成
〈AI×JapaneseIDOL = AiDolipper〉
メロディデータ(MIDI)を自動生成してみよう
最後にメロディの自動生成をやっていきます。音楽やアート系の機械学習で有名なmagentaというプロジェクト。こちらを使ってmidiデータの学習、生成を行っていきます。
まずはYAMAHAさんからmidiデータを購入します。220円/1曲。(...割と高め)
欅坂46...3曲 乃木坂46...3曲 を購入しました。
import pretty_midi
import os
def song2vocal(filepath):
midi_data = pretty_midi.PrettyMIDI(filepath)
# 選択楽器番号を選択して保存
midi_track = midi_data.instruments
vocal = []
for midi_inst in midi_track:
if midi_inst.program == 71:
vocal.append(midi_inst)
# 新規作成用のPrettyMIDIオブジェクトを作る
new_midi = pretty_midi.PrettyMIDI()
new_midi.instruments.append(vocal[0]) #PrettyMIDIオブジェクトに追加
return new_midi
filepath = "/content/drive/My Drive/AIDOL/midi/nogizaka/singout.mid"
new_midi = song2vocal(filepath)
# 保存する
new_midi.write('/content/drive/My Drive/AIDOL/midi/nogizaka/vocal_nogi03.mid')
購入したmidiデータはパートごとに分かれているので、その中からボーカルのメロディだけを取り出して保存します。
$ docker pull tensorflow/magenta
$ docker run -it -p 6006:6006 -v /tmp/magenta:/magenta-data tensorflow/magenta
#midiデータをnote_sequencesに変換
convert_dir_to_note_sequences \
--input_dir=/magenta-data/midi/original \
--output_file=/magenta-data/tmp/melody_rnn/notesequences/notesequences.tfrecord \
--recursive
#note_sequencesでデータセットを作成
melody_rnn_create_dataset \
--config=basic_rnn \
--input=/magenta-data/tmp/melody_rnn/notesequences/notesequences.tfrecord \
--output_dir=/magenta-data/tmp/melody_rnn/sequens_example \
--eval_ratio=0.20
#学習
melody_rnn_train \
--config=basic_rnn \
--run_dir=/magenta-data/tmp/melody_rnn/logdir/run1 \
--sequence_example_file=/magenta-data/tmp/melody_rnn/sequens_example/training_melodies.tfrecord \
--num_training_steps=2000
#生成
melody_rnn_generate \
--config=basic_rnn \
--run_dir=/magenta-data/tmp/melody_rnn/logdir/run1 \
--output_dir=/magenta-data/midi/generated \
--num_outputs=5 \ #5曲生成
--num_steps=256 \ #旋律の長さ:16小節分(16音=1小節)
--primer_melody="[60]" #ドの音スタート
dockerからmagentaを動かしていきます。学習(500step)には30~40分かかりました。生成は数秒で終わります。
乃木坂46を学習させたモデル、欅坂46を学習させたモデルでそれぞれ10曲ずつ生成してます。その中から1曲ずつピックアップしました。
それではお聴きください...
乃木坂46モデル
欅坂46モデル
おぉー!なんとなく違い感じるかもです!
これら2つのグループはコンセプトが違って、
- 乃木坂46:私立の女子高的な清楚さ
- 欅坂46:10代の反抗や葛藤
とするとイメージされるテイストは
- 乃木坂46:甘ずっぱく切ない感じ
- 欅坂46:ミステリアスで格好いい感じ
そう言われればたしかに、それぞれの雰囲気があるように感じます。
ただし、どちらの曲も捉えどころがなく落ち着かない感じはあります。
曲の展開がないというか、切れ目がないというか。
心地よく感じない理由を音楽に詳しい方に聴いてみたいです。
とはいえ、まずは学習データの少なさを何とかしないとですが...
これから
midiデータは学習用データとして扱うには都合が良さそうなのですが、たくさん購入するには費用がかかるし、そもそもmidiデータ化されている曲自体が少ないためサンプルが集めにくいという問題があります。
(BiSHの曲を買いたかったが2曲しかなかった...)
そこでデータを集めて変換することを考えたのですが、ここがなかなか難しく現在も苦戦しています。(T ^ T)
イメージしている手順
1. オーディオデータ(wav, mp3など)を収集
2. オーディオデータ(wav)からボーカル(wav)を抽出
3. 抽出したボーカル(wav)をmidiデータに変換する
1 のオーディオデータの収集は、Youtubeから動画(mp4)→音楽(wav)で問題なく取得できました。
しかし、2と3 がかなり厄介です。
まず2ですが、抽出はSpleeterを使いました。これがかなり優秀でボーカル部分を見事に抽出してくれます。
しかしこれを3のmidiに変換に進みますと、、
細い部分も正確にmidiでは数値化されてしまうためか、余計な細かい音のテロレロが止まりません。。
<今後の改善方法>
- ボーカル(wav)を単純化(輪郭をはっきりさせる?)してからmidi変換する
- ボーカル(midi)から余計な短い音を削除する
あともう少しだけ挑戦してみるつもりです!
もし進展があれば追加で記事を書く予定です。
以上になります!ありがとうございました。
感想
まだまだ曲ができるまでには道のりは長そうですが、何かしら作曲のヒントになればいいなと思います。ひとまず音楽に詳しい人に一度聴いてもらって感想をもらおうと思います。
また今回noteに記事をまとめるのは初めてでしたが、まとめることでうまく説明できない部分が明確になり、自分が十分理解していない部分が整理できたのがとてもいい経験でした。
今後は"伝えることを意識して学ぶこと"と、"定期的に内容を記事にまとめて理解度を確認すること"を習慣にしていきたいです。
参考
この記事が気に入ったらサポートをしてみませんか?