Androidで実環境に頑健な連続音声認識をさせたい


androidで音声認識をさせる場合、RecognizerIntentやSpeechRecognizerを利用するパターンが多いと思われます。
しかしRecognizerIntentはマイクの絵が表示されているダイアログがポップアップして鬱陶しいですし、それが嫌な場合はSpeechRecognizerを使うでしょう。
SpeechRecognizerクラスは、Androidの音声認識用に用意されているServiceにアクセスするためのクラスで、これはアプリケーションのメインスレッドで呼びたしたり、そもそもオフラインで動かなかったりするので、利用シーンが限られてしまいます。
じゃあどうするのか、すごいものがあります。

Julius

大語彙連続音声認識エンジンです。日本語の言語モデルもあるので、日本語が使えます。日本語の大語彙連続音声認識ができるものは他にないのではないでしょうか。音響モデルももちろん付いているのですが、JNAS(新聞記事読み上げ音声コーパス)から音響モデルを作成されたものなので、実環境には使いづらいです。しかしJuliusは高い汎用性を持たせるためにこの音響モデルや言語モデルを取り替えることができるので、自前で用意したものを使うこともできます。とはいっても、音響モデルを用意するのは大量の発話データが必要なので大変むずかしいです。
数万語彙の連続音声認識を一般のPC上でほぼ実時間で実行できます。一般のPC上で実行できるという話ですが、C言語で書かれているのでiOSでも動くし実際にサンプルアプリがあります。Linuxでも動くので、ということはつまりAndroidでも頑張ったら動くらしいです。実際頑張って動かした例もあるようです。
英語のモデルはないので、英語に対応したい場合は用意しなければなりません。また、実環境(ハンズフリー音声認識でかつ、拡散性雑音がとても多い場合)に用いるには、高精度な雑音抑圧を必要です。実際、実環境での音声認識精度はかなり難易度が高く、高い精度で製品に応用しているのを見たことがありません。

PocketSphinx

英語の音響モデル言語モデルを用いた連続音声認識エンジンで、Android用のサンプルアプリもあります。これはかなり優秀で実環境で利用する想定で開発されていて、音響モデル、雑音抑圧も頑健に動作しています。自前の雑音抑圧などいらないという言及もされています。
でもアプリを動かすと分るように連続音声認識はもちろん、keyword spottingやgrammar searchも可能です。実際雑音環境下でもかなりの精度で認識が可能でした。
これもC言語で書かれており、Androidに組み込むにはAndroidNDKが必要になってきます。
具体的な組み込み方法は気が向いたら書きます。
これをServiceでバックグラウンドで動かすと、”OK google”のようなボイスコマンドでアプリが操作できるようになるわけです。
ただ注意しないといけないのは、とあるアプリでPocketSphinxを動かしている間は他のアプリケーションでマイクが使えません(正確には同じアプリからもSpeechRecognizerやRecognizerIntentなどは使えません)。つまりこれを動かしているときは"OK google"や様々なアプリでの音声検索を犠牲にするというわけです。バックグラウンドで常に動かして"OK google"的な使う方をするとデメリットもあるので、使いどころは難しいかもしれませんが、アプリが動作中にのみ動作させることで有用に使えるかもしれません。

 おわりに

これら2つとも音声認識処理部分は基本的にはにたようなことをやっていますが、音声(残響が畳み込まれた)と雑音が混じった入力信号から雑音抑圧するフェーズはJuliusではやっていません。故に環境雑音や、ハンズフリーによる残響特性が畳み込まれた音声を入力すると精度が低くなるのです。Juliusは汎用性は高そうですが、実環境に実用化するとなると大変な雑音抑圧処理や、音響モデルの作成が必要になります(逆に汎用性低い?)。
  |l、{   j} /,,ィ//|     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  i|:!ヾ、ノ/ u {:}//ヘ     | あ…ありのまま 今 起こった事を話すぜ!
  |リ u' }  ,ノ 
,!V,ハ |     < 『おれは奴の前で階段を登っていたと
  fト、{ル{,ィ'eラ , タ人.    |  思ったらいつのまにか降りていた』
 ヾ|宀| {´,)⌒`/ |<ヽトiゝ   | 催眠術だとか超スピードだとか
  ヽ iLレ  u' | | ヾlトハ〉.   | そんなチャチなもんじゃあ 断じてねえ
   ハ !ニ⊇ '/:}  V:::::ヽ. │ もっと恐ろしいものの片鱗を味わったぜ…
  /:::丶'T'' /u' 
_ /:::::::/`ヽ \____________________