2021年1月にGoogle Homeを購入して、家庭に便利なシステムの構築に励んでいます。とりあえず、第一弾として表題の通り、家庭内要望として、NAS内にあるmp3ファイルを再生するシステムの製作を開始しました。
前回までのまとめ
目標動作
- Google Homeに話しかけると、話しかけた内容に応じた曲を再生する。
- 再生する曲はLAN内に設置されたNASに記憶しているmp3から選択する。
システムの構成
必要な物理デバイスおよび環境
手持ち部品であるGoogle Nest Mini、RaspberryPi Zero W、IOデータNASの組合せで実現することを付帯条件として設定しています。そこで以下の構成を考えました。なお、()は本記事で使用している機種です。
- Google Home (機種:Google Nest Mini)
- RaspberryPi (RaspberryPi Zero W)
- NAS (IOデータlandisk)
- 無線LANとインターネット環境
- 開発用PC (Windows10搭載PC)
システム構成全体
今回やること
前回までで、Windows機から、node.jsおよびgoogle-home-notifierを利用して、Google Homeに発話命令を送ることと、Google HomeにNAS上のmp3を再生する命令を送ることができました。更に、RaspberryPiにNASをマウントすることができましたので、Windows機上で動かしたスクリプトをRaspberryPiに移植する準備が整いました。
今回は、スクリプトをRaspberryPiに移植していきます。
RapberryPiの環境を整える
参考リンク
以下のリンク先の記事「ラズパイZero WにGoogle-Home-Notifierを導入(手順メモ)」を参考にさせていただいております。
https://www.kuro14.net/2017/12/zero-wgoogle-home-notifier.html
SSHでRaspberryPiにログインし、参考リンクの記述に沿って、以下のコマンドを順に実行します。
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n lts
次に
sudo apt-get install git
cd ~
git clone https://github.com/noelportugal/google-home-notifier
cd google-home-notifier
そして
sudo nano package.json
として、package.jsonを開きます。”google-tts-api”で始まる行を
"google-tts-api": "0.0.6",
と変更します。
ライブラリのインストール
google-home-notifierから参照されているmdnsライブラリがそのままでは動作しませんので、https://github.com/noelportugal/google-home-notifierに記載されている説明に従って、RaspberryPi上で、追加のライブラリをインストールしておきます。以下のコマンドを打ち込みます。
sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
そして、package更新のために
npm install
とコマンドを実行します。
としてパッケージの更新をかけてみます。mdnsに関連したモジュールをコンパイルしているような表示とともに、大量のメッセージが画面に表示されます。
よく見ると、大量に出ているのはerrorではなくwarningのようですので、とりあえず完了を待ちます。以下は実際に表示されたwarning表示の一部です。
In file included from ../src/mdns.hpp:11,
from ../src/dns_sd.cpp:1:
/home/pi/.cache/node-gyp/10.23.2/include/node/node.h:573:43: warning: cast between incompatible function types from ‘void (*)(v8::Local<v8::Object>)’ to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
(node::addon_register_func) (regfunc),
よく読むと、errorではなくwarningなので、ビルドが完了すればOKにします。
再度、https://github.com/noelportugal/google-home-notifierに記載されている説明に従って、mdns/lib/browser.jsを開くために
sudo nano 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にファイルを配置する
開発機で作成したgoogle-home-notifierのディレクトリをRaspberry Piに移動していきます。
開発機の中のgoogle-home-notifierディレクトリにあるファイルのうち、以下のものをNASに移動します。
- google-home-notifier.js
- mp3_webserver.js
- go.js
筆者の環境では、上記ファイルをすべて
\\LANDISK-201129\disk1\music\raspberrypi\google-home-notifier
に配置しました。
RaspberryPi上からはNASはマウントされ、上記ののディレクトリは/mnt/nas_music/raspberrypi/google-home-notifier/のパスでアクセスできます。そのため
cd ~/google-home-notifier
cp /mnt/nas_music/raspberrypi/google-home-notifier/*.js .
とすると、Windows機で作成したjsファイルがRaspberryPiの~/google-home-notifierに移動します。更に、
cd ~/google-home-notifier
node mp3_webserver.js /mnt/nas_music 8091 &
とするとwebserverがバックグラウンドジョブで立ち上がります。
一旦、RaspberryPiのIPアドレスを確認するコマンドを実行します。
ip -4 a show wlan0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
次に
node go.js xxx.xxx.xxx.xxx 8091 "演奏開始前に喋る内容" example01.mp3
と入力します。
- xxx.xxx.xx.xxxはRaspberryPiのIPアドレスです。
- example01.mp3はNASに用意したmp3ファイル名に適宜読み替えてください。
これで、スピーカーが”演奏開始前に喋る内容”を発話した後にexample01.mp3の再生が始まれば成功です。
systemctlによるexpress起動の設定
mp3_webserver.jsがシステム起動後に常時起動するように設定します。
sudo nano /etc/systemd/system/mp3_server.service
と打って、systemdの設定ファイルを作成します。以下のように入力して保存します。
[Unit]
Description=mp3 server for google nest
[Service]
ExecStart=node /home/pi/google-home-notifier/mp3_webserver.js /mnt/nas_music 8091
Restart=always
RestartSec=5
Type=simple
WorkingDirectory=/home/pi/google-home-notifier/
[Install]
WantedBy=multi-user.target
これで、
sudo reboot
として再起動します。
再度SSHでログインし、
cd google-home-notifier
node go.js xxx.xxx.xxx.xxx 8091 "演奏開始前に喋る内容" example01.mp3
と入力し、発話およびmp3再生がされれば成功です。