「AIスピーカに喋らせる」仕組み復活!

20220306  久しぶりに「小部屋の構築メモ」をUp!

  3年ほど前に「MESHのタグ情報(気温・湿度・明るさ)をAIスピーカに喋らせる」仕組みを構築。それに必要なモジュール「google-home-notifier」が2020年末あたりからエラーに。有効な解決策がネットにUpされていないことから、しばらく放置していました。
(2019/5/6)
  みうみうの小部屋: 続・MESH チャレンジ!

  いつか復旧させたいな、と定期的にググっていたところ、このネット記事を発見。チャレンジすることにしました。
(URL)
  google-home-notifierの代替となりそうなgoogle-home-playerを試してみる – Qiita

  ラズパイを初期化してチャレンジ。割と簡単に喋らせることができました。しかし「google-home-notifier」と異なり、手厚いサンプル(HTTP POSTなど)はなし。ということで、いちから環境構築。稼働後、1週間経過しましたが問題なし。せっかくなので手順を整理しておこう。

  MESHの「ボタン」ではなく、AIスピーカーに音声指示できるようにもしましたが、IFTTTのMESHイベント送信に時間がかかることがあり、反応がいまいち。これの改善は難しそうだなぁ~

(動画[前回])
 

[手順]
(1).ラズパイの初期化
(URL)
  ラズパイの初期化とOS再インストール方法をまとめてみた│takuのアトリエ
  Raspbianのインストールと最強の初期設定 | 純規の暇人趣味ブログ

(2).Webサーバの構築(Node/npm/express SetUp)
(URL)
  【Node.js】初心者のためのNode.js/npmの基礎とはじめてのExpressの設定 | アールエフェクト

  ⇒ローカル環境で「Hello World」を出力してみる

(3).google-home-playerのインストール(Webサーバ環境下)
(URL)
  google-home-notifierの代替となりそうなgoogle-home-playerを試してみる – Qiita

  ⇒nodeで喋らせる(文言固定)

(4).HTTP POSTでgoogle-home-playerを呼び出す
(URL)
  Node.js + Express でPOSTデータを取得後、WebAPIへ問い合わせる – Qiita

  ⇒「express index.js修正」「HTTP POST(ローカル環境)で喋らせる」

(5).ngrok(トンネリングサービス)設定 (ngrokアカウント登録含む)
(URL)
  ngrok と express を組み合わせて Hello World!(ngrok のモジュールを利用) – Qiita
  ngrok – npm | auth-token
  google-home-notifierが気づいたら動かなくなってた時の対処法 – Qiita

  ⇒「express index.js修正」「HTTP POST(インターネット環境)で喋らせる」

(6).forever設定 (永続化)
(URL)
  【Node.js入門】foreverの使い方とデーモン化による永続化・自動起動まとめ! | 侍エンジニアブログ

  ⇒「index.js」の永続化(端末切っても動くように…)

(7).IFTTT設定 / MESH設定(喋らせる)
(URL)
  イチからGoogleHome+RaspberryPi3+IFTTTを連携させて喋らせるまで – Qiita

⇒「IFTTT」アプレットを作成

(URL)
  IFTTT連携の初期設定方法を教えてください – MESHサポート | 遊び心を形にできる、アプリとつなげるブロック形状の電子タグ

⇒「MESH」と「IFTTT」との連携

(8).IFTTT設定 / MESH設定 (音声指示)
(URL)
  Google Home Mini が待ちきれなくてスマホとIFTTTのGoogle AssistantとMESHで連携感覚をつかんでおくメモ – 1ft-seabass.jp.MEMO

⇒「MESH」アプレットを作成

<index.js sample> サブディレクトリ「speech」でPOSTを受ける!
const express = require('express')
const ngrok = require('ngrok')
const token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const app = express()
const bodyParser = require('body-parser')
const port = 3000

const GoogleHomePlayer = require('google-home-player');
const ip = '000.000.000.000'; // your Google Home's ip address
const googleHome = new GoogleHomePlayer(ip, 'ja');

app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());

app.get('/', (req, res) => res.send('Hello World!'))
app.post('/', (req, res) => res.send('Hello World! by Post Request'))

app.post('/speech', (req, res) => {
  googleHome
  .say(req.body.text)
  .catch(function(err) {
  console.error(err);
  });

  console.log(req.body);
  res.send("Received POST Data!");
});

ngrok.connect({authtoken: token, addr: port}).then((url) => {
app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
  console.log(`Example app listening at ${url}`);
  });
});

コメント

タイトルとURLをコピーしました