音声認識の特徴量に雑音はどれくらい混ざっているのか。

 現在の音声認識は背景雑音にものすごく弱い。人間が気にしないような小さなBGMでも音声認識にとっては致命的である。本日の日記も雑音の話である。

 先日、自動音声認識というのは、特徴抽出部とデコーダ(音響モデル・言語モデル)からなっているのだということを書いた。では、このどちらが強く雑音の影響を受けるのか。両者は直列につながっているので、答えはもちろん「両方」なのだが、雑音対策をする上でどちらを直すべきなのかということに関する個人的な見解を書きたい。

 バグをとるときには大抵途中の出力を見ていろいろと確かめてみるものだが、自動音声認識の中間出力を「聞いて」確かめることは可能だろうか。そう思って特徴抽出部で抽出した特徴量を強引に聞ける形式に逆変換してみた。音響信号から特徴量への変換は可逆ではないので、強引な逆変換をせざるを得なかったのだが、とにかく聞けるかたちにはなっていると思う。また、音声らしく復元することよりも、「特徴量を可能なかぎりそのまま聞く」ことを重視した(なお、使用した特徴量はMFCCではなくFFTケプストラムである。12次元+パワーである。フレーム長25ms、フレーム周期10msである。音源は8kHzサンプリングである)。この音声を聞いて「何を言っているのか」が分かれば、特徴量に音韻性が残っていることになる。

 まず、予備実験として、こんなことをしてみた。(雑音の乗っていない)私の声を特徴量に変換して、逆変換した音声を聞いてみた。その結果、(自分の声だから聞きやすいのかもしれないが)何を言っているのかだいたい聞きとれた。つまり、この特徴量には音韻情報が保持されており、音響信号から特徴量への変換方法は悪くないことが分かる。また、逆変換の方法もそれほど悪くないことが分かる。

 問題はこの先である。雑音を混ぜた音声を特徴量に変換して、それを聞くことができるかどうかである。実際に、音楽を私の声に混ぜて、特徴量に変換し、逆変換して聞いてみた。二種類の信号対雑音比(SNR)で試してみたのであるが、どちらの音韻性もほぼ保持されているように聞こえた。SNRは自動音声認識が正常に動作しないくらいに設定したので、実験の前には滅茶苦茶な音が聞こえてくるのではないかとも思っていたのだが、それなりにまともな音声だった。ただし、雑音もちゃんと聞こえている。とにかく、雑音が乗っていても特徴量には音韻性が充分に保持されていた。

 要するに、雑音があったとしても特徴量には音韻性が保持されているのだから、雑音対策をデコーダの部分でおこなうことも可能なはずだということである(無論、特徴抽出部でおこなってもかまわない)。以前私は特徴抽出の前に雑音低減をしていたのだが、今、雑音対策をするとしたらデコーダに手を入れたい。すでに特徴抽出部では充分に雑音が削られているように「聞こえた」からである。

 ところで、「特徴量の音」を聞いたことのある人は少ないと思うので、聞いてみると面白いと思う(なお、エンコードの都合か何なのかよく分からないが、動画にする際に音質は多少劣化している)。

 例によって、ソースコードと音声ファイルをSkyDriveに置いておく。また、動画内で使った音楽はおそらく雑音としては優秀だと思うので、使いたい方はご自由にお使いください。

D