LoginSignup
8
1

More than 3 years have passed since last update.

「しらける」を「ホワイトキック」自動変換の評価表現方法が独特すぎる

Last updated at Posted at 2019-06-26

タイトルが自分で作っておきながらスラグ用語っぽくしたくてこんな感じになりました

前回

「しらける」を「ホワイトキック」に自動変換したかったストーリー
https://qiita.com/tkyko13/items/f80503a04d33482d9983

今回

前回のものを使って自分なりに自動変換の評価方法とその表現をフィジカルコンピューティング的に行ってみました
それがこちらの動画です

https://youtu.be/RxWQeA0aLMY
http://www.youtube.com/watch?v=RxWQeA0aLMY

ezgif.com-crop.gif

本当にホワイトをキックします...

実装

概念図

前回のも合わせて図にしてみました
動画で少し写っているマイクが反応した後にLINE BOTが「イッツ ホワイトキック!!」というメッセージを送っていますが,そのフローは省略しています

概念図.jpg

使ったもの

前回の以外では,

obniz https://obniz.io/ja/
obniz nodeライブラリ v2.2.0
マイクキット http://akizukidenshi.com/catalog/g/gK-05757/
サーボモータ http://akizukidenshi.com/catalog/g/gM-08761/

ソースコード

wker.jsは前回のモジュールになっています
全体はgithubをご確認ください
https://github.com/tkyko13/WhiteKicker

server.js

"use strict";

const Obniz = require("obniz");
const express = require("express");
const line = require("@line/bot-sdk");
const wker = require("./wker");
const PORT = process.env.PORT || 3000;

const config = {
  channelSecret: "<YOUR_SECRET>",
  channelAccessToken:"<YOUR_TOKEN>"
};

let obniz = new Obniz("<YOUR_ID>");
let mic;
let servo;

// 環境によってしきい値を変える
const MIC_THRESHOLD = 3.5;
// サーボの角度設定
const SERVO_BASE_ANGLE = 120;
const SERVO_KICK_ANGLE = 60;

obniz.onconnect = async function() {
  obniz.display.clear();
  obniz.display.print("connect!");

  obniz.io0.output(false); //gnd
  obniz.io1.output(true); //vcc

  mic = obniz.ad3;
  servo = obniz.wired("ServoMotor", { signal: 5 });
  servo.angle(SERVO_BASE_ANGLE);
};

const app = express();

app.get("/", (req, res) => res.send("Hello LINE BOT! wker"));

app.post("/webhook", line.middleware(config), (req, res) => {
  console.log(req.body.events);
  Promise.all(req.body.events.map(handleEvent)).then(result => {
    res.json(result);
  });
});

// デバッグ用
app.get("/:text", (req, res) => {
  let text = req.params.text;
  wker(text).then(function(data) {
    res.send(data);
  });
});

const client = new line.Client(config);

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

  let resMess = event.message.text;
  // devという文字があればデバッグモード
  let dev = "";
  // if (resMess.indexOf("dev") >= 0) {
  if (/dev/.test(resMess)) {
    dev = "-v";
    resMess = resMess.replace("dev", "");
  }

  wker(resMess).then(function(data) {
    let retText = "";
    if (dev == "-v") {
      retText += data.kanji.join(" ") + "\n";
      retText += data.en.join(" ") + "\n";
      retText += data.text;
    } else {
      retText += data.text;
    }

    obnizAction();

    return client.replyMessage(event.replyToken, {
      type: "text",
      text: retText //実際に返信の言葉を入れる箇所
    });
  });
}

function obnizAction() {
  mic.start(function(v) {
    console.log(v);
    if (v > MIC_THRESHOLD) {
      obniz.display.clear();
      obniz.display.print("W!K!");
      servo.angle(SERVO_KICK_ANGLE); //ホワイトキック
      mic.end();
      // lineメッセージを送る
      client.pushMessage("U774679a859ca7303bf7cfb9ff5d44aa1", {
        type: "text",
        text: "イッツ ホワイトキック!!"
      });

      setTimeout(function() {
        servo.angle(SERVO_BASE_ANGLE); //元の位置へ
      }, 3000);
    }
  });
  setTimeout(function() {
    mic.end();
  }, 3000);
}

process.env.NOW_REGION ? (module.exports = app) : app.listen(PORT);![undefined]()

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


説明など

前回のLINE BOTで笑ったら足が付いたサーボが動いて白って書いてある紙を蹴るというもの
LINE BOTが返答した後,3秒ほど音量を取得しています
笑うという判断はマイクの音量がしきい値を超えたらになっていますので,笑いじゃなくてもツッコミや怒号でもサーボが動く(ホワイトキック)します
また,LINE BOTに「イッツ ホワイトキック!!」というメッセージを送らせています
3秒後にまたサーボが元の位置に回転して戻ります

LINE BOTが面白くなく3秒ほど場がし〜んとなったら「ホワイトキック」しないです

結果

場が「しらけ(る)」てしまっても「ホワイトキック」はしないが,場が「しらけ(る)」なくても「ホワイトキック」するということです

え〜...以上です

8
1
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
8
1