はじめに
フーリエ変換で音程を抽出しようと思っていて精度を上げようと思ったら、時間遅れがひどくなる事に気づき、ギターのデジタルチューナーってどうなってんの?となり、調べていったら、YINというアルゴリズムに行きつきました。
ピッチ検出で非常によく使われているアルゴリズムで、信号をずらして差分をとる事によって、周期性が高いラグ(周期)を取得して、時間を割って周波数を計算するらしいです。
pYINは、そのYINを拡張したもので、動的に閾値を割り振り、ピッチ候補を確率化してとらえ、精度を上げたもののようです。
ちょっと説明が適当ですが、気になる方は調べてみてください。
周期性を計算すると言えば、自分が取得している特許でもできるので、特許手法でピッチ検出に挑戦してみた結果を報告します。
実験したけど
ギターの音で実験してみたり、自分の声で実験してみたりしたのですが、公開するには心もとないので、シミュレーションデータで比較結果のみ、記事にしたいと思います。
試してわかったのですが、pYIN自体かなりよくピッチ検出できるので、いじわるな条件で比較していきます。
pYINの実装について
librosaのpYINを特に何も工夫をせずに使いました。
便利ですね本当に。
自分の特許手法について
自分の特許手法(bedcmm)は、周期候補ごとの信号差分の最小値に着目し、外れ値(インパルスノイズ)の影響を受けにくい形で周期性を評価するアルゴリズムです。
下記の記事に基礎的な手法の計算をまとめています。
音声の信号に対して、正の値のみの成分と、負の値のみの成分を取得して、それぞれに周期性を計算していきます。
(正の値のみので計算したりしてもできるんですけどね。)
二つのシミュレーション
息からの発声
これは、pYINが得意としている領域です。
音程ってどこからが音程としてとらえられるか微妙で、吐息に混じって音程が徐々に聞こえるようになります。
ランダムノイズから徐々に音程を持つ信号に変化していくシミュレーションです。
シミュレーションしてみてどの程度早くその音程をとらえられるかチェックしたいと思います。
ランダムなインパルスノイズを加える
これは、自分の特許技術が生きる領域です。
周期分の差の信号を比べて最小値を取得する手法の為、インパルスノイズには強い手法となっています。
結果
息からの発声
pYINでは、先にピッチが安定して検出できている事がわかります。
ランダムなインパルスノイズを加える
インパルスノイズが集中して起きると、pYINでもピッチが取れていない事がわかります。
考察
息からの発声の対応に関しては、やはりpYINの方が強いです。
乱数の具合によって結果変わるのですが、pYINの方が早く設定したピッチを検出します。
これは、早く歌声の音程を検出し、歌声の最後までピッチが検出できる事を意味します。
シミュレーションだと、そんなに変わらなさそうですが、実際の歌声だともっと差がでます。
しかし、ランダムなインパルスノイズを加えた場合は、特許手法であるbedcmmの方が良い結果となりました。
やっぱりカラオケ用途なんかより、工場なんかで何かをたたくような音がする環境の中でのピッチ検出に強いと思っています。
定性的な評価ではありますが、手法ごとの得意領域の違いは確認できたと考えています。
おわりに
特許実装の方も、検出のスコアをつけたりいろいろしたのはしたので、詳しい説明模した方がいいかと思いますが、何か反響があったらしたいと思います。
また、閾値の設定はまだ開発の余地があり、公開していない部分も少しあるので、ご興味ある方は、反応ください。
実データでの検証にも興味があるため、該当する課題をお持ちの方はぜひご連絡ください。
github
続編の記事



