dlb2018-team16/DeepAlbum

Survey & Experiment

Closed this issue · 63 comments

  • 最新論文
  • 実装方法
  • どのようなデータセットを収集するか
200 piano-only songs classified as Jazz and Classical(https://medium.com/@suraj.jayakumar/tonenet-a-musical-style-transfer-c0a18903c910)Style transferは変更したいStyleについてラベル付してあげるだけで良いのでラベリングは簡単そう まだ微妙なものしかなく開拓しがいあるかもhttp://yusuke-ujitoko.hatenablog.com/entry/2018/01/27/003705ビートルズをClassicに変換http://createwith.ai/paper/20181012/1326音声合成・声質変換ツール PyWorldVocoder https://qiita.com/yuji1997/items/418cd1b914066bf8fd4cNeural Audio Synthesis(音声合成)https://www.slideshare.net/DeepLearningJP2016/dlefficient-neural-audio-synthesis

主だった情報・論文はこの辺りです。1.(2016年)が初出ですが、その後、そこまで進展していない模様。

  1. Audio texture synthesis and style transfer
  2. Neural Style Transfer for Audio Spectograms
  3. “Style” Transfer for Musical Audio Using Multiple Time-Frequency Representations

Music style transferで評価が高いのは、2018年にFacebook AI Researchが出したこちらのようです。

流し読みですが、この論文では、「Neural Style Transferは使わん」的なことが書いてあり、multi-domain wavenet autoencoderという手法が採用されています。

A Universal Music Translation Networkの実装例を見つけました。
https://github.com/scpark20/universal-music-translation

また、こちらのGoogle Brainのものも面白そうです。手法はVEAです。実装例あり。
https://arxiv.org/abs/1803.05428
https://magenta.tensorflow.org/music-vae

http://createwith.ai/
A Universal Music Translation Network, CycleGANを使った日本語記事、AJ DJの徳井さんの記事が参考になります。
上の音楽生成サーベイはこの方が翻訳されたものです。

https://github.com/andabi/deep-voice-conversion
ちょっと趣が違うけど音声変換

Neural Translation of Musical Style

JazzとClassicのStyle変換、実装も公開されている
Blog : http://imanmalik.com/cs/2017/06/05/neural-style.html
実装 : https://github.com/imalikshake/StyleNet
論文 : https://arxiv.org/abs/1708.03535

Neural Audio Synthesis of Musical Notes with WaveNet Autoencoders

WaveNetを使ったフルートとかオルガンの音の合成。2017なので古めかも。データセットあり。
Blog : https://magenta.tensorflow.org/nsynth
実装 : https://github.com/tensorflow/magenta/tree/master/magenta/models
論文 : https://arxiv.org/abs/1704.01279
データセット : https://magenta.tensorflow.org/datasets/nsynth

進め方

A Universal Music Translation Networkの実装を目標とする

  • A Universal Music Translation Networkの実装をもう少し探して見る
  • ベースとなるNeural Audio Synthesis の実装を一旦個々で進める

Nsynthから脱線してmodels 配下の Melody RNNとMusic VAE, drums rnn が組み込まれてる magenta studioで遊んでみたんですけど、組み合わせるとこちらもこちらで面白いですね
https://magenta.tensorflow.org/studio/standalone

それっぽいメロディーを大量生成して、そのメロディーに対してドラムをつけれる。
以下は学習済みモデルから生成したmidiです。

ganerate_vae.zip

学習データに例えば東方の主旋律とベースライン突っ込めば、なんとなく東方っぽいメロディを無限生成できるかも?

nsynthのcolabで、巨大なデータセットを使った学習済みモデルを使った生成を試してみたんですが、NSynthの中身はwavenet autoencoderで生成にすごい時間かかります。
生成を早くする手法が、去年から出てきていて、nv-wavenet, wavernn, gansynth
この中でgansynthのコードが、magenta modelsにあり、試してみてました。
gansynth colab
こちらのデモは、ランダムまたは指定したmidiを入力に学習した音源で演奏するようなものです。
音源の指定もある程度出来るっぽいですね。割り当ては相対時間みたい

↑の論文はICRL 2019にAcceptされてます。
ICRL 2019の論文Autoencoder-based Music Translationがあります。これって、A Universal Music Translation Networkの題名すり替わったものみたいです。
この実装はいまだに見つからず。

A Universal Music Translation Networkは実装みつからず。また学習にかなりの時間がかかる32 V100 GPU x 数日。
安田さんの書いて頂いたgansynthはNSynthデータセットを1つのV100GPUで4-5日で学習でき、かなり高速に学習できそう。
gansynthはrandamもしくはMIDIを入力として、Instrument(楽器/スタイル)を指定して音を生成できる。
これを自前データセットで学習してスタイル変換するのがよさそう

@yurfuwa さんのmagenta studioを組み合わせて使うと面白そう。
もしgansynthのスタイル変換にvocalで歌手のスタイルをいれられたら、
magenta studioで特定の歌手っぽい曲を作る→スタイル変換にかけてVOCAL入れる
例:AIがB'zっぽく作った曲にB'zっぽい声で歌わせる、なんてことができるかも?(妄想)

どちらにせよ現状では自前データでの学習がオリジナリティを出すために必要そうなので、見えているNEXTアクションとしては

  • Nsynthデータセットフォーマットの調査
  • 独自データセット(サンプル)の作成?
  • gansynthでのトレーニング(少ないデータとかで)を動かしてみる
  • 引き続き音声変換形の技術を探る
    のような感じかと思います。
    現状上がってきてる技術を使って、どういうデータセット使ってどういう風に見せるかとかはまた集まって考えたいですね。

早速試してみました。ピアノ音源のmidiを変換
generated_wav.zip

ピアノ音源なのに複数音源の原曲っぽくなった

五月雨になってしまいましたが、例えば大量の単音源のmidiから、その曲っぽさを magenta studioでつくり、Gansynthで複数音源に拡張してオーケストラmidiつくる、とかできるんじゃないかなと

Piqcyでも紹介されてる
https://twitter.com/icoxfog417/status/1101306704820461569?s=21

そもそもの信号処理とDTMの知識midiとかが不足していて論文や実装がよく理解出来ない…だれかおすすめの書籍がwebサイトあれば教えてー

NSynth Datasetのフォーマットを調査したノートをコミットしました。
8640fbf

結果としては、1つ1つのデータが4秒の中でMIDIの1音階(pitch)に制限して作ることがわかり、市販の音源を1音階のみ取り出して構成するのは容易ではないことが想定されます。オリジナルまたは別のデータセットを用意する場合は大きな課題になりそうです。

shown in the paper, trained on only acoustic instruments pitch 24-84 (Mel-IF, Progressive, High Frequency Resolution).

とGANSynthのペーパーに書いてあり、別のElectronicまたはSyntheticで再現させるのは出来るはず。
ただ、訓練で使う70GBのデータセットの置き場がGoogle Driveも制限オーバー(15GB)だったような気がする。月額250円で100GBまで拡張可能。
データセットを再構築する際に小さくしておくとここまで必要ない。
どこまで学習させるかで、colabで継続実行するためのcheckpoint実装でGoogle Driveに保存する機能の追加が必要そう。
まずは最小サイズで学習がうまく行くか試すことになるとは思います。

何ら貢献できずすみません。深夜や早朝に、この中に登場した論文を読んで追いかけていたのですが、@yasudakn さんのご解説で少しイメージがつきました。ご指摘の新たなデータセット作成について、骨が折れる作業になりそうですね。

ちょっとでも良いんで調べてわかった事は共有してもらえると進んでる感でて助かります。

信号処理とDTMは、次の資料が必要な情報がまとまっていて参考になりました。
音楽情報処理の演習講義資料 http://winnie.kuis.kyoto-u.ac.jp/~itoyama/le4-music/le4-music-2017.pdf

上の演習資料のスペクトル分析は簡素過ぎてよく分からないんで、別で補う必要あると思います。ここら辺とかで
http://climbsd.lowtem.hokudai.ac.jp/group/shigeru/tc/dataan2012/num5.pdf

midiは、最低限の音階メタデータのようなもので、マークアップに近いものですよね。wavやaviなどの信号処理とは根本的に原理が異なりますし、最低限FFTなどの習熟が必要などより高度な印象をうけます。
midiはデータとして分解するデータ量が圧倒的に低いので、作曲生成はmidiのほうが簡潔な気がします。世に公開されてるmidiは複数の音源がはいっているので、例えば下みたいなlibつかって、単音源に出力するなど前処理が必要だと思います。
https://github.com/vishnubob/python-midi

ちなみに
#1 (comment)
これは単音源にしてねと言われている学習モデルに無理やり複数音源ぶちこんだりしたりもできたので、パラメータや学習データ次第ではイケるかも?そういう技術チャレンジしてみるのもありかもですね

@yurfuwa さんの2つ上のコメントと同語反復で、本件関連性が薄いかもしれませんが、MIDIで思い出しましたので記載しておきます。20年ほど前に高校でバンドを組んでいたときに、打ち込み用のデータファイルを作成していました。メーカーの独自規格もあったりするのですが、当時のベーシックな規格だと、16のチャンネル(楽器)を割り当てることができて、指定できる楽器は128種類で、音量は128段階、そして4分音符=480の長さに分解して、数字を打ち込んでいった記憶があります。

FreeのMidi音源いくつか見つけました。Magentaで学習させてみます。

Dataset
https://colinraffel.com/projects/lmd/

Jazz
https://freemidi.org/genre-jazz

ロック
http://rock.freemidis.net/index.php

ゲーム系
https://www.vgmusic.com/music/console/nintendo/snes/

作曲生成はmidiで #1 のどれかのモデルで良いと思います!
midiを使ったミュージック・シーケンサーとしては、NSynthやGANSynthでいろんな音源データセットを学習したシーケンサー(モデル)になるとは思ってます。End-to-Endまではいかなくても。オリジナル音源で学習したシーケンサーでも、既存の学習済みシーケンサーであろうとも。

@yushinna ここの記事が参考になるかと。記事まで探して学習には至っていませんでした。mp3/wav to midiは適当に探すとあったります。
https://qiita.com/tackey/items/1295a0347a8b4cc30d46

複雑な楽器や声が混ざった音源で、librosaとかの音源分離を使って、主要なドラムなどの和音は抜けるかもしれません。どこまで分離出来るか試してみないとわかりませんけれども
http://www.hiromasa.info/posts/5/

大学から与えられてる僕のアカウントでログインしたらGoogle Driveが容量無制限に使えるみたいなので、大きめのデータセットでも大丈夫そうです

Magentaの学習済みモデルで曲生成してみました。
2019-03-08_143444_1.mid.zip

また、家にあったスピッツのアルバムをmp3を、以下のツールで、midiに変換してみました。
https://www.bearaudiotool.com/mp3-to-midi

が、結構ひどいです。一回これで学習試してみますが、音源分離しないと、○○風っぽく学習させるのは難しそうです。
チェリー.mid.zip

@ta9ryuWalrus それはありがたい! 8640fbf をgoogle driveに読み書きするように変更してみます。その後に新たなデータセット作ってもらって、GANSynth動かしてみましょう。

@ta9ryuWalrus 新たなデータセット作らずに、GANSynth動かしてみましょう。そのときに https://github.com/tensorflow/magenta/blob/master/magenta/models/gansynth/lib/datasets.py#L114 を1から2 or 3に変えるとacoustic から別のelectroかsynthetic に変えて学習するはず

instrumentsを換えて学習するコード例はこちらです。
https://gist.github.com/yasudakn/3a745f2a6abac7e70aaec28b15b1006c

magentaに、ビートルズのアルバム1つ分の曲を学習させて、生成してみました。
generated.zip
曲はこちらでゲット。
http://bmh.webzdarma.cz/midieng.htm

うーん、言われてみるとビートルズっぽいかなあ・・もう少し学習データ増やさないとダメかもです。
または、もっと特徴的なスタイルのバンドを選ぶかですかね。

やってみたいこと:口笛をiphoneで録音して、それをアプリに投げたら、曲生成してくれる

Wavからmidiに変換するのは難しいという話。ツールもあるみたいですが、Windows。。
http://www.pluto.dti.ne.jp/~araki/soft/st.html
Midiは無料ではポピュラーな曲があまりダウンロードできないので、データ収集が課題です。

ボーカルのようなピッチが変化する音色は苦手です。またドラムが入っていると最悪です。

http://www.interaction-ipsj.org/proceedings/2016/data/pdf/16INT012.pdf
Robust PCAを使うとボーカルはだいたい分離出来るっぽく、python実装ありました
https://github.com/hiromu/rpca_svs

調波成分と打音成分の分解はlibrosa.hpss使うと行けるかもしれません
#1 (comment)

このあと、メロディの音源(ボーカルとか)をmidiにすると、綺麗に学習出来るかも

とりあえず、前処理めんどい。。

今、学習するなら電気グルーヴの曲が良さそう😆

#1 (comment)
@yushinna san
が生成した曲をgansynthの学習済みモデルから一曲スタイル変換してみました。

2019-03-13_125709_02_gansynth.zip

各パート(ドラムとかベースとか)を曲生成してもらって、それをスタイル変換かけて
最終的にガッチャンコしたらそれなりにきこえるかも??

ピエール滝・・・
スタイル変換、わりといい感じで聴けますね!

gansynthの学習でelectroのみは楽器に偏りが多く(分散が小さく)GANの学習がうまく進んでいないのかもしれません。
syntheticも追加してみようかな、または偏りを減らずようにデータセットをry とりあえず前者で再度トライしてみます。

飲み込みに少し時間がかかっていて遅れをとってるのですが、モデルの学習ってどんな感じでされてますか、、
NSynthのデータは使わずに何らかの楽曲を使って学習させている感じなんですかね、

midi作成モデルの方ではスピッツなどの曲で学習させてるはずで、
midiからなんらかの楽器で演奏する方のモデルはnsynthで学習させてますよ。
論文ではacoustic に分類される楽器でピッチを制限して学習させています。学習済みモデルはこれです。
わたしが学習させてるのは、nsynthのacoustic ではなくelectronic とsynthetic です。
Nsynth datasetの詳細
https://magenta.tensorflow.org/datasets/nsynth

ありがとうございます。
midi作成の方が頭から抜けていました

NSynthのデータセットに、何らかの範囲を絞った(サイケデリック、ブルース、みたいな)ジャンルの楽曲のデータを新しい楽器としてつけ加えてまとめてgansynthを学習させてみたら、そういう曲調の音を合成できるのかなぁなんて思ったりもしたんですが、nsynthと同じ形式に変換するのめんどくさそうですね。。

それぞれのモデルで何ができるか理解するのに時間がかかっていたのですが、色々触ってみて、現状の私なりの見解や感想をまとめてみます。
認識違いや気になる点等あったらコメント願いたいです。

gansynth

  • Nsynthデータセットにある複数の楽器の単音の音色を用いて学習を行い、楽器(音色)の特徴ベクトル空間を表現したモデル
  • この世に存在しない楽器の音色やpianoとguitarの中間の音色みたいな音を生成できる
  • モデル単体はMIDIの単音(音の高さや長さ等)と(音色の)特徴ベクトルを入力として実際の音を出力するもの
  • colabのサンプルでは曲単位(MIDI)を入力として複数の音色に徐々に変化させた音(wav)を生成しているが、これは時間経過(正確にはMIDIの単音)ごとに特徴ベクトルを次の楽器になめらかに(球面線形補間[*参考])推移させる(codeはここ)ことで自然に複数の音色が変化していくようにしている
  • つまるところ究極的には学習データをベースとした様々な音色が出せる楽器という感じ
  • 音色の推移がなめらかで自然なところが特徴
  • 独自で音色追加するなら音程(pitch)がきちんと指定できて、かつ機械的にいくつも作れるVOCALOIDでコーラス音源つくるとか面白いんじゃないかと思った。一応無料のボカロもあるみたい。ただ、知識皆無なので泥沼にはまりそうで手をつけていない。誰か詳しい人いませんか、、、

MusicVAE

  • メロディシーケンス(16小節とか)の潜在空間を学習したVAE
  • Sampling(ランダム生成)とInterpolate(2つのメロディの合成)ができる。アウトプットはMIDIファイル
  • @yushinna さんがビートルズのアルバムで学習しているように、特徴のある曲を大量に学習させて潜在空間を作成すればそれっぽいのはできそう
  • シーケンス単位が曲全体ではなく、2小節または16小節なので、サビとそれ以外とかで分けないと特徴が分散する気がする。むしろ特徴の強そうなサビ部分だけ抽出して学習すると良い結果がでるかも?音楽知識がなくて理解がとても辛い、、、
  • Interpolate(合成)はmagenta studio使って適当にLet It beとAll you need is loveを合成しようとしたがうまくいかなかった、おそらく小節分割しないとだめっぽい?

シーケンス単位が曲全体ではなく、2小節または16小節なので、

すいません、ここ正直あやしいです。シーケンス単位が1小節16分音符かも?

colabの使い方がやっと分かってきてようやくgansynth_train.pyを動かそうとしてみたところだったんですが、下のようなjsonのdecodeのエラーが出ました。datasetとmagentaのコードをdriveにそのままコピーして動かそうとしてみたのですが、何か手順を飛ばしてしまったりしていそうですかね、、(同じようなエラーが出た方はいらっしゃいませんか)
Traceback (most recent call last): File "magenta/models/gansynth/gansynth_train.py", line 140, in <module> console_entry_point() File "magenta/models/gansynth/gansynth_train.py", line 136, in console_entry_point tf.app.run(main) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/platform/app.py", line 125, in run _sys.exit(main(argv)) File "magenta/models/gansynth/gansynth_train.py", line 114, in main flags.load_json(FLAGS.hparams) File "/content/magenta/magenta/models/gansynth/lib/flags.py", line 49, in load_json other = json.loads(json_string) File "/usr/lib/python3.6/json/__init__.py", line 354, in loads return _default_decoder.decode(s) File "/usr/lib/python3.6/json/decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.6/json/decoder.py", line 355, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 20 (char 19)

@ta9ryuWalrus --hparamsのJSON文字列のパースエラーのような気がします。以下は例です。

--hparams='{"train_data_path":"/content/drive/My Drive/nsynth-train.tfrecord", "train_root_dir":"/content/drive/My Drive/gansynth/train", "instruments":"2"}'

@hadusam

colabのサンプルでは曲単位(MIDI)を入力として複数の音色に徐々に変化させた音(wav)を生成しているが、これは時間経過(正確にはMIDIの単音)ごとに特徴ベクトルを次の楽器になめらかに(球面線形補間[*参考])推移させる(codeはここ)ことで自然に複数の音色が変化していくようにしている

Nsynth super
UIデザイン付けるとこんなものになるらしく、オープンソースで全て公開されてますね。
https://github.com/googlecreativelab/open-nsynth-super/
GANSynth demoについてるのよりはましに、上のよりはチープなUI付けると見た目良いかもしれません。

gansynthの学習させるコード置いておきました。
https://github.com/dlb2018-team16/NeuralStyleTransfer/blob/master/gansynth_train.ipynb

以下のウェブサイトで比較的高品質のMIDIをダウンロードできました。
https://musescore.com/dashboard

取り急ぎ、以下の作業を実施しました。
①米津玄師の曲のピアノメロディのMIDIを全部(7曲)ダウンロード
②米津玄師のデータセット作成(.tfrecord形式、参照:https://github.com/tensorflow/magenta/tree/master/magenta/scripts)
②MagentaのMelody_RNNで曲生成(それっぽさは出てるかな・・)
generated_yonezu.zip
③MusicVAEで米津玄師データセットを学習させてみたけど、推論時の入力のmidiを16小節にする必要があり撃沈←今ここ

@hadusam MusicVAEは、シーケンスは、2小節または、4小節、16小節単位みたいです。Configで単位がいくつか定義されています。(https://github.com/tensorflow/magenta/blob/master/magenta/models/music_vae/configs.py)
通しで一曲ではなく、サビのみの方がいいかもしれません。抽出するよい方法ありますかね。

@yasudakn gansynthで学習できる形式は、nsynthと同じ形式のみですよね。MelodyRNNや、MusicVaeと同じ形式、または、これらをnsynth形式に変換して学習できるなら良いのですが・・

MusicVAEですが、
https://colab.research.google.com/notebooks/magenta/music_vae/music_vae.ipynb
のcolabで、東方の曲ぶち込んで試したのですが、ひとつのmidiから2小節,4節づつに分解する処理ははしらせてますね。colabのnootebookだと一曲まるまるでも勝手に分解して特徴的な小節に分けて選択してできるようにしてくれています。

下が実際のnootebookのコードなんですが、magentaにmidi_to_sequence_protoちゅー便利関数がいるようです。

#@title Extract melodies from MIDI files. This will extract all unique 2-bar melodies using a sliding window with a stride of 1 bar.
mel_input_seqs = [mm.midi_to_sequence_proto(m) for m in input_mel_midi_data]
extracted_mels = []
for ns in mel_input_seqs:
  extracted_mels.extend(
      mel_2bar_config.data_converter.to_notesequences(
          mel_2bar_config.data_converter.to_tensors(ns)[1]))
for i, ns in enumerate(extracted_mels):
  print "Melody", i
  play(ns)

また、16BARもためしてみましたが2BARより精度かなり落ちますね。皆さんお察しのようにが苦渋済みモデルだとあまりかっちょよい補完にはならなかったです。曲と曲の相性はあまり加味してくれないので、そこは人間がDJ的に選ぶ必要がありますね。あくまで間を補完してくれるだけなので。

どちらかというと、クロスフェードの代替として、サビよりも最後のメロディと頭のメロディを学習して、フェードを補完生成させるのが現実的なユースケースと思いました。

あと、midiをいれてMusicVAEがうまく生成してくれない場合は、midiトラックが一つだけか確認したほうが良いですね。自分はコードでの前処理ではないですが SMF track separatorを使って、midiに含まれているトラックをばらして主旋律だけぶちこみました。

MusicVAEいくつか生成してためしたりパラメータいじったり
https://experiments.withgoogle.com/ai/melody-mixer/view/
上のやつぼけっと眺めたりポチポチして思ったんですが

step

左端Aのmidi、右端Bのmidiで、中間は生成時指定のstep、temperatureはおそらく0.5なんですが、潜在でよしなに生成というより中間表現を徐々にフェードして加えていくような形なので、メロとサビのギャップとかはstepさげたり、入力するmidiのメロディのフレーズの対応関係まで学習されるわけではないので入力側のデータと前処理に依存しまくるんじゃないかと予想

@yurfuwa ありがとうございます!以下記事を参考に米津玄師Midiのトラック数みてみたら2トラックでした。これがMusicVAEの入力がエラーになった理由みたいです。入力を1トラックにしたら、自分で米津玄師データセットで学習したVEAモデルで、2楽曲のInterporateを生成できました。(学習はローカルのGPUでやっています。)サビのみ抽出しなくても、サビに分割してくれました。
https://qiita.com/tackey/items/860f408e43397f55b160
ただ、生成したInterporateは、うーん・・なんじゃこりゃという感じです。。

曲のスタイル変換という観点からは、@ta9ryuWalrusさんが言っている方法が一番筋がよさそうです。
どうやったらmidiをnsynth形式に変換できるのだろうか・・

NSynthのデータセットに、何らかの範囲を絞った(サイケデリック、ブルース、みたいな)ジャンルの楽曲のデータを新しい楽器としてつけ加えてまとめてgansynthを学習させてみたら、そういう曲調の音を合成できるのかなぁなんて思ったりもしたんですが、nsynthと同じ形式に変換するのめんどくさそうですね。。

@yurfuwa @yushinna 長期構造は苦手のようで、
https://magenta.tensorflow.org/music-vae の下の方の Long-Term Structureで、個々の潜在コードから長期構造(16小節)の生成に成功したと書いてあります。
その方法は、階層型再帰VAE (hierarchical recurrent Variational Autoencoder )で、configにhie*と指定した時のモデルでtrain&generateしないといけないみたいです。そうなってます?

DL輪読会 はポスターまたは口頭発表でのスライドの参考までに

melody mixerみてると、mnistのVAEで簡易な潜在空間上で数字が変化していくの思い出します。

https://magenta.tensorflow.org/music-transformer
最近の記事では発展した話しが書いてありますが、ソースコードの公開はまだみたい