2020年12月31日木曜日

AI音楽備忘録 どこまでが音楽か

 AI音楽備忘録

現状AIモデルにての11作品。
https://www.youtube.com/channel/UCX514JhcB-HsCYC4dBLMC1Q



実際には同じモデルでなく、ずっと改良を加えているので、まあ途中経過がそのまま備忘録的にアップロードされているという感じです。

当初は生成されたトラックサンプルをシーケンサ上で人力で選択し組み合わせていたのが、自動でミックス・フェードアウトまで作れるようになって、シーケンサを通さずに、コマンド一つで音楽が作成できるようにはなりました。

>


この例をみると、ドラムパターンはいい感じで繰り返されていますが、上物はどうも変化に乏しい。

現在のモデルは波形を直接学習しその続きを作っていくというもので、そしてその仮定でBPMや小節といったある程度の「音楽のルール」は正規化されています。

しかし、コードや、音楽の大枠での構造(4、8小節のまとまりなど)をいうものを理解しているわけじゃないので、はじめと終わりなどの展開、コードに沿った音の重ね合わせ、などができるようになるのが次の課題になるでしょう。

本当はリズムパターンだって1小節を繰り返してるだけじゃなく、4、8小節ごとにリフがあったり展開があるのが普通ですしね。

何をもって音楽と呼ぶのだろう?


しかし、作っていくうちに音楽の定義という物を考えないと何がゴールかさっぱりわからない、ということに気がついたのです。

「何を音楽とするか」のいわゆるAIでいうところのフレーム問題(使い方が違う気はするけど)的な物にぶつかってしまったわけである。

なにが音楽なんて曖昧な物で、とどのつまり、いってしまえばただ雑音を録音しただけでも、音楽と言えてしまうわけですしね。

たとえばこれはリズムパターンを延々と生成するタイプの曲。
個人的にこれは音楽だと思うが、そうじゃないという人もいるかもしれない。


シュレーディンガーの作曲家


このプログラムの目標は音楽が永遠とアップロードされていて、それが人の手によるかどうなのかわからなくなることです。

これは昔からずっと考えていたことで、クリエイターの究極の姿ってそういうことなんじゃないかと思っているのです。

自分が死んでもずっとアップロードされているので、周りからみたら生きてるか死んでるかわからない、みたいな形。

いわば、シュレーディンガーの作曲家?

おそらくそういうことはこれからたくさん出てくるでしょう。

ずっと新作ドラマに登場してくる俳優、永遠にニュースを読み続けるアナウンサー、ずっと新作を発表し続ける絵描き、、、ずっと作曲をし続ける作曲家。。。

しかし、まあそれは先の話なので、とりあえずここでは音楽を

「リズム」と「上物」とに分かれた繰り返しの拍子を持つ物

に定義して進めてみることにしましょう。





2020年11月16日月曜日

AI作曲をコードと数式を使わず説明してみる、その2

特徴量の抽出

代表的なものには以下のようなものがあり、それぞれ一長一短ありますが、

  • 短時間フーリエ変換 (STFT)
  • メル周波数ケプストラムMFCC
  • ウェーブレット解析

とりあえずここでは一番基本の短時間フーリエ変換(以下STFT)を使用することにします。

といっても普段からおなじみの、音質を調整するイコライザのようなものだと思ってくれれば良いです。


この状態のデータのグラフは、横軸に時間、縦軸に音量をとっていますね。
このデータにSTFTをかけると。。。。

以下のようなグラフになります。
横軸時間、縦軸に周波数、さらに色の濃淡で、音の音量も表現することができます。


(イコライザ なんかはこのデータを元に各音域を調整するのですね)

このようにすると生のwaveデータの状態よりも音の構造がよりわかるようになります。

そして、この状態のデータをAIに「学習」させることにします。

時系列データを学習する


AIで学習するデータはざっくり大きく乱暴に分けると2種類あります。

  • 時系列のデータ
    • 時間によってデータ変わるもの、毎日の気温、文章(前から後ろへ書いていきますね)、映像、などなど。
  • 時系列ではないデータ
    • 文字認識、絵、などなど。

それぞれによって使用するアプローチが変わってきます。
音楽は当然時系列のデータです。

たとえば、ピアノに座って「ミ」の音を出しただけではただの音です

前に「ド」をつけて、「ド・ミ」と引くとその音はそれぞれ意味を持ってきます。

意味を持たないただの音だった「ミ」はドと並べることで「音程が上がったよ」「三度上がった調和する音程だよ」という意味をもつ音となり、それはメロディとなり、調性をも生み出します。ド・ミとつながったのだから多分ソがきてドミソの和音かな?、とその先の展開も想像できるわけです。

AIでも同じ考え方をします。
前のデータを学習すれば、その先の音はわかるのではないかな?という仮定に立ちます。

その考え方に立ったものがAI学習方法の一つ「再帰型ニューラルネットワーク」です。




これはそれより「過去に起きた情報」を保持し、次のステップに利用することができるというアルゴリズムです。

時間の共に変化する分野、特に、「言語解析」や「音声認識」の世界では主流となっています。

音楽も同じように「時間と共に変化する」性質をもつので、この考え方を利用することとします。

というわけで次は、実際の楽曲生成です。


2020年11月8日日曜日

AI作曲をコードと数式を使わず説明してみる、その1

Waveファイルで音楽をディープラーニングさせたい!!

今現在、AIによる作曲の手段としてはgoogleのmagentaというライブラリが有名です。


これを利用した作曲手順についてはこちらに記事を書いています。
作曲家兼プログラマー 早川大地がAIによる作曲について語る:「人工知能で作曲、ここまで来てた!!」

googleが作ってくれたんだからそりゃあ有能に違いない、とmagenta を使って色々遊んではみたのですが、なにぶん残念なことに作曲については基本Midiがベースとなっているのです。
(ボーカル合成とかあるにはあるんだけど)

Midiファイルの例:「どの位置で何の音が鳴るか」が記録されたファイル


こうなってくると、作曲家の補助的な用法としては使えるかもしれないけど、リスニングの分野の実現性としてはどうなんだろうかと思うところなのです。

ということで、やっぱりなんといっても普段聴き慣れているWavデータを使って、自動作曲したいと思うのですよね。

Wav ファイルの例:普段PC上で耳にする音楽はほぼこれですね。



そこで、magentaに頼らずに1からモデルを作ってみることにしました、その過程で考えたことを通して、AI作曲についてなるべくわかりやすくまとめてみたいと思います。

AI作曲についてはなにが正解ということもないので、こんな考え方があるのだなあと思って思えれば。

もちろんこのアプローチですぐにまともな「作曲」ができるとは思えないけれど、リズムを変異させたりあらたな環境音を作りだしたり、と新たな作曲のヒント程度は作ることができるかもしれない。

というわけで数回にわけて、Waveファイルを対象としてディープラーニング作曲・AI作曲にチャレンジしてみたいと思います。

できるだけ、技術畑の人だけでなく音楽畑の人にプロセスを理解してもらいやすいようにかければなと思っております。

音楽を分析する際のポイント


同じようにWaveファイルを分析するものとして、代表的なものに音声認識があります。

音声認識は母音や子音の特徴量を認識して、これが「Ah あ」だとかこれが「kah か」だとか、分類していく作業です。

ところが音楽の場合は単なる音声認識と違ってさらに考慮すべき構造がもっときっちりとあるのです。

  • テンポの正規化
  • 小節の構造
  • 楽器の構造

構造があるということは手がかりがあるということです。

これらの構造を利用してコンピュータが学習することができれば!!

と期待できますよね。

まずは音の「特徴」について考えよう。


例えば誰かの歌声を覚えるとき、人は、無意識のうちにその特徴を覚えていると思います。

声色の雰囲気だったり、のどの使い方だったり、高さだったり、しゃくりあげや、語尾の発生の仕方だったり。

ちなみにものまねがうまいひとなんかはこれが上手なのですよね。
「特徴」となる部分を上手に掴み取ることができる、天性の学習能力がある、とも言えるでしょう。

それに類することをコンピュータ上でも行い、データを整理し学習しやすくする、というのがデープラーニングのプロセスの第一歩です。

これを「特徴量の検出」という言い方をします。

ただしそれを人間がやるのと違う点は、音楽を物凄い短い時間の単位に区切り(0.001 秒ごと、などなど)そしてそれを、物凄い数やるということでしょうか。

音とは何か

さて、いったん基本に立ち返って、音とは何か、という話。

まずは以下二つの波形を見てみましょう。


4cos10πの波形




3cos6πの波形




横軸に1(秒)をとり縦軸に大さ(振れ幅)をとったグラフです。

ずいぶん単純なグラフ(波形)ですね。

さて、この周波数と、振幅(振り幅)はいくつでしょうか。

そして、周波数=1秒ごとに揺れ動く(グラフと山と谷の数)とですので、最初のグラフは周波数が「5」です。(数えてみましょう、いち、にー、さん〜、し〜、ご〜・・)

そして、下のグラフの方も数えてみると周波数が「3」となりますね。

加えて振幅の大さがそれぞれ、4、3となっているのは見て取れますよね。(グラフの山のてっぺんをが縦軸のどこに来ているか、を見れば良いでしょう。)

そして、どちらの式もXcosYπという形で表されます。

上のグラフは、4cos10πで下のグラフは3cos6πですので、XとYに入る数字が変わっているだけですね。

ちなみにこの場合Xが振幅となり、Y の二分の一が周波数となりますので、グラフを見ずとも、式をみるだけで、振幅と周波数がわかります。

これは「コサイン波」と呼ばれる波形、これも立派な「音」になります。(シンセサイザにも入ってますので、ご存知の方も多いかと。)

この音は非常にシンプルな「プー」とか「ポー」とかいう素朴な音。

コサイン波同士を足し算して音を作る


そして、これら波形は足算・引き算、四則演算をすることができます。

たとえば、最初の二つの波形を足し合わせると、以下のような波形になります。

4cos10π+3cos3π


足し方は簡単です。

上のグラフでは横軸(時間)が0.0の時に縦軸(振幅)は4となっていて、下のグラフでは横軸が0.0の時に縦軸は3となっています。

ですので、足算したグラフでは0.0のところに4+3=7が入ります。

この要領で順次足していけば良いのです。

とまあ二つの単純な波形を足算しただけですが、ずいぶんと複雑な形になりましたね。

実際にはこれ以上に無数の波形が足し合わせられることで、様々な複雑な音が生成されます。

鳥の声も人の声も、楽器の音も、もちろんシンセサイザも、すべて単純な波形の重ね合わせです。

となると、それぞれ重なり合った波形を分析していけば、必要な音の「特徴量」が掴めるのでは・・・・なんて気がしてくるのではないでしょうか。

この技術の延長に「イコライザ」のようなみなさんお馴染みのものがあり、まずは特徴量の学習はそこからのスタートということになります。

次回以降は特徴量の抽出方法について試行錯誤していく話となります。

2020年9月20日日曜日

絶対音感がある人は3%、音大生では30%、アプリによれば5%?

 


新潟大学の宮崎謙一教授らチームによる研究によれば、日本人で絶対音感がある人は全体の3%ほどなんだそうです。

それが音大生だとぐんと跳ね上がって30%ほどになるそう。

ちなみに宮崎教授らのチームのテスト方法はピアノの音を聞かせて90%以上当てられることを基準としているそうです。

というわけでその結果を踏まえて、「絶対音感トレーニング」

アプリの結果からそのデータを独自に計算してみました。                                               

このアプリはビギナーモードだと単音だけでのテストとなりますので、だいたい、850~900点以上、図の中の青い線より下のスコアが出た場合絶対音感がある、と考えて良いでしょう。

ビギナー意外のノーマル、ハード、スーパーハード、モードでは複数音当てなども含んでいるので、ちょっと比較しづらいので除外します。

こちらがその点数のグラフです。


縦軸が得点(1000点満点)、横軸がその人数です。

そして、実際に850点以上記録している人の割合を計算してみると、5.67% = 5%強となりました。

日本人全体の3%よりは多いですが、テストしてみようという時点で既に音楽への興味はある程度強いと考えられますから、5%というのは妥当な数字とも思えますね。


その他のデータはこちら

ハード

ノーマル


スーパーハード


かなり複雑な複数の音を当てるハード、スーパーハードとなると、逆に900点超えがたくさんいるのも面白いところです。

900点を超えるには、4つの音が同時になっているのを即座に判別して、正確に答えられないといけませんが、スーパーハードに限っては半数近くが達成している模様。

できる人はとことんできるということなのでしょうか。





2020年9月16日水曜日

FlutterによるiOS/Androidアプリ開発が良い理由

最近使用頻度の高いAndroid/iOS 両対応フレームワーク Flutter

数本アプリ開発を通じて少し知見も貯まったと思うので、思うところを記載します。


結論から言うと

そのアプリに必要なライブラリがあることが予め確認(重要)できるのなら、導入ゴーで良いと思う。

フレームワーク自体の開発速度も早いし、バージョン管理ツールも出た。いまアツい。

個人的には今年ARライブラリのWikitudeが対応したことで、さらに幅が広がりそう。


箇条書きで理由を述べます

    

    Google開発・オープンソースなのでなんとなく安心感がある。

フレームワーク自体の開発ペースが早い。そのため複数バージョンを使用したりする機会も多い。以前は複数インストールして手動でパスを変えるという方法しかなかったが、バージョン管理ツールfvmが出てからだいぶ楽になった。

    ネイティブコードで動作する。

アプリの動作・UIの部分だけ両対応することに集中した設計。細かい設定はXcodeやAndroidManifestを直接いじることになるが、正直その方が楽。両OSのバージョンアップや仕様変更にも対応しやすい。したがってバグも少ない。(Titaniumなどはbuild時にXcodeのプロジェクト自体を作り直していたので、いろいろ大変だった。。。)

    ホットリロード機能がすごい。

動作中に少しコードを変更し、Rキーを押すだけで、リロードされる。再コンパイルが必要なしで、HTMLのような感覚でデザインを作れる。開発速度がとてもあがる。


    アプリをDartで開発できる。

Javascriptのゆるさとオブジェクト志向言語のかっちり感を程よく組み込んだ良い言語だと思う。個人的には ” ) ” が多くなりすぎるので視認性はどうかな、とは思う。一部わかりづらい書き方があるがそれは慣れ。

嫌なコードの例

            Container(
              padding: EdgeInsets.only(left:100,right:100),
              child:rows,
              alignment: Alignment(0,0), 
            )
          ]), //この辺の括弧が多い。。。
        ),
      ] 
    );

    ライブラリ充実度がかなり上がってきた

2019年初頭くらいには、videoのプレイヤーやXMLのパースなどライブラリによってはまだまだ足りないところがあった印象だけど、ここにきて通常の使用には困らなくなった印象。このあたりは今後dartがどれくらい伸びるかにかかっている。。。