こんにちはSakaeです。

弊社はデータクローリング専業という珍しい業態の会社ではありますが、事業の一角にヴォイスインターネット事業を抱えており、Amazon Alexa / Google Assistant向けのスキル開発も手がけています。今回はヴォイスインターネット関連のテーマで一記事書かせていただきました。

ルーターのクローリング事業とスマートスピーカースキルの相性

一見、クローラーとスマートスピーカーは縁のない組み合わせのように感じますが、ルーターはスマートスピーカーこそ、クローリング専業の弊社にふさわしい「新時代のUI」だと考えています。

というのも、スマートスピーカーの裏側を支えているのは、データとインターネットの世界だからです。例えば、

  • スマートスピーカーを使って今日の営業先リストを確認したい場合、スマートスピーカーは自社データベースの営業アタックリスト一覧テーブルの中身を参照すれば良いわけです。そして、その営業先のアタックリスト自動収集には弊社のクローラーがお役に立てる領域となります。
  • スマートスピーカーを使って自社のECサイトの「今日のおすすめ商品」を紹介したい場合、スマートスピーカー向けのAPIなどを新たに作らなくとも、スマートスピーカーへの発話をトリガーとしてクローリングを行い、自社ECサイトのHTMLの最新情報を収集・加工して、スマートスピーカーに喋らせれば良いですね。

というように、データ収集とWebの世界に強みを持つルーターに取って、スマートスピーカーはとても相性の良いデバイスとなりえます。

そして何より、Webデザインには「デザイン」というエンジニアの大敵がいますが、スマートスピーカーのインターフェースは「言葉」なのでエンジニアでも十分対応できます。そして長いことこの事業をやってきた結果、ボイスUIの言語デザインのコツというものにもかなり習熟してきました!(新しいデバイスであるスマートスピーカーは、その道のプロがまだいない世界なので、事業として実践で積み重ねてきた経験が武器になると思います!)

前置きが長くなりましたが、表題の通り今回はGoogle Homeでプッシュ発話をするためのセットアップ手順について書いていこうと思います。

スマートスピーカーにはプッシュ発話ができない

「プッシュ発話」というのは、スキル(スマートスピーカーアプリのこと)製作者の意図したタイミングで、スマートスピーカーに喋らせることです。

ルーターの新規記事公開のタイミングで、「ルーターの開発社ブログが更新されたよ♪さっそく読んでみようよ!」などと各ご家庭のスマートスピーカーに発話させたい欲求はありますが、それはAmazon AlexaでもGoogle Assistantでも、今の所サードパーティ製スキルからのプッシュ発話は許可されていません。(デバイスが軽く光るなどの、間接的なプッシュ通知はありますが、ちょっとそれじゃない感じです。)

恐らくその理由は、各スキル開発者がこぞってプッシュ発話機能を埋め込みまくると、各ご家庭のスマートスピーカーがオウムやキュウカンチョウのように、昼夜問わず四六時中喋りっぱなしになるためと思われます。(汗)

ところが、結構ポピュラーな手法ではありますが、Google Homeでは、あるデバイスを用いることで擬似的なプッシュ発話を行うことができるようになっています。

Google Homeでプッシュ発話できる「google-home-notifier」とは

Google Assistantからのプッシュ発話はできないGoogle Homeですが、それ自体はスマートスピーカーの呼び名の通り「スピーカー」なので、Google Homeをスピーカーとして利用し音源を流すことができれば、それはすなわち擬似的なGoogle Homeのプッシュ発話となります。

その機能をまとめて提供してくれているのが、google-home-notifierというライブラリです。このライブラリは任意の文字列をGoogle翻訳APIを利用して音声ファイル化し、Google Homeのスピーカーを通して再生することができます。つまり、文字列を渡すとGoogle Homeで発話するということです。

あくまでスピーカーとして「発話」させるだけなので、「会話」することはできません。自作のスキルと会話させたいのであれば、『お耳寄りな情報がございます!「ねぇ、グーグル、XXXXを開いて」と呼びかけてください』のように、スキルの利用を促すようなプッシュ発話にする必要があります。

このgoogle-home-notifierは、npmライブラリとして提供されているので、nodeを動かせるOSがあればどんなコンピュータからでも使えるわけですが、一般的には安価なRaspberry PiをGoogle Homeと同一LAN内に置き、ラズパイ上でgoogle-home-notifierを実行してGoogle Homeから発話させるというのが王道パターンとなっています。

が、ラズパイ上でのgoogle-home-notifierのセットアップに若干手こずったので、これが最新版!と言える手順を備忘の意味も含めて残しておきたいと思います。

Raspberry Pi上でgoogle-home-notifierの実行環境を構築する手順

Raspberry Piは最新版のRaspberry Pi3 model B+、OSはRaspbianを利用します。ラズパイ3は本体にWi-Fiモジュールが内蔵していて、別途USBのWi-Fiドングルなどを刺さなくてよいのが嬉しいです。

ラズパイ上にRaspbianをインストール

ラズパイ3にRaspbianをインストールしてください。ここはNOOBSを使うのが楽かなと思います。本記事でのRasbbianバージョンは以下の通りです。

pi@raspberrypi:~ $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

pi@raspberrypi:~ $ cat /etc/debian_version
9.8

パッケージマネージャーの最新化

最初に、Raspbianのパッケージマネージャーaptを最新化しましょう。

$ sudo apt update & apt upgrade

node.js, npmの導入

次に、aptを使ってgoogle-home-notifierを実行するための、Node.jsnpmをインストールします。

$ sudo apt install -y nodejs npm

が、aptでインストールしたNode.jsはバージョンが非常に古いものになっています。さらにnpmもかなり古いです。

pi@raspberrypi:~/Development $ node --version
v8.11.1

pi@raspberrypi:~/Development $ npm --version
1.4.21

そこで、nという、まさかの1文字の名称のnpmパッケージを使って、Node.jsバージョンを最新LTSバージョンまでアップデートします。

$ sudo npm cache clean
$ sudo npm install npm n -g
$ sudo n lts

念の為、この後、一度ログアウト・ログインしてログインシェルを再読込し、PATHや環境変数周りを読み込ませましょう。(sourceで.bashrcを再読込してもダメな場合がありました。)

再度Node.jsとnpmのバージョンを確認してみます。

pi@raspberrypi:~ $ node --version
v10.15.3

pi@raspberrypi:~ $ npm --version
6.4.1

これで執筆時の最新LTSバージョンであるNode.js ver10.15.3のnode実行環境ができあがります。

google-home-notifier依存パッケージをインストール

さらに、google-home-notifier実行にひつようとなる下記のパッケージ群をインストールします。

$ sudo apt install -y vim git-core libnss-mdns libavahi-compat-libdnssd-dev

ここでも念の為ログアウト・ログインしてください。

google-home-notifierインストール

最後に今回の目的でもあるgoogle-home-notifierをインストールしましょう。

$ mkdir ghn
$ cd ghn
$ pwd
/home/pi/Development/ghn
$ npm install google-home-notifier

google-home-notifierの事後設定

若干メンテナンスの手が回っていないのか、一手間を加えないとgoogle-home-notifierが正常に実行できません。そのため、後述の設定を行ってください。

google-tts-apiのバージョンアップ

先の説明の通り、google-home-notifierではテキストを音声化するためにGoogle翻訳のTTS APIを利用しているとのことです。しかし、npmでインストールしたgoogle-home-notifierで利用されている、古いバージョンのgoogle-tts-apiは現状利用できなくなっているようなので、下記のようにgoogle-tts-apiの利用バージョンを0.0.4(執筆時点で最新)に修正する必要があります。

$ pwd
/home/pi/Development/ghn
$ vim node_modules/google-home-notifier/package.json
  "bundleDependencies": false,
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "https://github.com/darrencruse/google-tts/tarball/british-voice",
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },

↓以下のように "google-tts-api": "0.0.4" に修正

  "bundleDependencies": false,
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.4",
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },

修正したpackage.jsonで更新

$ cd node_modules/google-home-notifier/
$ npm update google-tts-api

browser.jsの修正

さらに、公式githubリポジトリにも記載の手順ですが、下記のようにbrowser.jsの一部を書き換える必要があります。

$ pwd
/home/pi/Development/ghn

$ vim node_modules/mdns/lib/browser.js

で以下の箇所を

Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
, rst.makeAddressesUnique()
];

以下のように修正

Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
, rst.makeAddressesUnique()
];

以上でRaspberry Pi 3へのgoogle-home-notifierの導入手順は完了です!

google-home-notifierのテスト実行

Raspberry Pi 3上にgoogle-home-notifierの実行環境ができあがりましたので、下記のようにサンプルソースを作成して実行してみましょう。

実行用サンプルソース

構成としてはmain.jsがgoogle-home-notifierの呼び出し処理で、push_msg.shはそれをラップした実行用シェルスクリプトです。push_msg.shのMSGに発話させたい文言を入力します。下記の例ではdateコマンドで動的に現在時刻を取得しています。

main.js

const googlehome = require('google-home-notifier')
const language = 'ja';

const msg = process.argv[2]

googlehome.device('Google-Home', language);
googlehome.notify(msg, function(res) {
  console.log(res);
});

push_msg.sh

#!/bin/bash

MSG=`date +%H時%M分をお知らせします。`

node main.js $MSG

サンプルプッシュ発話実行!!

いざプッシュ発話を実行してみます。

bash push_msg.sh

XX時XX分をお知らせします。

と愛しい声がGoogle Homeから聞こえてくれば成功です。crontabに下記のように記載しておけば、時報代わりにもなりますよ。

00 * * * * /bin/bash -l -c 'cd /home/pi/Development/ghn; bash push_msg.sh'

まとめ

ルーターでもこれまでスマートスピーカースキルの制作、リリースをいろいろとおこなってきました。しかし、いざスマートスピーカーをビジネス用途で利用しようとすると、今回のプッシュ発話をはじめ、ちょっとかゆいところに届かないという点があるというのが実情です。

今後のスマートスピーカー業界の進化に期待しつつ、現状、我々にできることとして今回のラズパイを併用したスマートスピーカーのプッシュ発話や、得意のクローラーを絡ませたスキルなど、ひとつ上のスマートスピーカーの利用方法もルーターのスマートスピーカースキル開発ではご提供しています。

「スマートスピーカーをビジネスで使っていきたいが、かゆいところにちょっと手が届かない・・・」

そんなお悩みがありましたらぜひお問い合わせください!