Path: blob/master/site/ja/tutorials/audio/music_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
RNN を使って音楽を生成する
このチュートリアルでは、単純な RNN(回帰型ニューラルネットワーク)を使用して楽譜を生成する方法を説明します。モデルは、MAESTRO データセットのピアノ MIDI ファイルのコレクションを使ってトレーニングします。ノートのシーケンスを与えられることで、モデルはそのシーケンスの次のノートを予測するように学習します。モデルを繰り返し呼び出すことで、より長いノートのシーケンスを生成できます。
このチュートリアルには、MIDI ファイルを解析して作成するための完全なコードが含まれます。RNN の仕組みについては、RNN によるテキスト生成をご覧ください。
MNIST モデルをビルドする
このチュートリアルでは、MIDI ファイルの作成と解析を行う pretty_midi
ライブラリと、Colab でオーディオ再生を生成する pyfluidsynth
を使用します。
Maestro データセットをダウンロードする
データセットには、約 1,200 個の MIDI ファイルが含まれます。
MIDI ファイルを処理する
まず、pretty_midi
を使用して、単一の MIDI ファイルを解析し、ノートのフォーマットを検査します。以下の MIDI ファイルをコンピュータにダウンロードして再生する場合は、Colab で files.download(sample_file)
を記述してください。
サンプル MIDI ファイルの PrettyMIDI
オブジェクトを生成します。
サンプルファイルを再生します。再生ウィジェットの読み込みには数秒かかることがあります。
MIDI ファイルを検査します。どのような楽器が使用されていますか?
ノートを抽出する
モデルをトレーニングする際に、pitch
、step
、duration
という 3 つの変数を使用してノートを表現します。pitch は、MIDI ノートナンバーとしてのサウンドの知覚的な質です。step
は、前のノートまたは曲の始めから経過した時間です。duration
は、ノートの再生秒数で、ノートの終了時間とノートの開始時間の差です。
サンプル MIDI ファイルからノートを抽出します。
ピッチよりもノート名を解釈する方が簡単な場合があるため、以下の関数を使用して数値のピッチ値からノート名に変換します。ノート名は、ノートの種類、臨時記号、およびオクターブ番号(例: C#4)を示します。
曲を視覚化するために、ノートピッチとトラック全体(ピアノロール)の開始と終了をプロットします。最初の 100 個のノートから始めます。
トラック全体のノートをプロットします。
各ノート変数の分布を確認します。
MIDI ファイルを作成する
以下の関数を使用して、ノートのリストから独自の MIDI を生成できます。
生成した MIDI ファイルを再生し、何らかの違いがないか確認します。
前と同様に、files.download(example_file)
を記述すると、このファイルをダウンロードして再生できます。
トレーニングデータセットを作成する
MIDI ファイルからノートを抽出して、トレーニングデータセットを作成します。まず、少数のファイルを使って作業を開始し、後の方でさらに他のファイルを使用して実験することができます。これには数分かかることがあります。
次に、解析したノートから tf.data.Dataset を作成します。
バッチ化されたノートのシーケンスに対してモデルをトレーニングします。各 Example では、入力特徴量としてノートのシーケンス、ラベルとして次のノートが使用されます。このようにすることで、モデルはシーケンスの次のノートを予測するようにトレーニングされます。このプロセスを説明した図(およびその他の詳細)は、RNN によるテキスト分類をご覧ください。
このフォーマットで特徴量とラベルを作成するには、便利な window 関数とサイズ seq_length
を使用できます。
各 Example のシーケンスの長さを設定します。さまざまな長さ(50、100, 150 など)を試してデータに最適なものを確認するか、ハイパーパラメータのチューニングを行います。語彙のサイズ(vocab_size
)は 128 で、pretty_midi
がサポートするすべてのピッチを表します。
データセットの形状は (100,1)
で、モデルは 100 個のノートを入力として取り、出力として移行のノートの予測を学習します。
Example をバッチ処理し、パフォーマンスを得られるようにデータセットを構成します。
モデルを作成してトレーニングする
このモデルには、ノート変数あたり 1 つの出力、計 3 つの出力があります。step
と duration
については、モデルが負でない値を出力するように、平均二条誤差に基づくカスタム損失関数を使用します。
model.evaluate
関数をテストすると、pitch
の損失が step
と duration
の損失を大きく上回ることがわかります。loss
はその他すべての損失を合計して算出された合計損失であり、現在 pitch
損失に占有されていることに注意してください。
これを平衡化する方法として、loss_weights
引数を使用してコンパイルする方法が挙げられます。
これにより、loss
は個別の損失の重み付き合計になります。
モデルをトレーニングする。
ノートを生成する
モデルを使用してノートを生成するには、まず、ノートの開始シーケンスを指定する必要があります。以下の関数は、ノートのシーケンスから 1 つのノートを生成します。
ノートのピッチについては、モデルが生成するノートのソフトマックス分布からサンプルが取り出され、最も高い確率ののノートが拾われるわけではありません。常に最も高い確率のノートを拾ってしまうと、生成されるノートのシーケンスが繰り返されてしまいます。
生成されるノートのランダム性を制御するには、temperature
パラメータを使用できます。temperature の詳細については、RNN によるテキスト生成をご覧ください。
では、ノートを生成してみましょう。next_notes
の temperature と開始シーケンスを変更しながら、どのような結果になるか確認します。
以下の 2 行を追加して、音声ファイルをダウンロードすることもできます。
生成されたノートを視覚化します。
pitch
、step
、および duration
の分布を確認します。
上記のプロットでは、ノート変数の分布の変化を確認できます。モデルの出力と入力の間にフィードバックループがあるため、モデルは、似たような出力のシーケンスを生成して損失を低下させる傾向にあります。これは特に、MSE 損失を使用する step
と duration
に関連しています。pitch
については、predict_next_note
の temperature
を増加させて、ランダム性を高めることができます。
次のステップ
このチュートリアルでは、RNN を使用して、MIDI ファイルのデータセットからノートのシーケンスを生成する仕組みを説明しました。さらに詳しい内容については、関連性の高い RNN によるテキスト生成チュートリアルをご覧ください。追加のダイアグラムと説明が記載されています。
音楽生成では、RNN のほかに、GAN を使用することも可能です。GAN ベースのアプローチでは、オーディオを生成する代わりに、シーケンス全体を並行して生成することができます。Magenta チームは、GANSynth を使用してこのアプローチで圧巻の取り組みを達成しています。Magenta プロジェクトのウェブサイトには、素晴らしい音楽とアートのプロジェクトとオープンソースコードが多数掲載されています。