Clovaに九九をきいてobnizで答えを表示してみる

スマートスピーカー Advent Calendar 2018 の17日目の投稿です。

5歳になる次男が九九を練習しています。そろばん教室で3の段まで合格をもらっていて、いま4の段を覚えているところですが、合格した2や3の段を一部忘れてしまって困っていますw

楽しく復習できるように、Clovaに九九をきいて、答えをobnizの画面に出すものを作ってみたいと思います。
LINE BOOT AWARDS2018でエントリーした「家族のお手伝い帳」のようにVUIと紙の組み合わせがいいかなと思ったんですが、個人的にobnizを使いたくて、紙ではなくobnizの画面に出したいと思います。
自宅にClovaがある生活をはじめて、アラームをよく使うのですが、夕方の5時が17時であることも親が知らないうちにClovaに教えてもらったりしているそうで、子供の学習ツールとしての可能性を感じていますww

では早速始めたいと思います。

# Clovaスキルの作成

- [ここ](https://clova-developers.line.biz/cek/#/list)でチャネルを作成
- 対話モデルを編集 (九九を発話するためのもの） ※省略
    - カスタム インテント追加
    - カスタムスロットタイプ追加
- ExtensionサーバーのURLは適当に。後で設定

![スクリーンショット 2018-12-16 22.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/103426/99dd04dd-6374-0f4f-8302-ffae151aed63.png)

インテントはこんな感じ

![スクリーンショット 2018-12-17 10.29.26.png](https://qiita-image-store.s3.amazonaws.com/0/103426/8edfde62-2329-abef-6a45-0701efa23fb1.png)


# エンドポイント（ClovaからPOSTされる）

runkitで構築します。
これをCloneさせていただいて修正しました。
https://runkit.com/9wick/obniz-x-line-clova-base-code


```
const Obniz = require('obniz');
const express = require('@runkit/runkit/express-endpoint/1.0.0');
const clova = require('@line/clova-cek-sdk-nodejs');
const app = express(exports);

const clovaExtensionId = 'jp.makeitfun.XXXXXXXX';
const myObnizId = 'XXXX-XXXX';

async function showAnswer(qq) {
  let obniz = new Obniz(myObnizId);
  let connected = await obniz.connectWait({timeout:10});
  if(connected){
    obniz.display.clear();
    // obniz.display.print(qq.question)　 // node.jsから全角文字は描画できないよう
    obniz.display.print(qq.formula)
    obniz.display.print(" = ")
    obniz.display.print(qq.answer)
  }

}

const data = {
    "1" : {
        "1" : {
            question : "いん　いち　が",
            answer : "1",
            formula : "1 * 1"
        },
        "2" : {
            question : "いん　に　が",
            answer : "2",
            formula : "1 * 2"
        },
        "3" : {
            question : "いん　さん　が",
            answer : "3",
            formula : "1 * 3"
        },
        "4" : {
            question : "いん　し　が",
            answer : "4",
            formula : "1 * 4"
        },
        "5" : {
            question : "いん　ご　が",
            answer : "5",
            formula : "1 * 5"
        },
        "6" : {
            question : "いん　ろく　が",
            answer : "6",
            formula : "1 * 6"
        },
        "7" : {
            question : "いん　しち　が",
            answer : "7",
            formula : "1 * 7"
        },
        "8" : {
            question : "いん　はち　が",
            answer : "8",
            formula : "1 * 8"
        },
        "9" : {
            question : "いん　く　が",
            answer : "9",
            formula : "1 * 9"
        }
    },
    .
    .
    .
    .
    .
    .
}

const clovaSkillHandler = clova.Client.configureSkill()

  //アプリ起動時の応答
  .onLaunchRequest(responseHelper => {
    responseHelper.setSimpleSpeech({
      lang: 'ja',
      type: 'PlainText',
      value: `復習したい九九の段をおしえてください。`,
    });
  })

  //各インテントごとの対応
  .onIntentRequest(async responseHelper => {
    const intent = responseHelper.getIntentName();

    if (intent === 'danIntent') {
      let slots = responseHelper.getSlots();

      let dan = slots.dan_slot;
      var qq = "";
      if (dan == "1"){
      
        qq = data[dan][String(Math.floor( Math.random() * 9 ))];

      }else if (dan == "2"){

      .
      .
      .
      .

      }

      //応答する
      responseHelper.setSimpleSpeech({
        lang: 'ja',
        type: 'PlainText',
        value: `いまから問題を出します。答えがわかったら画面をみてね。それでは、問題です。${qq.question}`,
      },true);

      await showAnswer(qq);


    } else if (intent === 'Clova.GuideIntent') {
      responseHelper.setSimpleSpeech({
        lang: 'ja',
        type: 'PlainText',
        value: `復習したい九九の段をおしえてください。`,
      });
    } else {
      responseHelper.setSimpleSpeech({
        lang: 'ja',
        type: 'PlainText',
        value: `復習したい九九の段をおしえてください。`,
      });
    }
  })
  .onSessionEndedRequest(responseHelper => {})
  .handle();

const clovaMiddleware = clova.Middleware({
  applicationId: clovaExtensionId,
});

app.post('/', clovaMiddleware, clovaSkillHandler);

```

Clovaのエンドポイントを設定

![スクリーンショット 2018-12-16 22.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/103426/d40792f5-6721-c879-1407-53e847abffbb.png)


# 検証

- 「九九の練習」を開いて、でClovaを起動
- Clovaが「復習したい九九の段をおしえてください。」と聞いてくるので、
- 1の段、と答えます。
- Clovaがランダムに1の段の九九をいいます（例、いんにが）
- 子供が考えて、答えをObnizで確認

![2018-12-17 10.23.46.jpg](https://qiita-image-store.s3.amazonaws.com/0/103426/b473aa37-0861-d219-b273-424d999c9821.jpeg)