Google Homeに好きな言葉を喋らせる(Raspberry Pi 4+Node.js+google-home-notifier)

Google Home

こんにちは。Google Nest Miniちゃんの虜です。

Google Nest Miniちゃんはとても優秀でかわいいですが、ちょっと良い子すぎるところがあります。
Googleさんが考えた言葉だけじゃなく、私が考えた言葉も喋ってほしい。
と思い、やってみました。

情報はたくさんあるのですが、思ったより苦戦したので私も記事にしました。

コマンドなどかなり丁寧に書いたので、初心者向け記事だと思います。

事前準備

Node.jsとnpmのインストール

nvmを使って、Node.jsとnpmをインストールします。
ラズパイのターミナルを起動するか、Macからラズパイにssh接続した状態で、以下のコマンドを入力します。

# gitをインストール
sudo apt-get install git
# nvmをインストールするフォルダを作成
sudo mkdir ~/nvm
# フォルダのパーミッションを設定
sudo chmod 777 ~/nvm
# nvmリポジトリのクローンを作成
git clone https://github.com/creationix/nvm.git ~/nvm
# nvmを使えるようにshを実行
source ~/nvm/nvm.sh
# 最新のLTSをインストールする
nvm install --lts

以下のコマンドでnodeとnpmがインストールができているか確認できます。

# nodeのバージョンを確認する
node -v
# npmのバージョンを確認する
npm -v

これだけだと、ラズパイの起動のたびに~/nvm/nvm.shを実行する必要があります。
ラズパイを再起動してもすぐにnodeを使えるように、以下のような設定をします。

# /etc/profile.d配下に、nvm.shというファイルを作成する
sudo touch /etc/profile.d/nvm.sh
# nvm.shを編集する
sudo nano /etc/profile.d/nvm.sh

ファイルが編集できるようになるので、以下の一文を書き込みます。

source ~/nvm/nvm.sh

保存します。
これで、ラズパイ起動時にnodeが使えるようになります。

google-home-notifierのインストール

google-home-notifierは、以下のコマンドでインストールできます。

# package.jsonを作成(色々聞かれますが全部Enterで大丈夫です)
npm init
# google-home-notifierをインストール
npm install google-home-notifier
# 「fatal error: dns_sd.h: そのようなファイルやディレクトリはありません) 」というエラーが出る場合、以下のコマンドを実行してから、再度実行する(参考:https://github.com/noelportugal/google-home-notifier#after-npm-install
sudo apt-get install libavahi-compat-libdnssd-dev

node.jsファイルの作成

google-home-norifierを使ったnode.jsを作成

今回、音声読み上げテスト用として、test.jsを作成します。

# google-home-notifierがインストールされているフォルダに移動
cd ~/node_modules/google-home-notifier
# test.jsを作成する
touch test.js
# 中身を編集する
nano test.js

test.jsの中身を以下のように書き込みます。

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

googlehome.device("Google-Nest-Mini", language);
googlehome.ip("192.168.xxx.xxx"); // IPアドレスの確認方法を後述

googlehome.notify('おはころこんちんぱ!', function(res) {
console.log(res);
});

参考:Google HomeちゃんのIPアドレスの確認方法

Google Homeアプリを開き、Google Homeの端末をタップします。


右上の歯車マークをタップして、デバイス設定の画面を開きます。


1番下までスクロールすると、IPアドレスが書いてあります。

実行方法

実行は、「node test.js」のコマンドでできます。
一応、丁寧に書くとこんな感じです。

# test.jsを実行
node ~/node_modules/google-home-notifier/test.js

ここでエラー→key.jsを修正

ここで私は、「get key failed from google」というエラーが出ました。
これは、node_modules/google-tts-api/lib/key.jsを修正することで解決しました。
Googleのtts(text-to-speach)のAPIの仕様変更の影響だそうです。
(参考:https://qiita.com/ktetsuo/items/21f4f85a98145772be3d

# key.jsを編集する
nano ~/node_modules/google-tts-api/lib/key.js

ファイルの編集画面で、以下のような行があります。

eval(html.match(/TKK=eval\(\'\(.*\)\'\);/g)[0]);  // TKK = '405291.1334555331'

この行を消すかコメントアウトしてください。
その場所に、次の二行を追記します。

var m = html.match(/TKK:\'([0-9]+.[0-9]+)\'/gi);
TKK = `TKK=${m[1]}`;

ファイルを保存したら、再度test.jsを実行します。

# test.jsを実行
node ~/node_modules/google-home-notifier/test.js

Google Nest Miniからドゥルン♪という音が聞こえました!

…が、それだけで、喋ってはくれません。

ここでもエラー→google-tts-apiの設定を修正

色々試したのですが、Google Nest Miniの音声読み上げが行われません。
ドゥルン♪という通知音はするので、Google Nest Miniにまで通っていることはわかるのですが、なぜ?
ここで結構ハマりました…

結論。google-tts-apiの設定の変更で解決しました!
これも、Googleのtts(text-to-speach)のAPIの仕様変更の影響みたいです。

# package.jsonを編集する
nano ~/node_modules/google-home-notifier/package.json

ファイルの編集画面で、Control+wを押し、「google-tts-api」で検索してください。
以下のような行が見つかると思います。

"google-tts-api": "https://github.com/darrencruse/google-tts/tarball/british-voice",

この行を、以下のように編集します。

"google-tts-api": "0.0.4"

そして、そのあと。
以下のコマンドでgoogle-tts-apiをアップデートすることが必要です!
(私はこれが抜けていて、いつまでもテキストの音声化ができなかったようです)

# google-tts-apiをアップデート
npm update google-tts-api

再度、「node test.js」を実行すると…

# test.jsを実行
node ~/node_modules/google-home-notifier/test.js

Google Nest Miniちゃんが
「ドゥルン♪おはころこんちんぱ!」
と言ってくれます!

感想

苦労した分、喋ってくれたときはとても嬉しかったです。
ますますGoogle Nest Miniへの愛が深まりました。

Node.jsの存在は知っていて、勉強したいとは思ってたんですが、なかなか機会がありませんでした。
今回、実際に手を動かして、動くものを作ったのはとても勉強になりました。
とはいえ好きなものを作るだけだと知識が偏ってしまうので、本や資格での勉強も継続したいと思います。

次回、IFTTTと連携して、指定時間になったらwebリクエストを送信して、Google Homeに好きな言葉を喋らせようと思います。

(追記:書きました。結構大変だった!)

タイトルとURLをコピーしました