前回、Kontakt5で生成した音色×音階のデータを使うと精度が下がったことを記載した。
その後、データクリーニングを行ったところ、精度が下がらないことがわかった。
自動データクリーニング
ACFベースのピッチ解析とSwiftF0のどちらも正解のMIDIと異なるデータを除外した。
SwiftF0がオクターブエラーを起こすことあるため、両方で誤るという条件にしている。
また、マイクで収録した音声についても、同じようにデータクリーニングを行った。
しかし、ベースの4弦でオクターブエラーが起きやすくなったため、原因を調べたところ、ACFのピッチ解析とSwiftF0のどちらもオクターブエラーを起こしていた。
オクターブエラーのデータを残すため、SwiftF0の出力ピッチを1/2、1/4した値が、MIDIの周波数に近い場合は、そのデータを残すことにした。
これにより、ベースの4弦でもオクターブエラーを起こさず正しくピッチ推定できるようになった。
マイク収録音の追加
エレキベース、エレキギター、アコースティックギターで、検証を行い、特定の弦でオクターブエラー起きる場合は、録音データを増やすことで、すべての弦でオクターブエラーを起こさずピッチ推定できるようになった。
今後も、データを増やすだけで精度が担保できるようになる。
チューナーアプリに組み込み
Kontakt5のデータとマイク収録データを合わせて、決定木を学習し、チューナーアプリに組み込んだ。
Microsoft Storeで更新版を公開した。
様々な楽器で安定してピッチ解析できるチューナーアプリになったと思う。
ピッチの誤差
正確なピッチに対して誤差がどれくらいあるか調べた。
正弦波を入力して、誤差(cent)を測定した結果は以下の通り。

C2以下の低音域で、最大4centの誤差がある。
C2以上では、1cent以内に収まっている。
チューナーの表示は、前のフレームと指数移動平均を取って表示しているため、低音域の誤差はある程度相殺されているはずである。
低音域の誤差を減らすには、窓長を長くする必要があるが、時間分解能は下がるため、バランスを取って決めることになる。
現状は、約340ms の窓長としている。
まとめ
前回Kontakt5生成データで精度低下が見られたが、ACFとSwiftF0の両方で誤判定したデータを除外する自動クリーニングにより精度を維持できることを確認した。
さらに、オクターブエラー対策(SwiftF0出力の1/2・1/4補正)と録音データの拡充により、各弦で安定したピッチ推定を実現した。
改善した決定木モデルをチューナーアプリへ組み込み、Microsoft Storeで更新版を公開した。