ひよっこゲームブログ

なにもかも初心者のひよっこがゆったりと何かする

Androidの音声認識を使ってみたけど上手くいかなかった話

[ 解決 ] 停止時に

speechRecognizer.setRecognitionListener(null)

 

//---------

 

Android音声認識を使ってみたという日記

結果からいうとあんまり上手くいかなかった

(実用的じゃない気がする


ここのブログを参考にした

http://kivantium.hateblo.jp/entry/2016/02/29/191901

 

あとAndroidDeveloper

https://developer.android.com/reference/android/speech/SpeechRecognizer


SpeechRecgnizerを利用して音声認識用のクラスを作ってみたんだけど

外部からstartListening() を呼び出したあとにバックグラウンドに行くと

音声準備処理し終えたあとonRmsChanges() の処理が永久に続いてどっかいった

(なんか1回だけ上手くいったけど奇跡的で分からんかった)

 

呼び出し元のActivityのonStop() で制御したりできないかなーと思ったけどダメ

 

なんかライフサイクルに振り回されている気がするんだよなー・・・

どこかの実装が間違ってるのかなぁ

 

ちなみにForegroundServiceで実装するしないに関わらずどっかいった

 


南無三

 


そもそも音声認識を実行する時間とか一切設定できなくて

(昔はできたっぽいんだけど、現在はその操作自体が非推奨でRecognizerIntentのリファレンスに「使うな」って明記されている)


しかも 認識開始 -> 認識終了(動作終了) -> (仕方ないのでdestory()の後に再起動させる)

みたいな実装じゃないと数秒しか動かないし

(これは音声認識できたできないに関わらず終了する)


上記の実装をすると音声認識開始時にAndroidのシステム上

録音開始音が鳴るんですよね、うるさいねーん

 

そのためstartListening() の前にシステムの音量を0にして

onReadyForSpeech() が呼ばれた時点でシステム音量を復帰させる

みたいな処理じゃないといけない


そもそもGoogle的にはこの辺スパイアプリの実装っぽいので

あまりやらせたくないみたいだしー・・・


音声認識の呼び出しとかはぱっとできるし、認識の制度はいいんだけど

実装してみた感じではあまり実用的ではないかなぁみたいな・・・

 

実際使ってる人も少ないし

アプリがバックグラウンドにいっても音声認識させたいみたいな需要がない

 


設計的には

1.SpeechRecgnizerの音声認識処理を呼ぶ

2.音声認識の結果を返す

3.結果から文字列のマッチでパターンを分けて処理

でコールバックでどうにかしたいんだけど

 

その場合はSpeechRecgnizerのリスナーでonResult()に入った時

初めて動作させないといけないのでObserverパターンがいいのかしら

 

となったがデザインパターンとか全然知らんかったんで

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩

https://www.amazon.co.jp/dp/4797327030/ref=cm_sw_r_tw_dp_U_x_I3E9Db9MTMA6C

これを買った。読む本だけが増えていく


動作のトリガーさえうまく掴めれば

LiveDataとかDataBindingとかその辺でうまくできそう


コールバックについて調べていたら、RxKotlinなるものがあることを知った

https://github.com/ReactiveX/RxKotlin

JVMしたいらしくて、名前の通りRxJavaのKotlin版みたい

 


学ぶことが多すぎるっぴ