【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

これであなたも話し上手? 言いにくいことはわずか10行で話し出すGoogle Homeにお任せ!

こんにちは。
開発チームのワイルド担当、まんだいです。

去年末、社内の納会でGoogle Homeをいただいたのですが、家でホコリをかぶっている状態だったので会社に持ってきて好き放題喋らせてみました。


 

用意するもの

今回使う備品は、Google Home(miniでも可)とPCだけです。

PCはRaspberry PIでなくても構いません。
とりあえず喋らせるだけなら、google-home-notifierが動けばなんでもいいです。
Windowsの場合、node-gypのリビルドが鬼門のようです。
このへんの記事が参考になるのではないかと。

私の場合、やろうと思っていたタイミングでCentOSのVMが起動していたので、VMでササッと作れてしまいました。

なお、nodeのcronモジュールがあると、定時連絡もできます。

 

下準備

 

Google HomeのローカルIPを調べておく

Androidの場合、Google Homeアプリから、調べられます。

左上の三本線からメニューを表示し、デバイスを選択します。
Google Homeと連携できていれば、「設定」を選んで一番下にIPアドレスが表示されているはずです。

 

node.jsのインストール

yumでもいいですが、なるべく新し目のものがいいです。
今回はnode.js v8.9.4を使っています。

 

PCとGoogle Homeの通信に必要なライブラリのインストール

nodeを用意した時点でnpmでgoogle-home-notifierをインストールしようとすると、次のような感じになることがあります。

npm install google-home-notifier

> [email protected] install /home/vagrant/Documents/googlehome/node_modules/mdns
> node-gyp rebuild

make: Entering directory `/home/vagrant/Documents/googlehome/node_modules/mdns/build'
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
In file included from ../src/dns_sd.cpp:1:0:
../src/mdns.hpp:32:20: fatal error: dns_sd.h: No such file or directory
 #include <dns_sd.h>
                    ^
compilation terminated.
make: *** [Release/obj.target/dns_sd_bindings/src/dns_sd.o] Error 1
make: Leaving directory `/home/vagrant/Documents/googlehome/node_modules/mdns/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:258:23)
gyp ERR! stack     at emitTwo (events.js:126:13)
gyp ERR! stack     at ChildProcess.emit (events.js:214:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12)
gyp ERR! System Linux 3.10.0-693.17.1.el7.x86_64
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/vagrant/Documents/googlehome/node_modules/mdns
gyp ERR! node -v v8.9.4
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
npm WARN [email protected] No description
npm WARN [email protected] No repository field.

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2018-03-17T06_56_20_006Z-debug.log

 

インクルードするdns_sd.hというヘッダファイルが存在しないというエラーですが、以下のコマンドを流せばヘッダファイルもインストールされます。

sudo yum install avahi-compat-libdns_sd-devel

 

node-gyp絡みでnpmを使ったインストールでエラーが出ることがありますが、node-gypは単にnode.jsで今回のようにC++で書かれたソースのコンパイルなどを自動化するツールなので、大抵ビルドに必要なファイルの不足が問題です。

nvmで導入すると、後片付けも楽かも知れませんね!

 

npmで必要なモジュールをインストール

あとはnpmから、必要なモジュールをインストールするだけです。

最低限必要なのは、google-home-notifierで、これがないとGoogle Homeとの連携はできません。
オプションでnode-cronを入れておくと、定期的にお喋りしてくれるようになるので、賑やかしに最適です。

# 作業環境の構築
mkdir path/to/project
cd path/to/project
npm init

# google-home-notifierのインストール
npm install google-home-notifier

# 定期実行(cron)用モジュールのインストール
npm install cron

 

簡単なソース

こちらで用意するコードはすこぶる簡単なので先にさらします。

// sample1.js
const googlehome = require('google-home-notifier');

const googlehome_name = 'Your Google Home Name';    // Google Homeの名前(なんでもいい)
const googlehome_ip = 'xxx.xxx.xxx.xxx';            // Google HomeのIPアドレス
const language = 'ja';                              // Google Homeに喋らせたい言語(usで英語です)
const message = 'おしゃべりするでー';                  // 喋らせたい内容

googlehome.device(googlehome_name, language);
googlehome.ip(googlehome_ip);

googlehome.notify(message, (res) => {
    console.log(res);
});

 

上記のソースをsample1.jsとして保存します。
実行は以下のコマンド。

node sample.js

 

ほぼ説明はいらないレベルですが、変更箇所は3つで、環境に合わせて入力してください。

  • googlehome_name
  • googlehome_ip
  • language

注意点としては、8行目、9行目あたり。
割とハマる人はハマるようで、本来なら、8行目だけでGoogle Homeに付けた名前で名前解決(DNS lookup)できるようですが、上手くいかないことが多いので、9行目でIPアドレスを指定しています。

IPアドレスを指定するなら、8行目はいらないじゃないかということですが、言語設定がdevice()メソッドからしかできなさそうなので、敢えて両方記述しています。

 

定期実行できるよう、発展させる

google-home-notifierモジュールが非常に良く出来ているせいで、こちらはほとんどすることがなかったため、もう少し発展させて、定期的に何かをしゃべる、できればcronで、ということで、そんな感じにしてみます。
Linuxのcronは使わず、npmモジュールのcronを使って実装してみたいと思います。

// sample2.js
const googlehome = require('google-home-notifier');
const CronJob = require('cron').CronJob;
const messages = require('./messages');             // 実行間隔と話す内容を書いてあるファイル

const googlehome_name = 'Your Google Home Name';    // Google Homeの名前(なんでもいい)
const googlehome_ip = 'xxx.xxx.xxx.xxx';            // Google HomeのIPアドレス
const language = 'ja';                              // Google Homeに喋らせたい言語(usで英語です)

googlehome.device(googlehome_name, language);
googlehome.ip(googlehome_ip);

messages.forEach((m) => {
    new CronJob({
        cronTime: m.schedule,
        onTick: () => {
            googlehome.notify(m.message, (res) => {
                console.log(res);
            });
        },
        start : true,
        timeZone: 'Asia/Tokyo',
    });
});

 

下が話す文章とスケジュールが書かれた定義ファイルです。

// messages.js
module.exports = [
    // 書き味はほとんどLinuxのcronと同じ
    {
      schedule: '0 0 10,13,16,19,22 * * *',
      message: 'ほげほげ'
    },

    // 秒という概念が先頭についていることに注意
    {
      schedule: '0 0 22 * * *',
      message: 'てすと'
    },

    // 数字、アスタリスク、カンマ、ハイフン、スラッシュで記述します
    {
      schedule: '0 */5 9-18 1,2,3 * *',
      message: '1月、2月、3月の9時~18時は5分おきにしゃべります'
    },
];

 

messages.jsを太らせれば色々話してくれてしばらくは楽しめそうです。

 

まとめ

喋れるデバイスがあるだけで、色々楽しめました。
何より今回は、google-home-notifierの抽象度がすごすぎて、こちらで何もする必要がないレベルといっていいほどですが、喋らせたい文字列を引数に与えるだけというのはすごいですね。もっと一般的になってもいいんじゃないかと思います。
ここまでがGoogle Homeのパッケージとして備わっていたら、もっと売れるんじゃないかなぁと思ったんですが、そうなると色々揃えすぎでしょうか?

 
以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
1,636
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

萬代陽一

ソーシャルゲームのウェブ API などの開発がメイン業務ですが、ありがたいことにマーケティングなどいろんな仕事をさせてもらえています。
なおビヨンド内での私の肖像権は CC0 扱いになっています。