ディープニューラルネットワークを用いた音楽生成

2020年10月12日

ディープラーニングは、典型的な活用事例の他にも思いがけない分野で利用されており、様々な側面で我々の生活の質を高めています。レコメンドエンジン自然言語処理、そしてコンピュータビジョンなどのプロセスでは、ディープラーニングが重要な役割を果たしています。ブラックボックス問題や機械学習の難しさなど、ディープラーニングをめぐる議論は現在も続いていますが、医療チャットボット、ECサイトなど多種多様な分野で今後も活用が見込まれています。 

アートとテクノロジーの融合もディープラーニングを活用できる魅力的な分野の一つです。本記事では、このアイデアをさらに探求するため、ディープラーニングを利用した音楽生成について紹介していきます。

 

目次

  • 音楽表記
  • 音楽データセット
  • データ処理
  • 音楽生成のモデル選択
    • Many to Many RNN
    • Time Distributed Dense層(時間分散Dense層)
    • ステートフル
    • ドロップアウト層
    • ソフトマックス層
    • オプティマイザ
  • 音楽生成
  • まとめ

 

音楽表記

ここではABC記譜法を使用します。ABC記譜法とは、AからGまでの文字を利用して音階を表し、シャープやフラット、音符の長さ、キー、装飾音など他の要素を示す値を加えた略記形式の音楽表記法です。

ABC記譜法は、オンラインでの音楽共有を容易にするため、アスキー文字コードで譜面を表現できるように考案されました。使いやすさを考慮して設計されたソフトウェア開発者用の新しいシンプルな言語が加えられています。図1は、ABC記譜法のスナップショットです。

図1

文字の後にコロンが続くパート1の列は、ファイルに複数の曲がある場合のインデックス(X:)、曲名(T:)、拍子記号(M:)、デフォルトの音符の長さ(L:)、曲の種類(R:)、そしてキー(K:)など曲の様々な要素を表しています。キーの指定後は、曲自体を表記したパート2が続きます。

 

音楽データセット

この記事では、ノッティンガム音楽データベースのABC記譜法バージョンで公開されているデータを利用します。このデータセットには1000曲以上のフォークソングが含まれ、その大部分がABC記譜法による表記に変換されています。

 

データ処理

データは現時点で文字ベースのカテゴリ形式で表記されています。データ処理の段階では、データを整数ベースの数値形式に変換して、ニューラルネットワークで処理できるようにする必要があります。

各文字を一意の整数に対応づける処理は、1行のコードで実行できます。「text」変数は入力データです。

char_to_idx = { ch: i for (i, ch) in enumerate(sorted(list(set(text)))) }

モデルをトレーニングする前に、vocabを使用して文字データを全て数値形式に変換する必要があります。

T = np.asarray([char_to_idx[c] for c in text], dtype=np.int32)

 

音楽生成のモデル選択

従来型の機械学習モデルは、前段階の学習状況を記憶することはできません。それに対して、再帰型ニューラルネットワーク(通常、RNNと呼ばれます)は、前段階の学習状況を記憶することができます。

RNNは、前段階から入力を受け取り、その出力を次の段階への入力として渡す繰り返しモジュールを持っています。とはいえ、RNNは直近の情報しか保持できないので、ネットワークが長期的な依存関係を学習するためには、より多くのメモリを必要とします。ここで役立つのがLong Short Term Memory(LSTM)ネットワークです。

LSTMはRNNの特別な種類であり、RNNと同様に鎖状構造を持っていますが、繰り返しモジュールの構造が異なります。

図3

ここでは、以下のような理由から、RNNを利用します。

  1. データの長さを固定する必要がなく、可変長の入力データを処理できます。
  2. シーケンスを記憶させることができます。
  3. 入力シーケンス長と出力シーケンス長の様々な組み合わせを利用できます。

ここでは、プロジェクトに合わせて一般的なRNNを微調整し、「文字レベルRNN」を使用します。文字レベルRNNでは、入力、出力、そして中間層出力が文字形式で表示されます。

図4

 

Many to Many RNN

タイムスタンプごとに出力が生成される必要があるので、Many to Many RNNを使用します。Many to Many RNNを実装するためには、パラメータ「return_sequences」をtrueに設定して、タイムスタンプごとに文字が生成されるようにします。下の図5をご覧ください。

図5

上図の青色が入力層、黄色が隠れ層、緑色が出力層です。

 

Time Distributed Dense層(時間分散Dense層)

タイムスタンプごとに出力を処理するために、Time  Distributed Dense層を作成します。各タイムスタンプで生成される出力の上にTime  Distributed Dense層を作成します。

 

ステートフル

パラメータ「stateful」をtrueに設定することにより、バッチの出力は入力として次のバッチに渡されます。これら全てを組み合わせると、モデルの概要は下の図6のようになります。モデルアーキテクチャのコードスニペットは以下の通りです。

図6

model = Sequential()
model.add(Embedding(vocab_size, 512, batch_input_shape=(BATCH_SIZE, SEQ_LENGTH)))
for i in range(3):
model.add(LSTM(256, return_sequences=True, stateful=True))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(vocab_size)))
model.add(Activation('softmax'))

model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

 

ドロップアウト層

ドロップアウト層は、過学習を防ぐため、トレーニング中の層から層への伝達の際、一定の確率で入力要素をゼロに設定する正則化手法です。確率はドロップアウト層で使用されるパラメータによって決まります。

 

ソフトマックス層

AI音楽の生成は、入力データと一意対応する文字を各クラスとする多クラス分類タスクです。そこで、モデルの上位にソフトマックス層を作成し、損失関数として多クラス交差エントロピーを利用します。

この層から各クラスの確率が取得できるので、最も高い確率のものを選択します。

図7

 

オプティマイザ

モデルを最適化するため、Adamオプティマイザと呼ばれる適応モーメント推定(Adaptive Moment Estimation)を利用します。これは、RNNでは非常に良い選択肢です。

図8

 

音楽の生成

これで、RNNモデルの作成と入力データに基づく機械学習が終了しました。このモデルはトレーニング時に入力データのパターンを学習したので、「学習済みモデル」と呼ぶことにしましょう。

学習済みモデルで使用された入力サイズがバッチサイズです。一方、機械学習による音楽生成では、入力サイズは単一文字です。学習済みモデルと同様の新しいモデルを作成しますが、入力サイズは(1,1)の単一文字です。この新モデルに学習済みモデルの重みをロードして、学習済みモデルの特性を複製しましょう。 

model2 = Sequential()
model2.add(Embedding(vocab_size, 512, batch_input_shape=(1,1)))
for i in range(3):
model2.add(LSTM(256, return_sequences=True, stateful=True))
model2.add(Dropout(0.2))
model2.add(TimeDistributed(Dense(vocab_size)))
model2.add(Activation(‘softmax’))

学習済みモデルの重みを新モデルにロードする処理は、1行のコードで実行できます。

model2.load_weights(os.path.join(MODEL_DIR, ‘weights.100.h5’.format(epoch)))
model2.summary()

図9

音楽生成の過程では、最初の文字はランダムに選択されますが、次の文字は前に生成された文字を利用して生成され、その後も同じように前の文字を利用して生成されていきます。 

図10

これを実行するためのコードスニペットは以下の通りです。

sampled = []
for i in range(1024):
batch = np.zeros((1, 1))
if sampled:
batch[0, 0] = sampled[-1]
else:
batch[0, 0] = np.random.randint(vocab_size)
result = model2.predict_on_batch(batch).ravel()
sample = np.random.choice(range(vocab_size), p=result)
sampled.append(sample)
print("sampled")
print(sampled)
print(''.join(idx_to_char[c] for c in sampled))

このような仕組みで音楽が生成されます。

LSTMと呼ばれるニューラルネットワークに機械学習を行い、これら心地よい音楽のサンプルを生成しました。それぞれ曲のパターンは異なりますが、いずれも学習データに類似しています。これらのメロディーは次のように様々な目的に利用できます。 

  • インスピレーションの元になり、アーティストの創造力を高める
  • 新しいアイデアを開発する際、生産性向上に役立つツールとして
  • アーティストの作品に追加するメロディーとして
  • 未完成の作品を完成させる
  • 独立した一つの曲として

ただし、このモデルはまだ改善の余地があります。ここでは、学習データがピアノという単一の楽器の演奏のみでした。学習データを強化する一つの方法として、複数の楽器による音楽を追加することができます。あるいは、音楽のジャンルやリズム、拍子記号を増やすのもよいでしょう。

現時点で、このモデルは多少誤った音を生成することもあり、生成された曲自体もそれほど優れているとは言えません。上記のようにして学習データを増やせば、これらのエラーを減らし、曲の品質を高めることができるでしょう。

本記事では、ニューラルネットワークを利用するために音楽を処理する方法とRNNやLSTMなどのディープラーニングモデルの詳細な仕組みについて見てきました。また、モデルを微調整することによって音楽生成が可能なこともご説明いたしました。これらの概念は、風景画や肖像画の生成など、他の形式のアートを生成するシステムにも適用できます。

最後までお読みいただき、ありがとうございました。このカスタムデータセットをご自分で試してみたい場合は、アノテーション付きデータセットをダウンロードし、Githubでコードをご覧ください。

 

ライオンブリッジのAI教師データサービス

当社は、AI向け教師データの作成やアノテーションを提供し、研究開発を支援しております。データサイエンティスト、言語学者、認定アノテーターなどを含む100万人のコントリビューターが登録されているので、大規模なプロジェクトも正確に、素早く納品できます。自社開発のAIプラットフォームは、テキストアノテーション、画像のバウンディングボックスや領域検出、音声データの文字起こしや音韻表記など、様々なデータやアノテーションタイプに対応できるため、多言語チャットボット、OCR、顔認証、自動運転など、幅広い研究開発向けの教師データをご用意できます。20年の経験のもと、お客様のご要望に応じて柔軟な対応が可能です。お問い合わせ・無料トライアルのご依頼はこちらから。

※ 本記事は2020年10月01日、弊社英語ブログに掲載された寄稿記事に基づいたものです。

AI向け教師データを提供し、研究開発をサポートいたします。

メディア掲載結果

    AI・機械学習の最新情報をお届けします!

    Lionbridge AIのブログで紹介している事例記事やトレンドニュースといったビジネスに役立つ情報はもちろん、オープンデータセット集なども合わせてメール配信しております。