2018.4.19
キモヲタだけど、女子高生と会話したい!#8【絶望のネイティブアプリ】
ということで、妥協に妥協を重ねたわけではないのですが、一旦ネイティブでコードを書いて、うまくいけば移植というか、自分でブリッジさせるみたいな手を取ることにしました。
音声認識の部分さえ上手くいけば、あとはインターネット上にはびこるAPIにコードを投げて結果を受け取ってごにょごにょするだけですし。
ほんとこの連載はなんだったのかって感じですね
とはいえ、これが実装できれば、どんな高度なアプリでも実装できる目処が立つということなので頑張っていきましょう。フレームワークは使うのそんな難しくなさそうですしね。応用すれば自分でCordovaプラグインも書けるかも知れないし。とりあえずネイティブで書けることが大事なわけですね。
目指す実装としては、マイクを通して入力された音声が、Android標準装備のSpeech Recognizerでしたっけ、あれに「オフラインで」通してテキストで結果を受け取ることができれば完成です。
さて、ネイティブコードの書き方なんてとっくの昔に忘れてるので
昔書いた記事とか参考にしながら書いていきますかね。
今回は画面遷移が必要ないので、設置するのはボタン1個とテキストボックス1つぐらいでよさそうですね。とりあえずまず画面だけ作っちゃいますかね。とりあえずAndroidStudio3をインストールしましてだ。
まず、PHP漬けだったためjavaとかkotlinを忘れてると思われるので、勘を取り戻すため、ボタンを押してなんか反応するコードを書きましょう。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toastButton: Button = findViewById(R.id.start)
toastButton.setOnClickListener {
Toast.makeText(this, "テストメッセージです", Toast.LENGTH_SHORT).show()
}
}
}
とりあえずこんな感じのコードになりました。startというIDのボタンを押せば、「これはテストメッセージです」というポップアップみたいなやつが出てきます。
まぁこんな感じです。Toastとかいうよくわかんないクラスを使ってるんですけど、たぶんこのポップアップを使うのがToastなんですかね。サンプルコード丸コピなんでいまいちわかってないです(笑)
一応このコードを読み解いて見ると、最初の数行は最初からなんか書いてあったやつなんでちょっとわからないんですけど、Bundle型のなんかを受け取ってるんですかね。とりあえずそいつを使ってこの画面をCreateしてるっぽいですね。まぁこんなのは今のとこ気にしなくていいんじゃないですかね。
val以降が僕が書き加えたやつです。Rってのがおそらくアクティビティの構成要素を統括する物体なんですかね。んで、idがstartのものをfindViewByIdでとってきて、Button型のtoastButtonにぶちこんであげます。
で、それにクリックリスナーを付与するわけですね。
さらっと書いていますがKotlinの文法をあんま覚えてないので、なんでここ中括弧でくくってるのかわかんないですね。ラムダですか?
絶対違うよな
調べたところ、用語的にはSAM変換とかいうものが暗黙的に行われているみたいですね。とりあえずリスナーをくっつけたかったらこんな感じで書けばいいみたいですね。
次に、ボタンを押したらHelloWorld!の部分を任意の文字列に書き換える動きを見せますかね。見た目わかりやすくするためにカウンタにしますか。
class MainActivity : AppCompatActivity() {
companion object {
var counter = 0
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toastButton: Button = findViewById(R.id.start)
toastButton.setOnClickListener {
Toast.makeText(this, "テストメッセージです", Toast.LENGTH_SHORT).show()
val textbox: TextView=findViewById(R.id.result)
MainActivity.counter=MainActivity.counter.inc()
textbox.setText("カウント:" + MainActivity.counter)
}
}
}
ケツに色々くっつけました。まぁ処理内容は読んで字の如くというか。
ただ個人的に不可解なのが、
setText内でインクリメントができないという点ですね。色んな書き方を試したんですが、どーにも反映されず・・・・・・。
これはそのうち知ることができればいいかなということで諦めて素直な書き方になりました。ちなみにkotlinにはstatic変数がないみたいなので、コンパニオンオブジェクトとして定義するそうです。意味は正直理解してないのですが、とりあえずstaticな変数を使いたくなったらこう書けばいいんだ、って今のとこは思うことにします。
これで最低限必要な動きが確認できたので、ここからマイクを使ったアプローチをしたいところですね。問題なのはエミュレータでどうやってマイク動かすんだろって感じなんですけど。
実機で動かしてもいいんですけど、USBケーブル持ってないんだよね・・・・・・笑
とりあえず次回、マイクとの連携を図ってみますか。音声区間検出が必要なのかどうかがわからないので、とりあえず実装だけしてみて様子を見ます。