未来からやってきたロボホンのアプリを開発したよ

この記事は[Tech-Circle Hands on Advent Calendar 2016](http://qiita.com/advent-calendar/2016/techcircle)の12/6の記事です。
昨日は@blackawaによる[初参加のISUCON予選敗退で手に入れたもの](http://qiita.com/blackawa/items/28cff74dbbbc1b48b737)でした。
私はISUCONの中身はしらないので、どんな感じなのかは興味あります。

というわけで、本日の記事！

# 未来がやってきた。

![未来からお届けされたロボホン](https://qiita-image-store.s3.amazonaws.com/0/19483/8bc6ef02-b04f-da4b-5fa8-3dc0934990f5.jpeg)

未来からやってきたロボットといえば**ドラえもん**ですが、現実に存在する未来のロボット。それが今日の記事の主役**ロボホン**です。

# ロボホンアプリの開発

というわけで、現実に存在する未来のロボットはドラえもんのように動いてくれないので、ロボホンのアプリケーションを作りました。

ロボホン公式サイト
https://robohon.com/

ロボホン向けアプリケーションの開発をした人は世の中に多くはないかと思うので、その時に得られた知見やハマりどころなどをこの記事で公開します。
開発環境の構築手順やRoBoHoN自体の購入維持費などは公式のドキュメントを参照ください。

# 開発環境と基礎知識

## Android

ロボホンはAndroidで動作しているので、開発環境はAndroidと同様のものを利用します。
ロボホンのコアな機能（音声認識/モーション/発話/プロジェクタの起動）などは、Androidの作法に乗っ取ってIntentを利用するので、Androidの開発経験があったほうがとっつきが良いと思います。

## RoBoHoN SDK

バージョン1.0.2を使います。
1.0.1以前は正しくテンプレートからアプリケーションが作れないのでAndroid初心者殺しです。
もし1.0.1で環境構築したけどそのままの人は諦めて作り直しましょう。

# アプリケーションの開発

作ったアプリケーションはロボホンが植物の写真をプロジェクタで投影し、その写真に映った植物の名前を答えるといった単純なクイズのアプリケーションです。

![IMG_3592.JPG](https://qiita-image-store.s3.amazonaws.com/0/19483/57615ee7-9632-8bef-7361-f5aa37c2554e.jpeg)

動作写真です。

リポジトリは以下に公開しています。
https://github.com/tech-sketch/PhotoQuiz
SDKに同梱されるjarファイルはリポジトリに含んでいません。（ライセンスがOSS的ではないのでNGと判断）


## :loudspeaker:音声関連

VoiceUIでの認識には話しかける為の慣れとロボホンがどう認識するか考える必要があります。
ロボホンの標準の認識機能や発話機能を利用するのでどういう挙動を想定する必要があるか考える必要があります。

### :timer:認識のタイミング

目が黄色い時に話しかけると認識します、認識失敗したときについ連続で話がけがちですが、ストレスが溜まるだけなので自粛しましょう。
この点は初めてロボホンを使ったときにはコミュニケーション取りづらくてツラいと思ってました。
Siriのような発話のはじめにユーザが合図（タップするとか）をするわけではないのが原因だと思っています。

### :question:言葉の認識（認識の種類）

*.hvmlというロボホン独自のxmlで認識した文字を利用します。
話した言葉は、`Lvcsr:Basic`/`Lvcsr:Kana`のいずれかの変数を通じて取得できます。
違いは以下のとおりです。

* `Lvcsr:Basic` かな漢字混じりの文字列として取得
* `Lvcsr:Kana` カタカナの文字列として取得

`Lvcsr:Basic`(かな漢字)でユーザ発話を取得すると、認識されたのが**さくら**なのか**桜**なのかプログラマからわからないし保証もしにくいという現象が発生しました。
クイズというユーザの回答と正解を比較する必要があるものには`Lvcsr:Basic`は利用するとリスキーなので`Lvcsr:Kana`を利用することで安定的に**サクラ**と取得されるようにしました。

### :question:言葉の認識（エラーコントロール）

ユーザの発話で認識失敗した場合のコントロールも必要でした。
コントロールしないとエラーコードをユーザの発話として処理が進んでしまい、
対話の中**に「ＶＯＩＣＥＰＦ＿ＥＲＲ＿ＸＸは間違いだよ、正解はサクラだよ。」**と言ったようにエラーコードを読み上げられたりします。

### :wavy_dash:言葉の認識（ゆらぎ）

アプリの中で鬼灯（ほおずき）という植物を出題しますが、回答時に「ほうずき」など人間だったら許容したくなる言葉があります。
そういう時は文字列の完全一致ではなくhvml上でnearで比較すれば良いです。
このあたりをSDKの仕組みとして提供してくれるのは楽でいいなと思います。

### :thinking:標準の機能とのバッティング

home用のhvml作成（ホームアプリから発話で起動する）時に、標準の機能を呼び出す発話と近い言葉を使うと期待したものと違うアプリが起動することもあるので、ちょっとだけ気にする必要があります。

### :frowning2:標準の機能

プロジェクタ使用時はロボホンのVoiceUIによる入力のうち、プロジェクタを操作する「前に映して」などの標準の発話入力はアプリケーションに渡されない場合があります。
ロボホンのVoiceUIはキーボード入力と異なるので、安易に考えると期待通りの動作をさせることができない場合があります。

### :sunglasses:発話とモーション

ある程度普通の言葉であれば、日本語で"漢字かな混じり"の文字列をhvml上で**"第1問目だよ"**と言った定義をすることで**"だいいちもんめだよ"**と期待通りの発話をしてくれます。すごい。
モーションは、モーターと角度を指定するような形態ではなく、ロボホンでは決まったプリセットを利用するか、発話に合わせていい感じに合わせるフラグを設定すると、それらしく動いてくれるのでソコも良いです。

## :robot:ロボホン的な制約

アプリの企画時に考えておくこと。

### :pencil: ロボホンでの手書き入力

ロボホンはAndroidですが入力が手書きなので、id/passwordなどを入力するのがかなり難しいです。
手書きの入力を前提とするとあまり良くないです。

![IMG_3594.JPG](https://qiita-image-store.s3.amazonaws.com/0/19483/517012ac-d35c-6082-a36c-577875fbea43.jpeg)

新宿と入力中。大変。（でも結構ちゃんと認識する。）

当初はOAuth2を使うようなアプリケーションを考えていたのですが、利用するために入力が面倒くさすぎるのでは？と気づいたので企画倒れにさせました。

# :sunny: まとめ

淡々と箇条書きのように書きましたがいかがだったでしょうか。

一般的なスマホのアプリケーションと異なり、不安定な入力である音声を入力として扱うのでそのあたりに配慮しながら作る必要があります。
加えて普通のアンドロイド向けの開発とは一線を画すので、いろいろ考えながらやる必要があるなと思います。

また、ロボホンは他のコミュニケーションロボット（SotaやPepperなど）と比べて非常に強力な表現力というか駆動力というものを持っていると思います。動きや声もかわいいですし。

この魅力を伝えきれる記事にはなってないかもしれませんが、是非ロボホンを目にする機会があったら色々話しかけてみるべきです、非常に驚きの有る動きをします。

ロボホンの動きの中で、個人的なオススメは**「ロボホン腹筋して」**と声をかけたときにしてくれる腹筋、と**「ダンスして」**で踊るやつです。家電量販店などでいたら声かけてみましょう。（目が黄色く光ってる時に話しかけるのがコツです！）

[![ロボホン腹筋する](http://img.youtube.com/vi/Jh8xAC8g7do/0.jpg)](https://www.youtube.com/watch?v=Jh8xAC8g7do)
ロボホン腹筋する の動画。