TadaoYamaokaの開発日記

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

Python から VST2 インストゥルメント(VSTi)を読み込んで音を鳴らす その3

前回、Kontakt5で生成した音色×音階のデータを使うと精度が下がったことを記載した。

その後、データクリーニングを行ったところ、精度が下がらないことがわかった。

自動データクリーニング

ACFベースのピッチ解析とSwiftF0のどちらも正解のMIDIと異なるデータを除外した。
SwiftF0がオクターブエラーを起こすことあるため、両方で誤るという条件にしている。

また、マイクで収録した音声についても、同じようにデータクリーニングを行った。
しかし、ベースの4弦でオクターブエラーが起きやすくなったため、原因を調べたところ、ACFのピッチ解析とSwiftF0のどちらもオクターブエラーを起こしていた。
オクターブエラーのデータを残すため、SwiftF0の出力ピッチを1/2、1/4した値が、MIDIの周波数に近い場合は、そのデータを残すことにした。
これにより、ベースの4弦でもオクターブエラーを起こさず正しくピッチ推定できるようになった。

マイク収録音の追加

エレキベース、エレキギター、アコースティックギターで、検証を行い、特定の弦でオクターブエラー起きる場合は、録音データを増やすことで、すべての弦でオクターブエラーを起こさずピッチ推定できるようになった。
今後も、データを増やすだけで精度が担保できるようになる。

チューナーアプリに組み込み

Kontakt5のデータとマイク収録データを合わせて、決定木を学習し、チューナーアプリに組み込んだ。

Microsoft Storeで更新版を公開した。

apps.microsoft.com

様々な楽器で安定してピッチ解析できるチューナーアプリになったと思う。

ピッチの誤差

正確なピッチに対して誤差がどれくらいあるか調べた。

正弦波を入力して、誤差(cent)を測定した結果は以下の通り。

C2以下の低音域で、最大4centの誤差がある。
C2以上では、1cent以内に収まっている。

チューナーの表示は、前のフレームと指数移動平均を取って表示しているため、低音域の誤差はある程度相殺されているはずである。

低音域の誤差を減らすには、窓長を長くする必要があるが、時間分解能は下がるため、バランスを取って決めることになる。
現状は、約340ms の窓長としている。

まとめ

前回Kontakt5生成データで精度低下が見られたが、ACFとSwiftF0の両方で誤判定したデータを除外する自動クリーニングにより精度を維持できることを確認した。
さらに、オクターブエラー対策(SwiftF0出力の1/2・1/4補正)と録音データの拡充により、各弦で安定したピッチ推定を実現した。
改善した決定木モデルをチューナーアプリへ組み込み、Microsoft Storeで更新版を公開した。