はじめに
ピッチ検出アルゴリズムを比較するとき、最終的な推定周波数だけを比較することが多いと思います。
しかし、
- どの周期候補が存在していたのか
- アルゴリズムは何を評価しているのか
- なぜその周期を選んだのか
といった内部の様子を見る機会はあまりありません。
以前、単一フレームの評価関数を可視化する「Pitch Detection Lab」を作成しました。
今回はその発展版として、時間方向の追跡も含めて可視化できる「Pitch Tracking Lab」を作ってみました。
比較したアルゴリズム
今回比較したのは以下の手法です。
- YIN
- pYIN
- bedcmm
- bedcmm + Bayes Tracking
- bedcmm + Viterbi Tracking
最終的な推定結果だけでなく、各時刻における周期候補の評価値や、アルゴリズムが選択した経路も確認できるようにしています。
ピッチ推定結果の比較
各アルゴリズムによるピッチ推定結果を同時に表示できます。
同じ音声を入力しても、追跡方法の違いによって結果が異なることがあります。
周期性評価関数のヒートマップ
各フレームの評価関数を時系列方向に並べ、ヒートマップとして表示しています。
その上に、
- bedcmm
- Bayes Tracking
- Viterbi Tracking
が選択した周期を重ねて表示することで、
「どの候補を選んだのか」
を視覚的に確認できます。
同様に、YIN 系についても、
- YIN
- pYIN
の選択結果を重ねて表示できます。
同じ評価関数でも、選ばれる周期は異なる
単一フレームだけを見ると、複数の周期候補が存在していることがあります。
そのような場合、
- Bayes Tracking は前後のフレームとの連続性を考慮する
- Viterbi Tracking は全体の経路を最適化する
- pYIN は確率的なモデルを用いて候補を選択する
ため、同じ評価関数から異なる周期を選ぶことがあります。
単純に「何Hzが出力されたか」だけを見るよりも、
「なぜその周期が選ばれたのか」
を見ることで、各アルゴリズムの特徴が分かりやすくなります。
Current Frame Analysis
任意の時刻を選択すると、その時刻の評価関数を表示できます。
ヒートマップだけでは見えにくい細かい違いも確認できるため、
- なぜオクターブ誤りが起きたのか
- なぜ異なるアルゴリズムが別の周期を選んだのか
といった解析にも利用できます。
おわりに
ピッチ追跡アルゴリズムの性能比較では、最終的な推定周波数だけに注目しがちです。
しかし、
「アルゴリズムは何を見て、その周期を選んでいるのか」
を可視化すると、各手法の違いが見えてきます。
今回作成した Pitch Tracking Lab が、ピッチ検出・ピッチ追跡アルゴリズムを理解するための一助になれば幸いです。
GitHub リポジトリやデモページへのリンクは記事の最後に掲載しておきます。
おわりに
作っている途中で、音がない区間で、bayesやviterbiを使ってピッチ推定を行うと、負の周波数が、出力される事もある事がわかりました。
パラメータ絞っているとあまり出ないんですけどね。
おそらく、サンプル間の補正をしている中で間違えて出てくるものなのですが、今後値が出力されないように修正したいと思います。
サンプル間の補正の間違いだったので修正して公開しました。
新しいバージョンのご利用お願いします。



