Google home notifier

Google Home Notifier とは,Google Home にメッセージを送って喋らせるためのライブラリです。ここに日本語の解説があります。
なぜこのようなライブラリがあるかというと,Google Home は「OK Google」と呼びかけないと会話が始まらないため,例えば何時が来たら○○と喋らせる,といったことができないので自発的に喋らせる仕組みが必要だからです。

Google Home Notifier は本家Googleが開発したものではなくNodejsのパッケージとして提供されます。したがって Google Home Notifierを利用するにはNodejsでスクリプトを書かなければなりません。

Google Home Notifierの公式サイトにはHTTPリクエストを待ち受けクライアントの要求に応じてGoogle Homeに対して発話を促すサーバーのサンプル example.js が掲載されています。このスクリプトを自分の環境に合わせて修正すればそのまま発話サーバとして利用できます。このサーバはWebAPIを提供するのでcurlコマンド,ブラウザからのURL入力(GETメソッドのみ),Webページからの要求,そしてNodejsクライアントスクリプトなどから発話要求を簡単に行うことができます。

実際にexample.jsを動かすには以下の修正が必要になります。
  1. 9行目のipにはGoogle Homeではなくeample.jsを稼働させるサーバのIPアドレスを設定する。
  2. 29行目のgooglehome.ipの引数のipにはGoogle HomeのIPアドレスを設定する。
また,パッケージ google-home-notifier の node_modules/google-tts-api/lib/key.js において,正規表現を使ってkeyを取り出す処理を以下のように変更する必要があります。
module.exports = function (timeout) {
  return fetch(host, {
    timeout: timeout || 10 * 1000
  })
  .then(function (res) {
    if (res.status !== 200) {
      throw new Error('request to ' + host + ' failed, status code = ' + res.status + ' (' + res.statusText + ')');
    }
    return res.text();
  })
  .then(function(html){
    // tkk:'432648.2912219588'
    //const regexp = /tkk:('[0-9]+.[0-9]+')/g;
    const regexp = /tkk:'([0-9]+.[0-9]+)'/g;
    var match = html.match(regexp);
    if(!match)throw new Error('get key failed from google');
    console.log(match[0]);
    return match[0];
  });
};
リスト1.node_modules/google-tts-api/lib/key.js の修正

次に,HTTPリクエストを送信するNodejsのサンプルスクリプトをリスト2(GETメソッド)とリスト3(POSTメソッド)にそれぞれ示す。
var url = 'http://192.168.11.39:8091/google-home-notifier';
var webclient = require("request");

//
// GETメソッド
//

webclient.get({
 url: url,
 qs: {
  text: "GETメソッドによる朝のお薬の時間です",
 }
}, function (error, response, body) {
 if(!error) {
  console.log(body);
 } else {
  console.log('Error:' + error);
 }
});
リスト2.HTTPリクエストを送信するNodejsのサンプルスクリプト(GETメソッド)
var url = 'http://192.168.11.39:8091/google-home-notifier';
var webclient = require("request");
 
//
// POSTメソッド
//

webclient.post({
 url: url,
 form: {text: "POSTメソッドのformによる朝のお薬の時間です"},
}, function (error, response, body){
 if(!error) {
  console.log(body);
 } else {
  console.log('Error:' + error);
 }
});
リスト3.HTTPリクエストを送信するNodejsのサンプルスクリプト(GETメソッド)

GETメソッドの場合はqsパラメータを,POSTメソッドの場合はformパラメータを使ってデータを渡している点に注意してください。
また,example.jsはipアドレスをipパラメータで,言語をlanguageパラメータで渡すこともできるようですが,前述したように変数ipがサーバのIPアドレスにもGoogle HomeのIPにも使われており,混乱しているようなので,このパラメータは使用せずプログラム中でハードコーディングするかパラメータを分けるかする必要があります。

【Webページからリクエストを送るサンプル】

次のリストはGoogle Homeに喋らせたいメッセージをWebページから入力するサンプルです。
<!--

 サンプルスピーチクライアント
 example.jsのWebAPIに発話要求を送る

-->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Speech Client Example</title>
 <script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>

 <script>
 const url = 'http://172.16.108.7:8091/google-home-notifier';

 <!-- GETメソッドで要求を送る -->
 $(document).on('click', '#button-GET', function(){
  $.ajax({
   type: 'GET',
   url: url,
   data: {
    text: $('#text').val(),
   },
   success: out => {
    alert(out.message);
   }
  });
 });

 <!-- POSTメソッドで要求を送る -->
 $(document).on('click', '#button-POST', function(){
  $.ajax({
   type: 'POST',
   url: url,

   data: {
    text: $('#text').val(),
   },
   
   success: out => {
    alert(out.message);
   }
  });
 });

 </script>
</head>
<body>
<h1>Speech Client Example</h1>
<form>
<label for="text">メッセージ:</label><input type="text" id="text" value="朝のお薬の時間です" />
<br />
<button type="button" id="button-GET">GETメソッドで送る</button>
<button type="button" id="button-POST">POSTメソッドで送る</button>
</form>
</body>
リスト4.Google Homeにメッセージを送るWebページ 

下図はそのWebページです。

図1.Google Homeにメッセージを送るWebページ

メッセージを入力して「GETメソッドで送る」または「POSTメソッドで送る」をクリックするとメッセージをexample.jsに送ることができます。

0 件のコメント:

コメントを投稿