RoBoHoNに 英語のスピーキングの宿題を手伝ってもらう

先日、モバイル型ロボット電話 RoBoHoN が発売一周年を迎えて、英語・中国語対応をふくむ新SDKが [リリース](https://robohon.com/news/170525.php) されました。

<img width="118" alt="party_cracker.png" src="https://qiita-image-store.s3.amazonaws.com/0/121307/2a52fd1e-81a9-e8ed-5177-05e855a9fecc.png">


一方、私ごとですが、先日、こどもの習い事の英語のレベルがめでたく上がりました。

ともない、
「スピーキングのセクション、おうちでも **3回** くりかえして読んできてくださいね！（先生の笑顔）」
という、親子どもどもに　”回数をこなすだけでおざなり”　の未来がみえる感じになりました。

<img width="52" alt="textbook_eigo.png" src="https://qiita-image-store.s3.amazonaws.com/0/121307/d473d9f4-1c15-1960-dfb2-1ba78d949db1.png">


そこで、今回は、英語が判る・話せるようになった、家族の一員（「長男（公式設定・5歳男児）」）の RoBoHoN にも宿題を手伝ってもらうことにしました。
「オウム返し実装」をベースに、利用イメージは下記の図のとおりです。

<img width="676" alt="figure1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/121307/8be32b81-0f51-1b9d-94f2-41e7ccd4b2bf.png">

ロボットと会話するために必要な**「明瞭に」「ある程度ゆっくりしたスピードで」「正確に」**発語することで、英語学習の習熟を狙います。


# 環境です
Windows 7 SP1 64bit
Android Studio 2.3.1
RoBoHoN_SDK 1.2.0
RoBoHon端末ビルド番号　01.08.00

# ロボホンアプリのアイディア出しについて
先日から、『RoBoHoNの出力を受け止める人間側の五感』を軸に下の検討や実装をしています。

| 感覚       |ロボホン実装 |
|:-----------------:|:--------------------|
|**触覚**| [RoBoHoNと一緒におおきなかぶを抜く](http://qiita.com/n_ueh/items/949c7275510653d0562b)　 | 
|**視覚**|[RoBoHoNで 『手旗信号版 嵐が丘』 もどきの実装](http://qiita.com/n_ueh/items/332b24dc4e5c1d65044c)　 | 

今回は（新SDKの評価と同時に）RoBoHoNと「**聴覚**」というお題でアプリ実装を考えました。

#「聴覚」とロボホン
**「聴覚」単独**　において、「動く人型ロボット」ロボホンが スマホ / タブレット に優るアドバンテージは原則ありません。
（あり得るとしたら、関節等サーボのモーター音など…？）

<img width="117" alt="body_mimi.png" src="https://qiita-image-store.s3.amazonaws.com/0/121307/93862d20-f046-ef8e-f7e8-be1c3a872bd5.png">

どうしても「視覚」（**”人型ロボット”が話すからこそというコンテキスト**）とのセットで、アイディアを検討する必要があります。
今回は、
>発話内容に伴って、自動的に（手振り身振り）モーションをつけてくれる機能

が **英語発話対応に伴い、どう変化したか** も、確認したいと思います。

# モーション
ロボホンのモーション機能の実装方法は、おおきく下記三種類[^1]です。
[^1]: 0401_SR01MW_Application_Programming_Guide_V01_02_00 / 4.7.3 モーション実行　の表解釈
　
1. 公開されているモーションID（例：behavior id="0x060001"（バンザイ！））を任意指定
2. 汎用モーション自動割当て
3. **発話内容（特定のワード[^2]・30文字未満（読み）ごと）に対して自動的にモーション割当て**
[^2]: どのワードにどのモーションが割り当てられているかは公開されていません
　
今回は、3のモーション割当て（behavior id="assign"）を利用します。



# 実装…？(公式サンプル)
よーし実装するぞ！と思いきや、今回の要件は、新SDKのサンプル[^3]「音声認識した結果をオウム返しする」に、そのまま全部満たされてました。
うれしい！
[^3]:  0701_SR01MW_SampleCode_V01_02_00 / SampleMultilingual
　
1. オウム返し発話（および自動モーション割当て）

```hvml:multilingual.hvml（サンプルコード抜粋）
    <action index="1">
        <speech>${Lvcsr:Basic}</speech>
        <behavior id="assign" type="normal"/>
        <control function="recog_talk" target="jp.co.sharp.sample.multilingual">
            <data key="Lvcsr_Basic" value="${Lvcsr:Basic}"/>
        </control>
    </action>
```
2.Recognition内容を背面画面に表示

```java:MainActivity.java（サンプルコード抜粋）
    @Override
    public void onExecCommand(String command, List<VoiceUIVariable> variables) {
        Log.v(TAG, "onExecCommand() : " + command);
        switch (command) {
            case ScenarioDefinitions.FUNC_RECOG_TALK:
                final String lvcsr = VoiceUIVariableUtil.getVariableData(variables, ScenarioDefinitions.KEY_LVCSR_BASIC);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if(!isFinishing()) {
                            ((TextView) findViewById(R.id.recog_text)).setText("Lvcsr:"+lvcsr);
                        }
                    }
                });
                break;
            default:
                break;
        }
    }
```

ただし、SDKを利用した自作アプリは音声認識の回数制限があるので、注意が必要です。

>RoBoHoN SDKを利用して開発いただくアプリでは、１か月にお使いいただける音声認識の利用回数の上限が合計で1000回となっております。利用回数が上限に達した場合に備えて、音声認識ではなくテキストを利用して、音声入力をエミュレートする手段も用意しておりますのでご利用ください。（ロボホン開発者用サービス（一般向け）提供ページより）

（うまく動作しなくなったら、本体背面画面 > 設定 > その他 > 音声認識アクセス回数 の状況を確認するなど）

# 動作の様子
ロボホンが、スマホからの発話（ Microsoft の TTS (TextToSpeach) デモ）を聞き取り、
"GoodMorning"
と、オウム返しで発話し、日本語の「おはよう」発話と同様に、**片手を上げるモーションを自動実行しています。**
　
![out.jpg](https://qiita-image-store.s3.amazonaws.com/0/121307/ccda020e-ef60-0098-e409-0e15fbe200c3.jpeg)

実際の子供の発話に対しては、期待したとおり、

- 宿題の英語例文の思わぬところでモーションが自動実行されるところが飽きないアクセント
- 明瞭に発語しないと認識しない仕様が、こども本人の英語の発音上達に対して、なかなか良い感じに作用

している状態です。しばらく様子をみてみたいとおもいます！


---