こんにちは。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に好きな言葉を喋らせようと思います。
(追記:書きました。結構大変だった!)