WaoN で Google Magenta に挑戦
ちょっと長いですが、自分の書いたプログラムでグーグルに戦いを挑んで、 かなり善戦したぜ
という内容です(かなりバイアスかかってます)。 結果は、次の3つのオーディオファイルを聞けば分かります。 オリジナルが左、真ん中が Google Magenta の結果、 右がぼくの書いた WaoN の結果です。
オリジナル magenta WaoN 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)
ここに引用されてるブログ記事「Onsets and Frames: Dual-Objective Piano Transcription」読んでみると、彼らがご自慢の TensorFlow でやってることは、 オーディオファイルから MIDI ファイルを生成するという処理、 いわゆる採譜 (transcription) で、 WaoN がやってることそのものでした。 これを見て、天下のグーグルさんがどれほどのものか知るいい機会だぜ、 と思ったわけです(この時は)。
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
ということで、まずは 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
結果は、以下のようになりました。
ショパン:
ground trugh magenta WaoN chop25-3-ground.mp3 chop25-3-ours.mp3 chop25-3-waon.mp3
モーツァルト:
ground trugh magenta WaoN moz331-ground.mp3 moz331-ours.mp3 moz331-waon.mp3
善戦しているな、というのは作者のひいき目が入ってると思いますが、 結果のできは明らかに Magenta の方がいいですね。 まぁ、ブログには使っているものは、たくさんある結果の中から きれいなものだろうとは思いますが。
ここでちゃぶ台をひっくり返しますが、 ぼくはショパンとかモーツァルトが 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-dl と mplayer と sox を使って、以下のように1分の長さの wav file を作りました。
brad-1min.mp3
% 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
聞いてみると分かる通り、ドラムなどの入ってないピアノソロで、 でも使ってる音域が低音寄りで、普通に 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 的に、結果が得られればいいじゃん、 という気分には、なかなかなり切れないので、 この分野では、古き良き匠の世界の肩を持ちたいと、今も思ってます。 同じ「音」でも、音声認識とかは、全然ブラックボックスでも 構わないのですが。
ランニングコースの積雪状況の確認を兼ねて久しぶりに走る
4、5年ぶりの大雪で、2月は全く走れてなかった。 1月も4走なので、今年5走目。 久しぶりなのと、靴は雪道を考えてトレッキングシューズを履いたので、 のんびり走ってくる。河川敷を走ってるんだけど、当初雪が深くて誰一人 立ち入らない状態で、足跡すらないままだったけど、ここの所の暖かさで、 やっと下流の方は幅50センチくらい地面が出てて、走れそうだった。
audio processing と machine learning
2009年に帰国したぼくを雇ってくれた今の会社では、これまで画像処理を中心に 研究開発的なプログラミングをやってきた。 それが、ここ半年から1年前から、機械学習に軸足を移して 仕事をしてる。(もちろん、これ以前にも手は出していたが。) この間、プログラミングの環境は python がメインになり (といっても、個人的にはこれまでも perl や ruby よりも python が 一番好きで使ってたが)、 TensorFlow を勉強して、Keras を勉強して、PyTorch を勉強して、 という風に世間の皆さんと同様慌ただしい学習体験だった。 (この調子で、まだしばらく、いろいろ出てくるんだろうな。)
そういうこともあり、deep learning 関係の情報収集は継続的にやってて、 つい先日も、次のツイートを見つけた
from https://twitter.com/fjord41/status/963165268330536960
引用されてたのは、以下の magenta のブログ おもしろい、というか WaoN がやってることそのままじゃないか。WaoN と対決させてみようかな。
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
この magenta のプロジェクト、colab に Jupyter Notebook も公開してる。
colab notebook: Onsets and Frames: Dual-Objective Piano Transcription
ふとググったら、なんかパラメータいっぱいあってもっと調整できそうだけどドキュメントがないので星二つ
とか (cf. SF の User Reviews)、WaoN がどうやってるのか知りたくてソース読んだけどゴチャゴチャしててわかんね
とか (cf. stackoverflow)、 なんか申し訳ない気分でいっぱいだし、 中身をきちんと説明することの需要もあるのかな、と思ったので、 Jupyter で何かやってみようかな。 phase shift で周波数を補正してるところは neat だと思うし。
そんなことを思って、自分の環境にも fluidsynth を入れてみたが、 これ、anki の solfege プロジェクトにも使えるね。 (この件については、また改めて書こうと思う。)
そんなこんなで、気づいたら日曜も終わってしまったので、 「TensorFlow vs WaoN」も、「WaoN の中身」も、また今度。
書いて投稿するハードルを下げる、をモットー(言い訳)に!
久しぶりに走ってきた
runkeeper: 7.62KM, DURATION 47:45, AVERAGE PACE 6:16, CALORIES BURNED 605
記録を見たら、6月1日に 6km 走って以来だった。
その日が、その直前に買った bare foot 系のシューズ TESLA BARETREK BK30 での走り初めで、たしかその後、普段と違う膝から下の筋肉痛になった。 それが理由でもなく、単に習慣になってない故に、 こんなに間が開いてしまった。
amazon.co.jpで買った本、とってきた。
まだ読んでない。