それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

dpマッチングを実装してみた

1980年以前に使われていた?dpマッチングを実装してみました。

手法について

どんなの?

あらかじめラベル付けしたテンプレート音声を用意しておき、
入力音声と書くテンプレートの類似度(近さ)を測り、最も近いテンプレートのクラスを出力する手法です。

f:id:ko_ya346:20210721224704p:plain

類似度はどうやって計算するの?

類似度の計算には、MFCC特徴量のユークリッド距離を用います。
距離が小さいほど、MFCC特徴が類似しています。

f:id:ko_ya346:20210721225324p:plain

距離計算で困ることは?

上の式は「ある1フレーム同士の距離」しか測れません。
同じ長さの音声同士なら簡単ですが、異なる長さの音声を比較したい場合、どのフレームと比較すればよいでしょう?

同じ内容音声でも、発声の長さや単語間のブランク長さが異なるので、長さが一致することはかなり稀です。

そこで、dpマッチングと呼ばれる手法を用いて、対応関係を推定しながら距離を計算することを考えてみます。

dpマッチングのイメージ

累積コストが最小になる対応関係を探し求めます。
下の図表には、文字が一致していれば0、文字が異なる場合は1を記入しています(実際にはユークリッド距離が入ります)。
こんな感じの距離行列を作ると、累積コスト最小の対応付けは左上から右下への最短経路問題へと帰着できます。 (dpについては参考リンクがめちゃ詳しいのでそちらをご参照ください)

f:id:ko_ya346:20210721231710p:plain

書き込んでいく累積コストは以下のように定式化されます(distは距離行列)。
ここで、斜めのルートは1回分移動が少なく、選ばれやすくなるのでコストを2倍しています。

f:id:ko_ya346:20210721232752p:plain

このままだと総フレームが大きい音声はそれだけで不利になってしまうので、得られた最小コストを音声の総フレーム数で割り(正規化)、この値を比較に用います。

実装は?

参考書を若干アレンジしてます。
こちらは自前のデータで行っていましたが、若干前処理が必要なので
pytorchのチュートリアルで使用しているtorchaudioのSPEECHCOMMANDSデータセットで試してみました。
まあまあ精度は出ている気がしますが、実行に時間が掛かりますね。。。

colab.research.google.com

デメリットは?

  1. テンプレートが存在する発話内容しか認識できない
    テンプレート外の単語は当然認識できないので、都度テンプレートを更新する必要があります。

  2. 音のばらつきへの対応が難しい
    同じ単語でも人によって訛りや音程が異なるので、違う単語と認識される場合があります。

上記のデメリットはテンプレートを大量に用意すれば解決しますが、
認識するたびに、入力の音声と大量のテンプレートとの類似度を計算しなければならず、とても時間が掛かってしまいます。

これを解決するために確率や尤度を用いた認識手法がこの後登場します。
乞うご期待。。。

参考

Pythonで学ぶ音声認識 機械学習実践シリーズ | 高島 遼一 | 工学 | Kindleストア | Amazon

qiita.com