2018.4.22
キモヲタだけど、女子高生と会話したい!#9【マイク連携】
参考サイトのコードを丸コピして動けばいいんですけど、
まぁ当然動くわけがないんですよね。
ほら出たよ意味わかんないエラー・・・・・・。パーミッションの設定がおかしい、みたいな・・・・・・。
調べてみたところ、どうやらAndroid6.0以降はマニフェストファイルに書き込むだけじゃダメで、ユーザーパーミッションは実行時に手動で確認しなくてはいけなくなったみたいで。
んで、
その書き方が非常に鬱陶しい感じになってるんですね。
とりあえず原因が分かったら該当するコードを書き足せばいいじゃないかってだけの話なんですけど
まあ、コピペするとエラー吐くよねって話です。
便利そうなライブラリとかあるみたいなんで使ってみたんですけど、結局ダメくさいんですよね・・・・・・。これだからこういうバグは嫌いなんだよなあ・・・・・・もっと簡単に実装できるようにしてほしいぞなもし(・ω・)
で、いろいろ探したところ
このライブラリが非常に使い勝手が良かったです。これはちゃんと動きました。
GitHubのページはこちらです。
これで動くようになりました。ついでに、起動すると
なんか勝手に録音が開始されるというのもわかりました。
onCreate内から呼び出してるわけではないのになんでだろうとは思うんですが、まぁ動かないよりは幾分かはマシなので原因をつきとめていこうと思います。
と思いながらコードを読んでたら
onResume()から呼び出してましたね。ここで呼び出すってことは
画面が表示される毎に呼び出されるということです。
ボタン押下をハンドラとするように書き換えますかね。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
RuntimePermissionChecker.requestAllPermissions(this, REQUEST_CODE);
changeButtonToStart(findViewById(R.id.start))
}
protected fun changeButtonToStop(button: Button){
//スタートボタンをストップボタンに変える
button.setOnClickListener{
stopListening()
changeButtonToStart(button)
}
button.setText("STOP")
}
protected fun changeButtonToStart(button:Button){
button.setOnClickListener{
startListening()
changeButtonToStop(button)
}
button.setText("START")
}
書き換えました。文字列をハードコーディングするなって警告が出てますが無視します(笑)
とりあえずonCreateでボタンにStartイベントを付与し、それがクリックしたらStopイベントに書き換えるって感じの動きができました。
次は実際に喋った内容を解析させ、それをHelloWorldとか表示してるあの部分にぶち込む操作を入れてみましょうか。
ここで気になるのは、エミュレーターのマイク入力ってどうなってるの?ってことですね。まぁ、どっちにしろいずれは実機デバッグやんなきゃいけないので実機で動かせば済む話ではあるんですけど。
とりあえず、その部分の実装をしてみましょうかね。
protected fun displayResult(result:String){
//結果を表示する
findViewById<TextView>(R.id.result).setText("結果:"+result)
}
細かい説明は省きますが、結果を生成してるところからこんなのを呼び出します。
はい。できました。
さて、ここで一つ問題なのが
明らかに英語の辞書を参照しているので、日本語にはうまくマッチしませんが、エミュの言語に日本語を加えれば問題ないようです。
次の課題としては、これをオフラインでやってもらうことですね。速度が命ですからね。波形データなんて送信してたら時間がかかってしまいます。
ただ、これはエミュではできなさそうなので実機デバッグの際に試すことにします。とりあえず一行くっつければいいだけの話なので。
さて、音声認識ができあがりましたね。機能としては出来上がったし、動くことがわかったので、再びReact nativeに戻って、こいつをフレームワークで使えるようにこねくり回しましょうかね。
ネイティブコードなんてできれば触らないほうがいいわけですしね。