TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

CQT+GBDTで和音構成音を解析する その2

前回、CQTを特徴量として、GBDTで和音の構成音を判定する処理を実装し、ピアノの単音色で倍音誤検知することなく構成音を判定できることを確かめた。

今回は、Kontakt5に含まれる、弦楽器(バイオリン、ビオラ、チェロ、コントラバス)とギター(エレキ、ジャズ、ナイロン、ロック、単音弾き用)の音色を加えて、モデルを学習した。

評価結果

テストデータ840フレームで評価したF1は以下の通り。

音源 共通モデル ピアノ専用モデル
全体 0.810 0.776
ピアノ 0.794 0.826
弦楽器 0.822 0.754
ピアノ+弦楽器 0.792 0.756
ギター 0.824 0.781
ピアノ+ギター 0.791 0.752
弦楽器+ギター 0.839 0.797
ピアノ+弦楽器+ギター 0.807 0.755
弦楽4楽器すべて(20フレーム) 0.695 0.635
ギター5音色すべて(25フレーム) 0.874 0.846

共通モデルは、ピアノ単音色の場合は、F1が低下しているが、弦楽器、ギターは、ピアノで学習したモデルよりも、F1が高くなっている。

音色専用で学習した方が、精度が高くなることを示している。

しかし、共通モデルでも、弦楽器、ギターについては、ピアノ専用でピアノを評価した場合と同じくらいのF1になっており、一定の精度は満たしている。

テスト

弦楽器

Cメジャー(C–E–G)を時系列解析した結果は以下の通り。

パート 音例 MIDI
Violin 1 E5 76
Violin 2 C5 72
Viola G4 67
Cello C3 48
Contrabass C2 36

C2、C3、C5は検出できているが、G4、E5は検出できていない。

構成音に含まれないC4が検出されており、オクターブエラーが発生している。

訓練データのボイシングのパターンを増やすなど、改善が必要である。

ギター

共通モデルで、ギターのオープンコードC(C3 – E3 – G3 – C4 – E4)を時系列解析した結果は以下の通り。

C3 – E3 – G3 – C4 まで正しく判定できている。

E4は、検出されていない。

オクターブエラーを抑えるため、負例を学習しているため、オクターブ下に構成音がある場合は、検出されにくくなっている。

オクターブエラーと構成音の偽陰性のどちらを優先するか、トレードオフになるため、完全に判定するのは難しいかもしれない。

まとめ

ピアノ・弦楽器・ギターをまとめて学習した共通モデルは、全体F1=0.810となり、弦楽器・ギターではピアノ専用モデルを上回る精度を示した。

実音源の解析では、弦楽器やギターの構成音を概ね検出できた一方、高音域の取りこぼしやオクターブエラーが確認された。

今後はボイシングの学習パターンを増やし、オクターブエラー抑制と構成音の偽陰性とのトレードオフを改善したい。