Deep Learning で音楽を作成するにはどうしたらいいの ?

2021-06-02
日常で楽しむクラウドテクノロジー

卜部 達也

こんにちは、AWS で機械学習ソリューションアーキテクトをしている卜部 (うらべ) です。皆さま、突然ですが良い音楽ライフを送っていますか !? 私は音楽を聴くのも演奏するのも大好きです ! ちなみに今はラモーンズ を聞きながらこの記事を書いています。最近は在宅ワークも多いですが、打ち合わせの合間に好きな音楽をかけて一人ヘッドバンギング をすると力が湧いて「全部私にまかせとけ !!!」という強い気持ちになれます。あくまで気持ちだけですが。。

近頃はいわゆる「巣ごもり需要」で楽器や DTM※ 関連の売り上げが増えたという話を聞きます。スマホやタブレットのアプリも充実しており、家で手軽に楽器演奏や作曲の機会が増えたのは非常に喜ばしいですよね。一方で、仲間と音を合わせたりライブや発表会で演奏したりする機会が減ってしまい寂しく感じています。仕方がないので、カラオケ音源やルーパー※ に合わせて一人で演奏していますが、予定調和ですぐ飽きてしまいます。(単純に自分の技術不足のせいもありますね。。)

「一人でいる時も、自分の演奏に対してリアルタイムに、インタラクティブに誰かと演奏ができたらよいのに、、」「今は会えないあの人と演奏できたらよいのに、、」「過去の偉大なミュージシャンの録音作品だけでなく、新しい曲やフレーズを聴けたらよいのに、、」「自分のバンドに映えるようなアレンジを自動で作ってくれたらよいのに」こんな気持ちを常に持ちつつ音楽や楽器に接してきました。

※ ラモーンズ : アメリカ合衆国ニューヨーク州で1974年に結成されたパンク・ロックバンド
※ ヘッドバンギング : 主にロック、ハードコアなどのライブで見られる共鳴的動作。リズムに合わせて頭を激しく上下に振る
※ DTM : Desk Top Musicの略でPCを利用して楽曲制作をおこなう手法
※ ルーパー : リアルタイムに録音・再生を繰り返して音を重ねることができる装置。足で操作できることが多い

機械学習、特にニューラルネットワークを用いた深層学習の発展はめざましく、大量のデータがあれば特定の目的を達成する機械学習モデルを作ることは簡単になってきました。音楽に関しても例外ではありません。先に挙げた私の願望についても、実際に、演奏家・作曲家の音楽データをもとに機械学習モデルを使ってその人らしい曲を作ることは十分可能になっています。

そこでこの記事では、機械学習を使って音楽を生成する手法や実例について紹介します。コンピュータで音楽を自動的に生成する方法はもちろん機械学習だけではありませんが、ここではニューラルネットワークを用いた手法に限定してその概観と代表的な事例を紹介します。また、今回は波形 (音源データ) を生成する手法については触れず、楽譜や MIDI データのような記号化された音楽データを対象にします。

生成した譜例や音源をたくさん載せていきますので、ニューラルネットワークの詳細がよくわからない人でも、「機械学習でこんなことができるようになるんだ !」という観点でお楽しみいただけたらと思います ! また、AWS ではコードを書けなくても機械学習で音楽を作成することができる AWS DeepComposer というサービスを提供しています。builders.flash で AWS 芸人しみずさん (@shimy_net) の書いた 記事 があります。是非、こちらもご覧いただき、DeepComposer であなただけの音楽を作ってみてください !

また、今回都合でカットした部分を含めた個人的な補足版の記事もありますので、ニューラルネットワークの動作や音楽生成に対する性質をさらに知りたくなった人は覗いてみてください。

さて、それでははじめていきましょう♫


1. 音楽生成をする際の入力 (モチーフ) と出力

“音楽” を生成すると一口に言っても、具体的に何を作り出すかで適切なデータの表現方法やニューラルネットワークの構造が変わってきます。「何から何をつくるか ?」つまり入力 (モチーフ) と出力の対応関係を考えながら説明していきます。

img_deep-learning-music-creation_01

メロディ→メロディ

まず、上図の点線枠のように一つのメロディがモチーフとして与えられたとします。
例えば頭の中にメロディが突然ひらめいたと考えてください。この 1 小節の美しいメロディをなんとか曲として完成させるためにメロディの続き、楽譜でいうと水平方向に音楽を生成します。これを “メロディ→メロディ” と表現することにします (上楽譜の 1)。

メロディ→ハーモニー (伴奏)

次に、思いついたメロディに対して別のパートを作りだすということもありそうです。メロディに対して伴奏をつけたり、もしくはメロディに対して対になるようなメロディ (典型的にはハモりのパートですね) をつけたりすることが考えられますね。これらを総称してメロディ→ハーモニーとグループ分けしておきます (上楽譜の 2)。

ハーモニー (伴奏)→メロディ

上述のメロディ→ハーモニーの反対でハーモニー→メロディの音楽生成もあります。こちらは、伴奏がすでに楽譜として与えられているときにメロディを作るというケースですね (上楽譜の 3)。

コード (和音) →メロデイ

伴奏を楽譜レベルできっちり決める前に、メロディを作りたいというケースもあるかもしれません。こちらの図に示したアルファベットと数字で表された記号は、コードネームといわる和音記号で、ギターなどを弾いたことがある方は目にしたことがあるかもしれません。

例えば F というコードは {ファ、ラ、ド} を構成音とする和音です。コードを指定することで曲の雰囲気をひとまず決めておいて、伴奏より先にメロディを付けるという方式ですね。この場合 F というコードを {ファ、ラ、ド} という 3 音と表現しても良いですし、“F” という文字列として表現しても良いです (他にも表現方法があるかもしれません)。

扱いたい情報をどのような表現方法にするかで、学習した機械学習モデルの性能は変わってきます。例えば、明るい響きのするコード (メジャーコード) か、暗い響きのするコードか (マイナーコード) に着目したい (と開発者側が思っている) 場合は、それを入力データに明示的に表した方が期待する動作をするでしょう。これはデータサイエンスにおける特徴量抽出と全く同じですね。

img_deep-learning-music-creation_02

クリックすると拡大します

無→メロディ and/or 伴奏

これまでのケースは、音楽を生成するときにメロディやハーモニーなど、特定のモチーフ (入力データ) を必要としてきました。しかし、場合によってはモチーフを一切提示することなく「自律的に」音楽を生成することが求められることもあります。プロデューサーに「明日までにいい感じの 5 曲頼むよ」と言われたシンガーソングライターのケースですね。コンピュータが音楽を自動生成する、という響きには多分にこの自律性が反映されている気もします。論文では、このように入力データ (モチーフ) の提示なしに音楽を生成することを “ex nihilo” (ラテン語で「無から」を意味する) と表現しています。


2. 音楽データの入力のためのデータフォーマット

次に音楽データ、特に音程情報をニューラルネットワークで扱うためのデータのフォーマットについて説明します。

img_deep-learning-music-creation_03

総論 の P.37 より引用
クリックすると拡大します

単一の値(スカラー)としてエンコーディング

まず、標準的な 88 鍵のピアノで、真ん中より少し右の位置にある鍵盤の "ラ" の音 (“A4” と表記されます) をニューラルネットワークで扱う方法を考えます。この "ラ" は周波数 440Hz に調律されている (ことが多い) ので、“440.0” という小数値で表すことができます。単純に音程を周波数として表しています。

一方で、音程を厳密に周波数で表さなければいけないケースはあまりないと思います。音程に関する離散的な情報だけを用いたい場合は、例えば “69” という数値を使って表すことができます。この 69 という数字がどこから来たかと言いますと、MIDI という規格があって (細かい話は省略します)、その中で音程 (すなわちピアノの鍵盤) それぞれに “ノートナンバー”という値を割り振っています。A4 (440Hz) の音程はノートナンバー 69 に対応しています。それぞれの音程を離散的なクラスとみなして、クラス番号を直接ニューラルネットワークに渡してあげようという話です。

One-hot ベクトルによるエンコーディング

データサイエンスでは離散的なクラスをそのクラス番号を用いる他に、One-hot encoding と言われるやり方で表すことも多いです。音楽生成におけるニューラルネットワークでも、各音程を One-hot encoding を用いて表すやり方はよく見られます。音程 (クラス) の数を要素とする One-hot ベクトルを用意して実際に発音する音程を 1、他を 0 とする表現方法です。

複数の発音を表現するエンコーディング

スカラー値や One-hot encoding では一つの発音しか表すことができませんでした。複数の発音を表すには、複数のクラスのフラグ (“1” の値) を許す Many-hot encoding や、One-hot encoding を複数用いる Multi-one-hot encoding を用います。

Many-hot encoding と Multi-one-hot encoding の使い分けですが、実際の発音原理と対応させるのがシンプルで良いと思います。例えばピアノのように一つの楽器で複数の発音が可能であるのならば Many-hot encoding、トランペットとサキソフォンのように単音の楽器が複数ある場合は Multi-one-hot encoding が自然でしょう。もちろん、場合によっては Many-hot encoding を複数並べた Multi-many-hot encoding もあります。


ここまで、ニューラルネットワークのノードに音楽情報を入力させるためのエンコーディング手法について説明しました。注意してほしい点として、「ここで述べたエンコーディング手法では、ある瞬間における発音に関する音程の情報だけが含まれており、音の長さや順序、すなわち時系列的な情報は含まれていない」ことに注意してください。さらには、音の強さや音色のような情報も含まれていません。

ここで述べた手法の他にも様々なエンコーディング手法があります。例えば、後述する畳み込みニューラルネットワーク (CNN) を用いる場合は、ピアノロール と呼ばれるデータ形式を用いることが多いです。

画像の横軸が時間、縦軸が音程、各ピクセルが実際の発音に相当します。画像と似ているので CNN との相性の良さがイメージできると思います。

img_deep-learning-music-creation_04

クリックすると拡大します


3. ニューラルネットワークを用いた音楽生成の実例

ここからは、実際にニューラルネットワークを用いた音楽生成を見て (聴いて) いきましょう。

3-1. MiniBach (G. Hadjeres et al.)

まず最初に示すのは最も基本的なニューラルネットワーク構造、隠れ層を 1 層含む 3 層型のパーセプトロンを用いた MiniBach です。Bach というのは 18 世紀のドイツで活躍したあのバッハ (ヨハン・セバスチャン・バッハ) のことです。MiniBach はニューラルネットワークの学習で用いる mini batch (ミニバッチ) にかけているんでしょうね。

用いたデータセット

MiniBach では JSB Chorales dataset と呼ばれるデータセットを用いています。コラール (choral) とはもともとドイツのルター派協会で用いられた賛美歌のことで、グレゴリオ聖歌など各種の聖歌や教会歌の総称の意味でも使われます。JSB Chorales Dataset はバッハ (ヨハン・セバスチャン・バッハ) が作曲した 382 曲の 4 声のコラールをデータ化したものになります (データセットのフォーマットなどの詳細はここでは詳しく触れません)。

MiniBach のネットワーク構造と入出力

前述したとおり、MiniBach では入力層→隠れ層→出力層の 3 層のネットワーク構造を持ちます。入力データは 4 声のパートのうちソプラノ (最も高いパート) のデータを入力データとして、残りの 3 パート (バス、テノール、アルト) を出力する構造となってます。JSB Chorales Dataset を教師データとして、ソプラノパートから他のパートを予測するタスクとみなすことができます。既存のデータセットの曲を再現するように学習させたあとに、新しいメロディのソプラノパートを入力して残りのパートを生成し、全体として 4 声の楽曲を生成することができます。

img_deep-learning-music-creation_05

クリックすると拡大します

MiniBach での音楽生成例

それでは生成された楽曲を見てみましょう。ソプラノのフレーズを入力データと、出力された 3 声のデータを 合わせて示します。

img_deep-learning-music-creation_06

生成例 (論文 の P.95 より引用)
クリックすると拡大します

再生してみましょう »

どうでしょうか。感想はおそらく人それぞれだと思いますが個人的にはそれっぽい曲ができているように聞こえます。不自然な音の跳躍や不協和音がなく、曲として調性がとれているように聴こえます。

一方で、曲としては単調で面白みがないようにも感じられます。例えば曲としての盛り上がりや展開を出すための和音の展開が感じられません。特にバッハのコラール音楽で見られるようなわかりやすい解決感、主調 への (完全) 終止感が感じられません。終止感というのは、超ざっくりいうと小学校の音楽の授業の最初にピアノで弾く ”起立 (ジャーン)・礼 (ジャーン)・着席 (ジャーン)” ってやったときの「決まった !!!」って感じのことです。

また、出力された各パートのメロディは全て四分音符で、フレーズとしての複雑さや展開がありません。学習に用いたデータセットであるバッハのコラールがこういった単調な曲ばかりであるということはもちろんありません。また、バッハの音楽に特徴的な、あるパートで出てきたフレーズがしばらくすると別のパートで形を変えて出てくる、つまりモチーフの展開がみられません。

そういったバッハのコラールの特徴を MiniBach では学習によって獲得できていないと考えられます。これは、MiniBach で使われているネットワーク (いわゆる多層パーセプトロン) では、ノードの順序に意味がないので、例えば音符の構造 (順序) を考慮してノードに入力したところで、時系列的な関連性 (すなわちフレーズ) を学習できないことが原因と考えられます。

また、ネットワークのノード数は固定されているため、固定された長さのデータ (楽曲) しか生成できません。また、同じ入力からは常に同じ楽曲が生成されます。通常の機械学習では再現性は非常に重要ですが、演奏や作曲を考えた時にはある程度のランダム性が必要とされることも多いです。また、音楽生成の際に、人間の意向を部分的に反映させることも困難です。

次章では、これらの課題を解決するために、再帰的なニューラルネットワークを用いた例を紹介します。

3-2. DeepBach (G. Hadjeres et al., 2017)

前述した MiniBach はシンプルすぎて、時系列の情報を扱えない、可変長の音楽性ができない、常に同じ結果しか得られない、人間の意向を組み込めない、という課題がありました。

この課題に対応する新しい音楽生成モデルが MiniBach の著者より発表されています。その名も DeepBach。そう、MiniBach の改良版ですね。MiniBach と同様にバッハのコラールデータセットを用いて、コラール形式の音楽を生成するシステムです。このシステムでは、LSTM モデルを使って可変長を含む時系列データの生成を可能にしました。また、擬似 (pseudo) ギブスサンプリングとよばれるアルゴリズムを使って、演奏にランダム性を取り入れたり、人間の意向を反映させることが可能になっています。

DeepBachのネットワーク構造

img_deep-learning-music-creation_07

論文 の P.170, 171 を元に筆者が一部追記

DeepBach では、4 声の各パートに一つのニューラルネットワークモデルが対応しています (つまり上図の左で示したようなネットワークが全部で 4 つある)。ネットワークには双方向性 (bi-directional) の LSTM アーキテクチャが用いられています。一つ目の LSTM は過去から現在 (の 1 時点前) の全パートの演奏 (時系列データ) を辿る LSTM ネットワーク、もう一つは未来から現在 (の 1 時点後) までの全パートの時系列データを逆向きに辿る LSTM ネットワークです。加えて、現時点での自分のパートの演奏情報のみを入力として用いるネットワークがあり、その 3 つの出力をマージしたのちにさらに後段のニューラルネットワークにに通して最終的な出力としています。

図のように、Voice 1 (ソプラノ) を例にとると、自分の現在の発音 (すなわち予測したい答え) 以外の周辺データを用いて現在の自分の発音を予測する、という問題設定になります。未来の発音データを使うことに違和感を覚えるかもしれません。しかし、例えば人間がジャズセッションをする場合など、楽譜やコード譜の形で曲の構成、すなわち未来的な展開を予め知っています。その際に、演奏を着地させたい時点を決めてそこから逆算しながらフレーズを開始するということを自然にやっています。ですので、逆方向に辿る LSTM ネットワークも同じようなことをしていると解釈できます。

擬似ギブスサンプリング (pseudo-Gibbs sampling)

DeepBach も (再帰的ではあれど) ニューラルネットワークに変わりはないので、同じ入力からは常に同じ入力が得られます。これだと面白くないので、DeepBach では擬似ギブスサンプリングと論文中で呼ばれるサンプリング方法を用いてランダム性を取り入れながら 4 つのパートのフレーズを徐々に生成していきます。

img_deep-learning-music-creation_08

簡単に説明します。
生成したいパート、グリッド (この場合 16 分音符 64 個、4 小節分) の音程情報 (ノートナンバー) をまずランダムに初期化します (図の左上)。その後、特定のパート・グリッド (図の左下の緑の領域) の音程情報を、周辺の演奏データから (対応するパートの) ネットワークを使って更新します。

これを繰り返すことで、完全にランダムな初期状態から、周りの音との関連性を考慮した音程情報へと徐々に更新させていきます。

擬似ギブスサンプリングの逐次生成例

このサンプリングを行ったアニメーション (GIF) を示します。
反復の回数が増えるに伴い、音符が収束していく様子が確認できます。

それでは、サンプリングによって徐々に生成 (収束) していく様子を音で聴いてみましょう。

DeepBach の生成例を聴いてみる

i=0 (初期状態)

まずは、サンプリング前の完全な初期値です。4 小節分生成していますが、最初の 3 小節のみを表示しています。

譜面をみてもわかるように、16 部音符で見るからにデタラメです。臨時記号 (シャープやダブルフラットなど) もたくさん付いておりで調性もなにもあったもんじゃないですね。まぁ、これはこれでカッコよく聞こえます。
(ちなみにフラットやシャープの表記方法は、楽譜に起こす時の譜面エディタの影響です。DeepBach が「これは ラ♯ ではなくて シ♭」とか指定しているわけではありません。MIDI ノートナンバーでは同じ音です)

i=10 (240 回のサンプリングによる修正)

なんとなく曲っぽくなってきた感があります。各パート、4 小節 (= 64 個の 16 分音符) に対して 60 回の修正を行っています。初期のカオス状態から、徐々にリズム (譜割り) や音使いが曲のようなものへと変化していっているように聞こえます。

i=298 (7152 回のサンプリング)

ここまでくると一つの曲として聞こえてきます。音符もランダムな 16 分音符から、4 分音符や 8 分音符を使ったフレーズへと収束しています。特に前半部分など、ここまでくると人間が作った曲と間違える人もいるのではないかと感じます。ただ、最終小節のソプラノパート (最上段)、一番最後の音 (ソのシャープ) が調子っぱずれに聞こえますね。逆にいうと、最後の音が奇妙に感じるくらい他は全体としてまとまっている、とも言えます。最終小節が単調 (同じ音を繰り返している) な理由はよくわかりませんが、曲の切れ目 (最初と最後) であるために、(画像における CNN と同じく) データのパディングの影響を受けている可能性もあります。

i=1998 (47952 回のサンプリング)

はい、サンプリングの最終回 (2000 回まで切り上げました) の生成結果です。ここまでくると立派に曲ですね。調性として破綻していない、というだけでなく曲の展開が (私には感じられます)。最初は悲しい感じで始まっていて (主調の平行調の Em のコード)、3 小節目で 2 分音符を使ってクライマックス感を出しています。起承転結感があるように感じられます。また、音列の上行・下行がパート内で繰り返されたり、パートからパートへと引き渡されたり、モチーフの展開も感じられます。

私だけの主観だと自信がないので Twitter 上で感想を聞いてみました。

  • 出だしのハーモニックマイナーっぽいフレーズがクラシカルな雰囲気を出している

  • 最後 (4 小節目の 3 拍目) 不協和音が残念 (4 拍目への解決感もない)

また、バッハっぽい、逆にバッハっぽくない、という意見もシンプルな意見もいただきました (ご意見いただいた方、ありがとうございました。)。


まとめ

いかがだったでしょうか。
ニューラルネットワークを用いた音楽生成手法について、基本的な構造 (多層パーセプトロン、LSTM) を用いた事例についてお話ししました。音楽データをどうやってニューラルネットワークに入力するか、モデルからどのように最終的な出力を得るか、なるべく具体的に説明しました。

DeepBach については著者が実装を github で公開しているので、興味のあるかたは実際に音楽を生成させたり、ご自身のデータセットで学習させて Deep〇〇 (←あなたのお名前) を作ってみるのも良いかもしれません。(この記事の擬似ギブスサンプリングによる生成例も著者実装をもとに私がコードを一部改変して生成しました)

生成モデルの花形、GAN や VAE などを用いた音楽生成については今回は分量の関係で触れませんでしたが、機会があればまた取り上げてみたいと思います。この記事を読まれた皆様もぜひ、論文を読んで実装にチャレンジしてみてください。

反対に、「ニューラルネットワークなんて知らない。でも自動作曲には興味がある」という方もたくさんいらっしゃると思います。私もそのような立場に大賛成です (音楽は実際に耳で聞いてワクワクするかどうかが全てですからね)。先に述べたように AWS では DeepComposer という、コードを書かなくても音楽 (メロディや伴奏) を自動的に生成する楽しいサービスがあります。また、技術的なこともチラッというと、DeepComposer では GAN や Transformer など最新の音楽生成アルゴリズムを取り入れています。このあたりの技術的な背景についても別の機会で書いてみようと思っています。

そう遠くない未来、人間と機械とともに今よりももっともっとインタラクティブに音楽を作っていたり、あっとおどろくフレーズを機械が演奏したりしているかもしれませんね。ターンテーブルからスクラッチが生まれたように、ニューラルネットワークから新しい音楽が生まれる日を楽しみに、これからもテクノロジーや音楽に浸かっていきたいと思います。

それでは、みなさまの素敵な音楽ライフにこの記事がすこしでもお役に立てたのであれば幸いです。

Enjoy Music and Technology!!!

記事執筆の際に参考にした資料・Web サイト

ニューラルネットワークによる音楽生成に関して下記の素晴らしい総論があります。ほぼ毎年改定されており、技術革新の目覚ましい深層学習のトレンドが音楽生成にも貪欲に取り入れられる様を目の当たりにできます。ただし基本的な部分は不変で、今回の記事もこの総論の基本的な内容をベースにしています。

Deep Learning Techniques for Music Generation — A Survey »

また、上記の総論を日本語でまとめたウェブサイトもあり、こちらも非常にわかりやすいです。データの記号化や事例の詳細やリンクが豊富です。

Deep Learninhgを用いた音楽生成手法のまとめ [サーベイ] »


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

著者プロフィール

photo_urabe-tatsuya_2

卜部 達也
アマゾン ウェブ サービス ジャパン合同会社
機械学習ソリューションアーキテクト

公立研究所で化学センサーの研究開発、企業研究所で自動運転の研究開発を経て 2020 年から現職。パソコン・SAKE (酒)・ロックンロールをこよなく愛する。好きなアーティストはダニー・ハサウェイ。好きなコードは E7

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する