6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

耳年齢を判定するLINE Bot×Iotの作成

Last updated at Posted at 2019-10-22

##概要
前回こちらの記事で老眼とモスキート音による加齢性難聴をチェックするLINE Bot×Iotを作成しました。
老眼と加齢性難聴のチェックができるLINE Bot×Iotの作成

こちらを使ってみると老眼チェックの機能と組み合わせたため、加齢性難聴のチェックがしにくいことが分かりました。今回は、加齢性難聴のチェックのみに機能を絞ったBotをobnizと組み合わせて作成しました。
##実装
LINE BOtとobnizの連携。スピーカーから発せられる音を聞きながら、LINE上で質問に答えていくと自分の耳年齢が分かるBOT。
##概念図
node.js expressでLINE bot APIとobnizを連携しました。
rougann.jpg
##作成方法
1.obnizの準備
obnizをPCと接続します。
obniz公式サイト
Node.jsのダウンロード

obnizを使えるようにWifiに接続し、画面上にQRコードと8桁の数字が表れるようにします。

スピーカーを準備し、obnizのio0とio1にさします。
IMG-0707.JPG
今回は、圧電スピーカー(圧電サウンダ)(13mm)PKM13EPYH4000-A0を使用しました。

obniz speaker参照

2. Botアカウントを作成する

3. Node.jsでBot開発

4. ngrokでトンネリング

上記の2~4を以下の参考記事の通りに行います。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017

5.obnizとの連携

コードを以下のように書き換えます。
今回は、LINE Developersの確認テンプレートメッセージを使いました。
LINE Developers

'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: 'channelSecretを入力',
    channelAccessToken: 'channelAccessTokenを入力'
};

// Obnizの準備
var Obniz = require("obniz");
var obniz = new Obniz("Obniz ID を入力");  // Obniz ID を入力
var speaker; // 全体で使えるようにするスコープ
obniz.onconnect = async function () {
    speaker = obniz.wired("Speaker", {signal:0, gnd:1});
}

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
  console.log(req.body.events);
  
  //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
  if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
    res.send('Hello LINE BOT!(POST)');
    console.log('疎通確認用');
    return; 
  }
  
  Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

    
const client = new line.Client(config);

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  // LINE botのプログラム
  let ans = "";
  let question = event.message.text;
  
  let hz;//モスキート音のhz

  let yes = "";
  let  no = "";
  if (question == "開始") {
    hz = 8000;
    ans = "今流れているモスキート音は8000Hzです。聞こえますか?";
    yes = "8000Hzはい";
    no = "8000Hzいいえ";
  } else if (question == "8000Hzはい") {
    hz = 10000;
    ans = "今流れているモスキート音は10000Hzです。聞こえますか?";
    yes = "10000Hzはい";
    no = "10000Hzいいえ";
  } else if (question == "10000Hzはい") {
    hz = 12000;
    ans = "今流れているモスキート音は12000Hzです。聞こえますか?";
    yes = "12000Hzはい";
    no = "12000Hzいいえ";
  } else if (question == "12000Hzはい") {
    hz = 14000;
    ans = "今流れているモスキート音は14000Hzです。聞こえますか?";
    yes = "14000Hzはい";
    no = "14000Hzいいえ";
  } else if (question == "14000Hzはい") {
    hz = 15000;
    ans = "今流れているモスキート音は15000Hzです。聞こえますか?";
    yes = "15000Hzはい";
    no = "15000Hzいいえ";
  } else if (question == "15000Hzはい") {
    hz = 16000;
    ans = "今流れているモスキート音は16000Hzです。聞こえますか?";
    yes = "16000Hzはい";
    no = "16000Hzいいえ";
  } else if (question == "16000Hzはい") {
    hz = 0;
    ans = "加齢性難聴の疑いはありません。高音域の聴力は20歳未満相当と思われます。";
  } else if (question == "8000Hzいいえ") {
    hz = 0;
    ans = "加齢性難聴の疑いがあります。高音域の聴力は70歳以上相当と思われます。";
  } else if (question == "10000Hzいいえ") {
    hz = 0;
    ans="加齢性難聴の疑いがあります。高音域の聴力は60~69歳相当と思われます。";
  } else if (question == "12000Hzいいえ") {
    hz = 0;
    ans = "加齢性難聴の疑いがあります。高音域の聴力は50~59歳相当と思われます。";
  } else if (question == "14000Hzいいえ") {
    hz = 0;
    ans = "加齢性難聴の疑いがあります。高音域の聴力は40~49歳相当と思われます。";
  } else if (question == "15000Hzいいえ") {
    hz = 0;
    ans = "加齢性難聴の疑いがあります。高音域の聴力は30~39歳相当と思われます。";
  } else if (question == "16000Hzいいえ") {
    hz = 0;
    ans = "加齢性難聴の疑いがあります。高音域の聴力は20~29歳相当と思われます。";
  }

  speaker.play(hz);


  if (yes == "") {
  //通常のメッセージ
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: ans
    }); 
  } else {
  //確認テンプレートメッセージ
    return client.replyMessage(event.replyToken, {
      "type": "template",
      "altText": "this is a confirm template",
      "template": {
          "type": "confirm",
          "text": ans,
          "actions": [
              {
                "type": "message",
                "label": "はい",
                "text": yes
              },
              {
                "type": "message",
                "label": "いいえ",
                "text": no
              }
          ]
      }
    });
  }
 
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

##動作確認
ちゃんと動いています。
unnamed1.png
unnamed.png

動画です。スピーカーから音も出ています。

##考察
高音性難聴判定に機能を絞ったことで使いやすいBotになりました。
最初以下のようなフローチャートのように質問に答えていくコードを書いたのですがうまく動きませんでした。

'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: 'channelSecretを入力',
    channelAccessToken: 'channelAccessTokenを入力'
};

// Obnizの準備
var Obniz = require("obniz");
var obniz = new Obniz(" Obniz ID を入力");  // Obniz ID を入力
var speaker; // 全体で使えるようにするスコープ
obniz.onconnect = async function () {
    speaker = obniz.wired("Speaker", {signal:0, gnd:1});
}

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
  console.log(req.body.events);
  
  //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
  if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
    res.send('Hello LINE BOT!(POST)');
    console.log('疎通確認用');
    return; 
  }
  
  Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

    
const client = new line.Client(config);

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  // LINE botのプログラム
  let ans = "";
  let question = event.message.text;
  
  let hz;//モスキート音のhz

  if (question=="開始") {
    ans = "今流れているモスキート音は8000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
    hz = 8000;
    if (question == "はい") {
      ans = "今流れているモスキート音は10000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
      hz = 10000;    
      if (question == "はい") {
        ans = "今流れているモスキート音は12000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
        hz = 12000;
        if (question == "はい") {
          ans = "今流れているモスキート音は14000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
          hz = 14000;
          if (question == "はい") {
            ans = "今流れているモスキート音は15000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
            hz = 16000;
            if (question == "はい") {
              ans = "今流れているモスキート音は16000Hzです。聞こえますか? 「はい」か「いいえ」を入力してください。";
              hz = 18000;
              if (question == "はい") {
                ans = "加齢性難聴の疑いはありません。高音域の聴力は20歳未満相当と思われます。";
                hz = 0;
              }else{
                ans = "加齢性難聴の疑いがあります。高音域の聴力は20~29歳相当と思われます。";
                 hz = 0;
               }
            }else{
              ans = "加齢性難聴の疑いがあります。高音域の聴力は30~39歳相当と思われます。";
               hz = 0;
             }
          }else{
            ans = "加齢性難聴の疑いがあります。高音域の聴力は40~49歳相当と思われます。";
             hz = 0;
           }
        }else{
          ans = "加齢性難聴の疑いがあります。高音域の聴力は50~59歳相当と思われます。";
           hz = 0;
         }
      }else{
        ans = "加齢性難聴の疑いがあります。高音域の聴力は60~69歳相当と思われます。";
         hz = 0;
       }
  } else {
      ans = "加齢性難聴の疑いがあります。高音域の聴力は70歳以上相当と思われます。";
       hz = 0;
     }
  } else {
    ans = "「開始」を入力してください。";
    hz = 0;
  }
 
  console.log(ans);
  speaker.play(hz);


  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: ans
  });

}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

LINE BotのQ&Aは1対1で対応しないとうまく動かないようなので、確認テンプレートメッセージを使って書き換えるとうまくいきました。
LINEで音声ファイルを送ることもできるようなので、そちらを使ってデバイスを使わない方法も試したいと思います。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?