市來健吾の日記

プログラマ、(元)物理屋(ナノテク、流体)

WaoN で Google Magenta に挑戦


  • ちょっと長いですが、
    自分の書いたプログラムでグーグルに戦いを挑んで、 かなり善戦したぜ
    という内容です(かなりバイアスかかってます)。 結果は、次の3つのオーディオファイルを聞けば分かります。 オリジナルが左、真ん中が Google Magenta の結果、 右がぼくの書いた WaoN の結果です。
    オリジナルmagentaWaoN
    brad-1min.mp3 brad-1min.magenta.mp3 brad-1min.waon_n4096_s512_cm6_r1.mp3
    ということで、以下、本文です。

  • 先日ツイッターで予告した通り(https://twitter.com/ichiki_k/status/965413383448100865)、 Google Magenta チームが書いた Machine Learning による オーディオから MIDI に変換する transcriber に対して、 ぼくが昔書いた WaoN というプログラムで挑んでみよう、 というはなしです。

  • ことの発端は、以下のツイート (https://twitter.com/fjord41/status/963165268330536960)

    New blog post about the project I've been working on for a while.
    Automatic piano music transcription (raw audio to MIDI) that works really well!

    6:37 AM - 13 Feb 2018

    ここに引用されてるブログ記事「Onsets and Frames: Dual-Objective Piano Transcription」読んでみると、彼らがご自慢の TensorFlow でやってることは、 オーディオファイルから MIDI ファイルを生成するという処理、 いわゆる採譜 (transcription) で、 WaoN がやってることそのものでした。 これを見て、天下のグーグルさんがどれほどのものか知るいい機会だぜ、 と思ったわけです(この時は)。

  • ということで、まずは Magenta のブログにあったショパンモーツァルトのサンプルを WaoN で試してみました。 手順は、まず上記記事からダウンロードした ground truth の mp3 ファイルを madplay で decode して、WaoN に食わせてみました。 WaoN のオプションは default のままです。 この WaoN が吐き出した midi file を、 fluidsynth で wav にして normalize をかけて、LAME で mp3 にエンコードしました。 一応、具体的な手順を、ショパンの場合で載せておきます。

    % madplay -o chop25-3-ground.wav chop25-3-ground.mp3
    MPEG Audio Decoder 0.15.2 (beta) - Copyright (c) 2000-2004 Robert Leslie et al.
    Title: chop25-3-ground
    Composer: Sageev Oore
    Artist: Sageev Oore
    Album: Sageev Oore's Album
    Year: 2017-10-23T09:51
    609 frames decoded (0:00:15.9), -5.4 dB peak amplitude, 0 clipped samples

    % waon -i chop25-3-ground.wav -o chop25-3-waon.mid
    Format: Microsoft WAV format (little endian default).
    Subtype: Signed 16 bit data
    Endian type: Default file endian-ness.
    frames : 701568
    samplerate : 44100
    channels : 2
    sections : 1
    seekable : 1
    WaoN : end of file.
    division = 43
    WaoN : # of events = 1542
    WAON_notes : n = 1542
    filename : chop25-3-waon.mid

    % fluidsynth -F chop25-3-waon.wav /opt/local/share/sounds/sf2/FluidR3_GM.sf2 chop25-3-waon.mid
    FluidSynth version 1.1.6
    Copyright (C) 2000-2012 Peter Hanappe and others.
    Distributed under the LGPL license.
    SoundFont(R) is a registered trademark of E-mu Systems, Inc.

    Rendering audio to file 'chop25-3-waon.wav'..

    % normalize chop25-3-waon.wav
    Computing levels...
    chop25-3-waon.wav 100% done, ETA 00:00:00 (batch 100% done, ETA 00:00:00)
    Applying adjustment of 26.08dB to chop25-3-waon.wav...
    chop25-3-waon.wav 100% done, ETA 00:00:00 (batch 100% done, ETA 00:00:00)

    % lame chop25-3-waon.wav
    LAME 3.100 64bits (http://lame.sf.net)
    Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
    Encoding chop25-3-waon.wav to chop25-3-waon.mp3
    Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
    Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
    558/558 (100%)| 0:00/ 0:00| 0:01/ 0:01| 17.819x| 0:00
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー-
    kbps LR MS % long switch short %
    128.0 37.8 62.2 98.8 0.7 0.4
    Writing LAME Tag...done
    ReplayGain: -7.5dB


  • 結果は、以下のようになりました。

  • ここでちゃぶ台をひっくり返しますが、 ぼくはショパンとかモーツァルトが transcribe できても 何も嬉しくありません。 そもそも、ぼくがどうして WaoN を書いたのかというと、 譜面のない音楽の譜面が欲しい、という理由だったので、 当然です(負け惜しみですが…)。 ということで、ぼくが採譜したい音楽で競争することにします。 (今更)

  • そのためには、まず Magenta チームの transcriber (github: Onsets and Frames: Dual-Objective Piano Transcription) を手元に準備する必要があります。 いくつか方法が書かれてますが、今回は一番簡単な Colab Notebook でサクッと inference のみで 使ってみることにしました。

  • 課題となる音源は、youtube から好きなビデオをピックアップして、 そのオーディオを使うことにしましょう。 今回は、ぼくのお気に入りの、 Brad Mehldau がピアノソロで演奏した、 Stevie Wonder の名曲「Golden Lady」を使ってみました。
    youtube: Brad Mehldau - Golden Lady (Stevie Wonder) Solo

  • 素材は、youtube-dlmplayersox を使って、以下のように1分の長さの wav file を作りました。

    % youtube-dl Lpk86Ddsp7U
    % mplayer -vo null -ao pcm:file=brad.wav Brad\ Mehldau\ -\ Golden\ Lady\ \(Stevie\ Wonder\)\ Solo-Lpk86Ddsp7U.mkv
    % sox brad.wav brad-1min.wav --show-progress trim 0 01:00
    % lame brad-1min.wav
    brad-1min.mp3
    聞いてみると分かる通り、ドラムなどの入ってないピアノソロで、 でも使ってる音域が低音寄りで、普通に FFT でアプローチしようとすると 結構タフな演奏だと思います。

  • まずは Magenta のお手並みを拝見。 すでに学習済みのモデルに wav file を食わせるだけです。 google colab の ノートブック を順次実行していき、さっき作った素材ファイルをアップすると、 こんな感じに解析が完了し、結果の midi file もダウンロードできました。

    時間は、きちんと計ってなかったのですが、 ファイルのアップロードが一番かかって、 inference は速かったです。 結果の は、これまでと同様に fluidsynth で wav にして normalize をかけて、LAME で mp3 にエンコードします。
    brad-1min.magenta.mp3
    結果を聞いてみた感じ、 低音は大きな音で(確信をもって)取っていますが、 ぼくの耳には音程がずれているように思える部分がいくつかありました。 (かなり粗探しモードになってます。)

  • さて、我が WaoN で同じ素材を midi に変換してみましょう。 最初は素直に default option で試してみます。
    % waon -i brad-1min.wav -o brad-1min.waon.mid
    Format: Microsoft WAV format (little endian default).
    Subtype: 32 bit float data
    Endian type: Default file endian-ness.
    frames : 2880000
    samplerate : 48000
    channels : 2
    sections : 1
    seekable : 1
    WaoN : end of file.
    division = 46
    WaoN : # of events = 2882
    WAON_notes : n = 2882
    filename : brad-1min.waon.mid
    結果はこちら
    brad-1min.waon.mp3
    聞いてみて分かるように、メインのメロディーは取れてるけど、 伴奏が取れてない感じです。ということで、 ちょっと低音域を伸ばして(-n 4096)、 でも時間分解能は同じくらいで(-s 512)、 もうちょっと小さい音まで拾うように(-c -6)、 でも雑音はできる限り落として(-r 1)、 という気持ちでパラメータを調整して、再挑戦してみます。
    % waon -i brad-1min.wav -o brad-1min.waon_n4096_s512_cm6_r1.mid\
    -n 4096 -s 512 -c -6 -r 1
    Format: Microsoft WAV format (little endian default).
    Subtype: 32 bit float data
    Endian type: Default file endian-ness.
    frames : 2880000
    samplerate : 48000
    channels : 2
    sections : 1
    seekable : 1
    WaoN : end of file.
    division = 46
    WaoN : # of events = 2374
    WAON_notes : n = 2374
    filename : brad-1min.waon_n4096_s512_cm6_r1.mid
    結果はこちら
    brad-1min.waon_n4096_s512_cm6_r1.mp3
    さて、少しはよくなったかな。

  • この結果と Magenta の結果を聴き比べると、 Magenta は1音1音確信を持ってキーを叩ききってる感じなのに対し、 WaoN は繊細に弾いてるように聞こえますね。 WaoN倍音など雑音をかなり拾っているのに対し、 Magenta は音の選択を、これも確信を持って行ってるように感じました。 作者のひいき目を最大限行使して、今回の勝負は引き分け、 ということにしておきます(クラシックは負けたけど、ジャズは勝った、ということで)。

  • こうやって Machine Learning のアルゴリズムと対決してみると、 なんだか、画像処理における Computer Vision 対 Machine Learning の状況が頭をよぎります。 画像処理については、ぼくも仕事で少し手を出してますが、ぼく自身、 古き良き匠の技的な Computer Vision のアプローチには見切りをつけて (技能習得を諦めて、が正しいかな)、 Machine Learning の側に立っていると思っていますが、 今回は、まったく逆の立場に立たされた訳で、 その意味でもとても面白かったです。 個人的なはなしになりますが、 歴史的な経緯を抜きにしても、音(特に音楽)については、 Machine Learning 的に、結果が得られればいいじゃん、 という気分には、なかなかなり切れないので、 この分野では、古き良き匠の世界の肩を持ちたいと、今も思ってます。 同じ「音」でも、音声認識とかは、全然ブラックボックスでも 構わないのですが。