広告

google LINE linuxmint Raspberry Pi ubuntu スマートスピーカー

google home LINE 読み上げ

google homeにLINEしてというとLINEに投稿する。またLINEに投稿があったときに「〇〇さんからLINEです。〇〇。」とgoogle homeが教えてくれるようにしました。

google home notifierは、自宅のlinuxmintサーバー(現在はRaspberry Pi 3)で起動してあります。

1.google homeに「LINE 〇〇」というとIFTTTがよばれるようにIFTTTでNew Appletをクリックして作成しておきます。以下のように作成しました。

URLはgoogle home notifier(example.js)を実行したときに表示されるURLを指定します。

example.jsからLINE Messaging APIにメッセージを送信しLINEグループに送信されます。

2. LINEに投稿があったときにLINE Messaging APIを使用してデータを自宅のgoogle-home-notifierに送信してもらう。

LINE Messaging APIの設定はこちら

webhookは自宅で起動したgoogle-home-notifier(example.js)のURLを指定しておく。googl-home-notifierの設定はこちら

google-home-notiferのexample.jsを修正して作成しました。(LINE読み上げのみ)

example.js

var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8091; // default port
//line messaging API用
const line = require('@line/bot-sdk');

var deviceName = 'ダイニングルーム';// google homeの名前
var ip = '192.168.10.14'; // ここにgoogle homeのIPを記載

const client = new line.Client({
  channelAccessToken: 'LINE Messaging API Channelのアクセストークインを入力'
});

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

var urlencodedParser = bodyParser.urlencoded({ extended: true });

app.post('/google-home-notifier', urlencodedParser, function (req, res) {

  if (!req.body) return res.sendStatus(400)
  console.log(req.body);

  console.log('POST');

 if(req.body.events){

    var user1 = req.body.events[0].source.userId;
    var text = req.body.events[0].message.text;
    var lineReplyToken = req.body.events[0].replyToken;

   client.getProfile(user1)
      .then(function(data) {
      uname=data.displayName;
      console.log(uname);
  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja';    
  if (req.query.language) {
    language;
  }

  googlehome.accent('us');
  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)       

  if (text){
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(uname+'からLINEです。'+text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello Google Home"');
  }

   })


}
  console.log('text:'+text);

})

app.get('/google-home-notifier', function (req, res) {

  console.log(req.query);

  var text = req.query.text;

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja'; 
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)        

  if (text) {
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello+Google+Home"');
  }
})

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
    console.log('    ' + url + '/google-home-notifier');
    console.log('GET example:');
    console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home');
        console.log('POST example:');
        console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
})

しかし上記のプログラムではbotをグループに入れてもグループメンバーのdisplayNameが取得できませんでした。

修正版がこちら(LINE読み上げのみ)

var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8091; // default port
//line messaging API用
const line = require('@line/bot-sdk');

var deviceName = 'ダイニングルーム';// Google Homeの名前
var ip = '192.168.10.14'; // Google HomeのIP

const client = new line.Client({
  channelAccessToken: 'アクセストークン'
});

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

var urlencodedParser = bodyParser.urlencoded({ extended: true });

app.post('/google-home-notifier', urlencodedParser, function (req, res) {

  if (!req.body) return res.sendStatus(400)
  console.log(req.body);

  console.log('POST');

 if(req.body.events){

    var user1 = req.body.events[0].source.userId;
    var text = req.body.events[0].message.text;
    var lineReplyToken = req.body.events[0].replyToken;
    var gid = req.body.events[0].source.groupId;


   console.log('user1:'+user1);
   console.log('gid:'+gid);

client.getGroupMemberProfile(gid,user1)
  .then((profile) => {
    console.log(profile.displayName);
      var uname=profile.displayName;
//    console.log(profile.userId);
//    console.log(profile.pictureUrl);
//    console.log(profile.statusMessage);

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja'; // default language code   
  if (req.query.language) {
    language;
  }

  googlehome.accent('us');
  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)       

  if (text){
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(uname+'さんからLINEです。'+text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello Google Home"');
  }

  })
  .catch((err) => {
    // error handling
  });

}


})

app.get('/google-home-notifier', function (req, res) {

  console.log(req.query);

  var text = req.query.text;

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja'; // default language code     
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)        

  if (text) {
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello+Google+Home"');
  }
})

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
    console.log('    ' + url + '/google-home-notifier');
    console.log('GET example:');
    console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home');
        console.log('POST example:');
        console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
})

google homeにLINEしてと話しかけたときLINEグループに投稿する部分を追加したものが以下のようになります。
以下を参考にさせていただきました。
Google Home mini で双方向の音声でのLINE送受信を実現する

var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8091; // default port
//line messaging API用
const line = require('@line/bot-sdk');

var deviceName = 'ダイニングルーム';
var ip = '192.168.10.14'; // google home ip

const client = new line.Client({
  channelAccessToken: 'アクセストークン'
});
const groupId = 'グループId';

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

var urlencodedParser = bodyParser.urlencoded({ extended: true });

app.post('/google-home-notifier', urlencodedParser, function (req, res) {

  if (!req.body) return res.sendStatus(400)
  console.log(req.body);

  console.log('POST');

 if(req.body.events){

    var user1 = req.body.events[0].source.userId;
    var text = req.body.events[0].message.text;
    var lineReplyToken = req.body.events[0].replyToken;
    var gid = req.body.events[0].source.groupId;


   console.log('user1:'+user1);
   console.log('gid:'+gid);

   client.getGroupMemberProfile(gid,user1)
  .then((profile) => {
    console.log(profile.displayName);
      var uname=profile.displayName;
//    console.log(profile.userId);
//    console.log(profile.pictureUrl);
//    console.log(profile.statusMessage);

      if (req.query.ip) {
         ip = req.query.ip;
       }

      var language = 'ja'; // default language code   
      if (req.query.language) {
        language;
       }

  googlehome.accent('us');
  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)       

    if (text){
      try {
        if (text.startsWith('http')){
          var mp3_url = text;
          googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
        } else {
          googlehome.notify(uname+'さんからLINEです。'+text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
          });
          }
      } catch(err) {
        console.log(err);
        res.sendStatus(500);
        res.send(err);
        }
    }else{
         res.send('Please GET "text=Hello Google Home"');
    }

    })
    .catch((err) => {
    // error handling
    });
   } // event


   else{

      // リクエストボディを出力
      console.log(req.body);
      var texttoline = req.body.text;
      console.log(texttoline);
      res.write('ok');
      res.end();

      const message = {
        type: 'text',
        text: texttoline
      };

      client.pushMessage(groupId, message)
        .then(() => {
        })
        .catch((err) => {
          // error handling           
        });
    }
})

app.get('/google-home-notifier', function (req, res) {

  console.log(req.query);

  var text = req.query.text;

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja'; // default language code     
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language)

  if (text) {
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello+Google+Home"');
  }
})

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
    console.log('    ' + url + '/google-home-notifier');
    console.log('GET example:');
    console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home');
        console.log('POST example:');
        console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
})

 

[simterm]
$ node example.js
Endpoints:
http://192.168.10.14:8080/google-home-notifier
https://a31fac61.ngrok.io/google-home-notifier
GET example:
curl -X GET https://a31fac61.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" https://a31fac61.ngrok.io/google-home-notifier
[/simterm]

以下のURLをLINE Messaging API Channel基本設定のWebhook URLに指定する。
https://a31fac61.ngrok.io/google-home-notifier

ngrokに関しては以下を参照してください。a31fac61のところはコマンドを実行するたびにかわります。サブドメインは有料プランを選べば固定にできるようです。詳しくは以下を参照してください。
またあらかじめsign upしておかないと一定期間を過ぎるとトンネルが期限切れになってしまいます。ngrokコマンドをインストールして実行しauthtokenを保存しておく必要があります。

https://dashboard.ngrok.com/get-started

ngrokを使用してローカル環境を外部に公開する

 

Views: 830

広告

  • この記事を書いた人

higa

システムエンジニアをやっています。 Linux,macOS好き。おもにシステム管理たまに豆柴こてつの話。 最近はスマートホームを推進中。

-google, LINE, linuxmint, Raspberry Pi, ubuntu, スマートスピーカー