Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@shin_79030

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

More than 1 year has passed since last update.

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

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

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

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

Clovaスキルの作成

  • ここでチャネルを作成
  • 対話モデルを編集 (九九を発話するためのもの) ※省略
    • カスタム インテント追加
    • カスタムスロットタイプ追加
  • ExtensionサーバーのURLは適当に。後で設定

スクリーンショット 2018-12-16 22.27.40.png

インテントはこんな感じ

スクリーンショット 2018-12-17 10.29.26.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

検証

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

2018-12-17 10.23.46.jpg

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?