2018年1月22日月曜日

Google Home:喋らせるぞ!!(帰るコール)

「帰るコール」するよ

いよいよ目的の「帰るコール」に近づいてきた。
iftttと連携することでできそうです。

シナリオは
if ボタンを押したら then 「○○を出たよ」と喋る
です。
トリガーが
で、
アクションが
になります。

Buttonは選択するだけです。
Webhooksの設定はよく分からなかったので、
Twitterの通知をGoogle Homeに教えてもらう
を参考にさせていただきました。ありがとうございます。

喋らせるテキストが設定しやすい「POST」で指定します。
1.URL
 google-home-notifierが実行時に表示するURLをコピペします。
 起動する度に先頭の文字列が変わるので注意が必要です。
 サービス化している場合は表示されないのでログから取得します。

2.Method
 「POST」を選択します。

3.Content Type
 「application/x-www-form-urlencoded」を選択します。

4.Body
 喋らせたい文字列を「text="」と「"」で挟みます。

指定したサンプルです。

登録するとスマホの待受け画面にボタンが表示されます。

このボタンを押すとGoogle Homeが「帰るコール」を喋るよ♪
できた~\(^o^)/

2018年1月20日土曜日

Google Home:喋らせるぞ!!(サービス化)

いつでも喋らせられるようにするよ♪

やっと喋るようになったので
いつでも喋らせられるようにしたい。
でもリモートコンソールを使用してサーバを起動しても、
コンソールを閉じるとサーバもダウンするんだよね。。。
さて、どうすれば良いのだろう???

やはり頼りはGoogle先生です^^;
先生に聞きまくってやっと
Google Homeで時報を知らせる
で、サービス化するとできるよと教えてくれました。
ありがとうございます。

早速、参考にしてやってみます。

1.準備
1)サービス化するスクリプトを特定する
修正した「example.js」を名前を変えて「kita.js」にした。
/home/pi/google-home-notifier/kita.js

2)nodeのパスを調べる
pi@raspberrypi:~/google-home-notifier $ which node
/usr/local/nvm/versions/node/v6.12.2/bin/node

2.サービスとして登録する
サービス化するには「Systemd」という仕組みを使うようだ。
詳しいことは分からないので。。。
HPの記載内容を参考にして作成しました。
pi@raspberrypi:~ $ cd /etc/systemd/system
pi@raspberrypi:/etc/systemd/system $ sudo vi googlehomenotifier.service

設定内容をcatで表示しておきます。
ボールド表示している部分が変更した箇所です。
pi@raspberrypi:/etc/systemd/system $ cat googlehomenotifier.service

[Unit]
Description=google-home-notifier Server
After=syslog.target network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/nvm/versions/node/v6.12.2/bin/node kita.js
Restart=on-failure
RestartSec=10
KillMode=process
WorkingDirectory=/home/pi/google-home-notifier

[Install]
WantedBy=multi-user.target

3.属性を変更する。
他のサービスの属性を確認してみた。
pi@raspberrypi:/etc/systemd/system $ ls -l
・・・
drwxr-xr-x 2 root root 4096  9月  8 00:13 dhcpcd.service.d
drwxr-xr-x 2 root root 4096  9月  7 23:47 getty.target.wants
drwxr-xr-x 2 root root 4096  9月  7 23:59 getty@tty1.service.d
-rw-r--r-- 1 root root  392 12月 19 22:23 googlehomenotifier.service
drwxr-xr-x 2 root root 4096  9月  8 00:05 halt.target.wants
drwxr-xr-x 2 root root 4096 12月 19 22:40 multi-user.target.wants
・・・

実行権限が付与されているようだったので合わせて設定しました。
pi@raspberrypi:/etc/systemd/system $ sudo chmod +x googlehomenotifier.service

再表示して確認してみる。
pi@raspberrypi:/etc/systemd/system $ ls -l
・・・
drwxr-xr-x 2 root root 4096  9月  8 00:13 dhcpcd.service.d
drwxr-xr-x 2 root root 4096  9月  7 23:47 getty.target.wants
drwxr-xr-x 2 root root 4096  9月  7 23:59 getty@tty1.service.d
-rwxr-xr-x 1 root root  392 12月 19 22:23 googlehomenotifier.service
drwxr-xr-x 2 root root 4096  9月  8 00:05 halt.target.wants
drwxr-xr-x 2 root root 4096 12月 19 22:40 multi-user.target.wants
・・・

4.サービスを有効にする。
ここからはホームディレクトリで処理できるので戻しておく。
pi@raspberrypi:/etc/systemd/system $ cd

1)サービスの状態を確認してみる。
自動起動の状態
pi@raspberrypi:~ $ sudo systemctl list-unit-files --type=service | grep googlehommenotifier
googlehomenotifier.service             disabled 

起動状態
pi@raspberrypi:~ $ sudo systemctl status googlehomenotifier
● googlehomenotifier.service - google-home-notifier Server
   Loaded: loaded (/etc/systemd/system/googlehomenotifier.service; enabled; vend
   Active: inactive (dead)

2)自動起動を有効にする
pi@raspberrypi:~ $ sudo systemctl enable googlehomenotifier
Created symlink /etc/systemd/system/multi-user.target.wants/googlehomenotifier.service → /etc/systemd/system/googlehomenotifier.service.

3)サービスを起動する
pi@raspberrypi:~ $ sudo systemctl start googlehomenotifier

4)サービスの状態を確認してみる。
自動起動の状態
pi@raspberrypi:~ $ sudo systemctl list-unit-files --type=service | grep googlehommenotifier
googlehomenotifier.service             enabled

起動状態
pi@raspberrypi:~ $ sudo systemctl status googlehomenotifier
● googlehomenotifier.service - google-home-notifier Server
   Loaded: loaded (/etc/systemd/system/googlehomenotifier.service; enabled; vend
   Active: active (running) since Sat 2018-01-20 17:24:34 JST; 7min ago
 Main PID: 23138 (node)
   CGroup: /system.slice/googlehomenotifier.service
           tq23138 /usr/local/nvm/versions/node/v6.12.2/bin/node kita.js
           mq23148 ./ngrok start --none --log=stdout
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** The program 'node' call
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** Please fix your applica
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** For more information se
 1月 20 17:24:54 raspberrypi node[23138]: Endpoints:
 1月 20 17:24:54 raspberrypi node[23138]:     http://192.168.3.28:8091/google-hom
 1月 20 17:24:54 raspberrypi node[23138]:     https://627789f3.ngrok.io/google-ho
 1月 20 17:24:54 raspberrypi node[23138]: GET example:
 1月 20 17:24:54 raspberrypi node[23138]: curl -X GET https://627789f3.ngrok.io/g
 1月 20 17:24:54 raspberrypi node[23138]: POST example:
 1月 20 17:24:54 raspberrypi node[23138]: curl -X POST -d "text=Hello Google Home

5.ログを確認
googlehomenotifierの抽出して確認します。
pi@raspberrypi:~ $ journalctl -u googlehomenotifier > service.log
pi@raspberrypi:~ $ cat service.log
 1月 20 17:24:34 raspberrypi systemd[1]: Started google-home-notifier Server.
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** Please fix your application to use the native API of Avahi!
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** Please fix your application to use the native API of Avahi!
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** Please fix your application to use the native API of Avahi!
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** Please fix your application to use the native API of Avahi!
 1月 20 17:24:41 raspberrypi node[23138]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
 1月 20 17:24:54 raspberrypi node[23138]: Endpoints:
 1月 20 17:24:54 raspberrypi node[23138]:     http://192.168.3.28:8091/google-home-notifier
 1月 20 17:24:54 raspberrypi node[23138]:     https://627789f3.ngrok.io/google-home-notifier
 1月 20 17:24:54 raspberrypi node[23138]: GET example:
 1月 20 17:24:54 raspberrypi node[23138]: curl -X GET https://627789f3.ngrok.io/google-home-notifier?text=Hello+Google+Home
 1月 20 17:24:54 raspberrypi node[23138]: POST example:
 1月 20 17:24:54 raspberrypi node[23138]: curl -X POST -d "text=Hello Google Home" https://627789f3.ngrok.io/google-home-notifier
こんな感じでコンソールに表示されていたメッセージが確認できればOKです♪

コンソールから
curl -X POST -d "text=Hello Google Home" https://627789f3.ngrok.io/google-home-notifier
と試してみると喋るよ\(^o^)/

2017年12月28日木曜日

Google Home:喋らせるぞ!!(日本語)

日本語を喋らせてみよう!!

喋り始めたので次は日本語に挑戦です。
引き続き、
「GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます」
を参照させてもらいました。ありがとうございます。

日本語を喋らせるには「example.js」を修正します。
  • 喋る内容が日本語であることを伝える
  • デバイスが日本語対応であることを伝える
ことが必要です。
pi@raspberrypi:~/google-home-notifier $ vi example.js

修正箇所をdiffしました。(前回の修正も含んでいます)
pi@raspberrypi:~/google-home-notifier $ cat example.js.diff
8,9c8,9
< var deviceName = 'Google Home';
< var ip = '192.168.1.20'; // default IP
---
> var deviceName = 'livingroom';
> var ip = '192.168.3.28'; // default IP
24c24
<   var language = 'pl'; // default language code
---
>   var language = 'ja'; // default language code
29c29,30
<   googlehome.ip(ip, language);
---
>   googlehome.device(deviceName, language);
>   googlehome.ip(ip);
65c66
<   var language = 'pl'; // default language code
---
>   var language = 'ja'; // default language code
70c71,72
<   googlehome.ip(ip, language);
---
>   googlehome.device(deviceName, language);
>   googlehome.ip(ip);

準備ができたので、サーバを起動して喋らせてみます。
まずは日本語です。
pi@raspberrypi:~/google-home-notifier $ curl -X POST -d "text=ハロー グーグルホーム" https://63f1c2c1.ngrok.io/google-home-notifier
{ text: 'ハロー グーグルホーム' }
Device notified
livingroom will say: ハロー グーグルホーム
やったね♪日本語喋った!!

次に、英語を喋らせてみます。
pi@raspberrypi:~/google-home-notifier $ curl -X POST -d "text=Hello Google Home"  https://63f1c2c1.ngrok.io/google-home-notifier
{ text: 'Hello Google Home' }
Device notified
livingroom will say: Hello Google Home
なんと。。。日本語的な英語だ。。。(@_@;)
カタカナで書いたのと変わらない。。。

平家物語の冒頭を喋らせてみました。
pi@raspberrypi:~/google-home-notifier $ curl -X POST -d "text=祇園精舎の鐘の声、諸行無常の響きあり。" https://63f1c2c1.ngrok.io/google-home-notifier
{ text: '祇園精舎の鐘の声、諸行無常の響きあり。' }
Device notified
livingroom will say: 祇園精舎の鐘の声、諸行無常の響きあり。
ちゃんと漢字も読めてるじゃん♪

ちょっとノロマで抑揚のない日本語ですね^^;
でも、ちゃ~~~んと喋りました。やったね!!
今日はここまで。

2017年12月10日日曜日

Google Home:マルチアクションでニコニコ(^^)

一声で複数の処理を実行させたい!!

GoogleHomeって「ながら操作」ができるのが良いよね!!
朝起きて服を着替えながら「テレビつけて」って言うだけでOK。
リモコンがどこにあるのか探さなくて良い(^^)v

更に使いやすくするには。。。
一声で複数の処理(マルチアクション)させたい!!
で、一つできたよ♪

「ステレオをつけるとTVを消音する。」

て簡単なもの。
TV音声をステレオで聴きたいときに、
「ステレオつけて」「TVの音消して」
て言ってたのが煩わしかった。

設定方法はiftttで同じキーワードで2つ登録するとできた。
  • ステレオの電源ON
  • TVの消音

  • こんな感じ


どのように制御しているのか分からないけど、
レスポンス音声は一度しか言わないので一度に処理しているのかな??

iftttさん、早くマルチアクションをサポートしてくださいm(_ _)m

2017年12月9日土曜日

Google Home:喋らせるぞ!!

帰るコールをGoogle Homeでやりたい!

帰るコールしてますか?!
私はLineで
今○○駅、○○発で帰るよ。
と会社帰りにやっている。マメでしょ(^^;
で、これをGoogle Home的にやりたい!と思いました。
それにはまず、Google Homeに喋ってもらわないとね!!

と言っても何をすれば良いのか???な状態なので
Google先生に聞いてみると
「GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます」
と教えてくれました。ありがとうございます。
google-home-notifier」を使って喋らせるようです。

早速、参考にしてやってみます。
手元に役割を終えた初代RaspberryPiが眠っていたので
それを使うことにしました。

1.Raspbianをインストール
2017-09-07-raspbian-stretch-lite.img
をダウンロードしてインストールする。
その後
  • IPアドレスの固定
  • アップデートとアップグレード
  • ロケール、タイムゾーンの変更
  • SDカードのエリア拡張
など初期設定しました。

2.google-home-notifierに必要なソフトをインストール
1)Gitをインストール
インストールに必要となるGitをインストールする。
pi@raspberrypi:~ $ sudo apt-get install git
・・・
pi@raspberrypi:~ $ git --version
git version 2.11.0

2)Node.jsをインストール
実行に必要となるNode.jsをインストールする。
これが意外に難しかった。

Google先生に聞きながら何回もやり直して
Raspberry Pi に Node.js をインストールする(nvm利用)
を参照しながら行ってやっと成功しました。

①古いnodeをアンインストールする。
pi@raspberrypi:~ $ sudo at pt-get autoremove node.js

②nvmをインストールするディレクトリを作成し属性変更する。
pi@raspberrypi:~ $ sudo mkdir /usr/local/nvm
pi@raspberrypi:~ $ sudo chmod 777 /usr/local/nvm

③nvm.gitリポジトリのクローンを作成する。
pi@raspberrypi:~ $ git clone https://github.com/creationix/nvm.git /usr/local/nvm

④nvmを使えるようにする。
pi@raspberrypi:~ $ source /usr/local/nvm/nvm.sh

⑤nvmでインストールできるnodeのバージョン一覧を表示する。
pi@raspberrypi:~ $ nvm ls-remote
        v6.12.2   (Latest LTS: Boron)
         v8.9.3   (Latest LTS: Carbon)
         v9.2.1
など表示される。

⑥nodeをインストールする。
v9.2.1,v8.9.3はエラーがいっぱいでインストールできなかったよ。。。(T_T)
なのでv6.12.2をインストールした。
pi@raspberrypi:~ $ nvm install nvm install v6.12.2

⑦node, npm のバージョンを確認する。
pi@raspberrypi:~ $ node -v
v6.12.2
pi@raspberrypi:~ $ npm -v
3.10.10

⑧ログイン時にnvm,nodeの起動するように設定する。
pi@raspberrypi:~ $ sudo vi /etc/profile.d/nvm.sh

修正箇所をcatしました。
pi@raspberrypi:~ $ cat /etc/profile.d/nvm.sh
source /usr/local/nvm/nvm.sh

3.google-home-notifierをインストール
1)インストール前処理
RaspberryPiの準備があります。

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
pi@raspberrypi:~ $ sudo apt-get install nodejs
pi@raspberrypi:~ $ sudo apt-get install git-core libnss-mdns libavahi-compat-libddnssd-dev

2)本体のインストール
本体部分はListenerのところに記載されています。

pi@raspberrypi:~ $ git clone https://github.com/noelportugal/google-home-notifier
pi@raspberrypi:~ $ cd google-home-notifier
pi@raspberrypi:~ $ npm install

3)インストール後処理
browser.jsの修正が必要です。

pi@raspberrypi:~/google-home-notifier $ vi node_modules/mdns/lib/browser.js

修正箇所をdiffしました。
pi@raspberrypi:~/google-home-notifier/node_modules/mdns/lib $ cat browser.js.diff
119c119
< , 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
---
> , 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})

4.google-home-notifierを設定する。
1)Google Homeのデバイス名とIPアドレスを調べる。
デバイスの設定画面を表示するとデバイス名は中程に、
私のはlivingroomです。

IPアドレスは一番下に表示されています。
私のは192.168.3.28です。

2)example.jsにデバイス名とIPアドレスを指定する。
pi@raspberrypi:~ $ cd google-home-notifier
pi@raspberrypi:~/google-home-notifier $ vi example.js

修正箇所をdiffしました。
pi@raspberrypi:~/google-home-notifier $ cat example.js.diff
8,9c8,9
< var deviceName = 'Google Home';
< var ip = '192.168.1.20'; // default IP
---
> var deviceName = 'livingroom';
> var ip = '192.168.3.28'; // default IP

5.喋らせてみる。
以上で設定完了です。喋らせてみます。

1)サーバを実行します。
「&」を付けてバックグラウンドで実行させると便利です。
pi@raspberrypi:~/google-home-notifier $ node example.js &

[1] 10362
pi@raspberrypi:~/google-home-notifier $ *** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
Endpoints:
    http://192.168.3.28:8091/google-home-notifier
    https://23f67145.ngrok.io/google-home-notifier
GET example:
curl -X GET https://23f67145.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" https://23f67145.ngrok.io/google-home-notifier

こんな感じで実行されます。

いっぱいワーニングが出てますが気にしないで良いみたいです^^;
使い方としてGET exampleとPOST exampleの2種類が表示されています。
POSTを使った方が指定しやすいですね。

2)クライアントからサーバにPOSTする。
サンプルをそのままコピペです^^;
pi@raspberrypi:~/google-home-notifier $ curl -X POST -d "text=Hello Google Home"  https://23f67145.ngrok.io/google-home-notifier

上手く処理されると

{ text: 'Hello Google Home' }
Device notified
livingroom will say: Hello Google Home

と表示されて喋りました!
やった~。ついに喋りました!!先人の皆さんありがとうございます。
 
録画してみました。
 
次は日本語だ。今日はここまで。