volumioをAmazon Alexaで音声コントロールする

今回の記事は、以下の環境で構築した際の備忘。
ハードウェア(ラズパイ):Raspberry Pi 2 Model B
ハードウェア(Amazon Alexa):Amazon Echo Dot(第一世代)
ソフトウェア(ラズパイ):volumio 2:volumio-2.587-2019-06-11-pi.img.zip
環境がアップデートされるとインストールが上手くいかなかったり、挙動が安定しなかったりするので注意(現時点でも安定しているかは微妙なのだが)。

今、自室で音楽をスピーカー環境で聴くのに、NASに入っている音楽をvolumio on Raspberry Piで再生し、Toppingの安物デジタルアンプからDALI ZENSOR PICOで流している。
どちらかと言うとBGM的に聞いているので夜寝ている間など小音量で流しっぱなしにしていたりする。
で、そのまま放置して翌朝寝ぼけながら支度をして出かける…と言う感じなのだが、音楽を切って出かけるのがめんどくさい。一番確実なのはアンプの電源を切ってしまうことなのだが、どっちかって言うとアンプの電源は入れっぱなしで放置している感じなので、それは避けたい。のでvolumioに停止コマンドを送ることになるのだが、PCをいったん起動してWeb UIから止めるのもめんどくさいし、Androidvolumioアプリを起動して停止コマンド送るのもめんどくさい(書いていて思うが、なんてものぐさなんだと思う)。
と言うことで、調べてみたところ、node-redと言う機能を活用してAmazon Alexavolumioをコントロールできるらしいと言うことを知った。ので試していたのだが、エラーが多くてなかなかうまく動いてくれない。最初は今年の4月頃に試行錯誤していた時に環境構築に成功したり、でも何かのはずみでvolumioを再起動すると環境が壊れてしまったり(サービス起動を忘れているわけでなく、node-redないしmpdのサービスが起動しなくなってしまう)…的なことを繰り返し、いったん環境構築を諦めた。
で、最近になってまた思い出し、試行錯誤したところなんとか動く体裁が整ったので、手順を備忘でメモ。

参考にしたサイト:
独身貴族のスマートホーム -Alexaからローカルの音楽を再生する- – Qiita
Alexaスマートホームスキル『Node-RED』を使ってみた | CHASUKE.com
Node-RED Alexa Home Skill Bridgeを設定する[On Onion Omega2+] – Qiita

手順は以下の通り。なお、緑の字は補足(失敗説明なども含む)なので読み飛ばしてもらっても構わない。

Node-RED Alexa Home Skill Bridge に登録作業をする

まずはRaspberry PiからもAmazon Alexaからも離れ、node-redを使うための前作業をする。
https://alexa-node-red.bm.hardill.me.uk/
に行き、アカウントを作成する。
Node-RED Alexa Home Skill Bridge
のデバイスのページで、デバイスを適当に登録する。

こんな感じで適当にNameDescriptionを登録し、ActionsON/OFF+%/-%をチェックする。もしかしたらApplication TypeLIGHTをチェックしておいた方がいいかもしれない。

なお、ここで指示したデバイス名でvolumioをコントロールすることになる。つまり、上記の例だと『アレクサ、カセットつけて』『アレクサ、カセット消して』など。この名前が若干やっかいで、音楽を管理するそれっぽい名前で、なおかつAlexaが認識しやすい簡単な名前がない。
・参考サイトだと「メディアサーバー」と名付けている:長くて言いにくい
・ヴォリューミオ(ボリューミオ):言いにくい
・ラズベリーパイ:長い
・ラズパイ:まあまあ妥当な選択肢か。3、4文字ぐらいが言いやすい。
・シーディー:言いにくかった
・オンガク:volumioではなく、Amazon AlexaのAmazon music?が勝手に再生になる。なお、うちの環境では何故か毎回真心ブラザーズのどか~んがかかる。
・いっそのこと好きなアニメキャラにする:「澤村・スペンサー・英梨々」にして、「エリリつけて」と声を掛けたら、「エーブイと言うデバイスは登録されていません」と答えやがった。アレクサは誤認識が多い。
とまあ、結構散々な目に合った(自業自得含む)。なお、最終的には『アレクサ、音楽つけて』『アレクサ、音楽消して』と言う定型アクションを登録する強引な技もある。また、デバイス名は後々で好きに変えたり追加したりも楽なのでいろいろ試すとよい。

Alexaスキル「Node-RED」を有効化

Amazon Alexaアプリを起動してセッティングしていくのもいいが、面倒なのでブラウザから制御できる部分はブラウザから。
https://alexa.amazon.co.jp/
スキルでNode-REDを検索し、有効化する。
上記のNode-RED Alexa Home Skill Bridgeに登録したアカウントでログインすると、スマートホームのデバイスでさっき登録したデバイスが検出できる。

なお、Node-RED Alexa Home Skill Bridgeでテスト的にいっぱいデバイス名登録したり更新したりすると、古いデバイスが削除されずいっぱい残ってしまうので、Amazon Alexa上で適宜削除する。

Raspberry Piにvolumioをインストール

Download |Get Started | Volumio
からvolumioのインストールイメージをダウンロードする。
イメージをWindowsPCmicroSDXCに焼く。僕の場合は
Win32 Disk Imager download | SourceForge.net
を使って焼いている。焼いたmicroSDXCRaspberry Piに装着し、電源を入れればvolumioの最初の起動画面が立ち上がる。
初期設定を一通り済ませて、以下の追加設定まで済ませておく。
・DHCPを切って固定IPに変更する。volumioのmpdとnode-redがかち合うせいか、エラーが出て接続できない場合があるので。固定IPに変更したらすぐに一回再起動する。結構時間がかかる場合もある。
http://volumio.local/dev/ でSSHアクセスをenableにする。sshでアクセスする。
> sudo dpkg-reconfigure tzdata でタイムゾーンをAsia/Tokyoにしておく。
ここまでやってnode-redをインストールする前準備が完了する。

volumioにnode-redをインストール

ここが一番の問題。
Node-RED日本ユーザ会 : インストール
Node-RED日本ユーザ会 : Raspberry Piで実行する
などを参考に、

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

をやると失敗する。インストール時にエラーメッセージが出る。そのまま強引に進めると再起動したときにmpdないしnode-red(またはその両方)が起動せず、無反応になる。

失敗する原因を調べていくとどうやら2つあって、1つの原因はbcryptのインストールに失敗すること。と言うのも、bcryptがvolumioで使えるバイナリの配布をやめてしまったからっぽい。上記スクリプトが作られた当時はバイナリがあったっぽい…。でいろいろやってみたが、volumio用のmakeが見つからなくて、僕の場合はソースからのコンパイルのやり方が分からなかった(単に素人ともいう)。
ログを見ると
node-pre-gyp WARN Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.5/bcrypt_lib-v3.0.5-node-v64-linux-arm-glibc.tar.gz
みたいなメッセージが出る。
もう1つの原因は、volumioで使うnode.jsとnode-redで使うnode.jsのバージョンが違うからっぽい。例えばvolumio 2.587では
> node -v
でバージョンを確認するとNode.js v8.11.1なのだが、上記コマンドでnode-redをインストールするとNode.js LTS 8.xあたりになってしまい、再起動後にnode-redはサービス起動するがmpdがサービス起動しなくなったりするのだ。この辺の挙動はvolumioのバージョンが変わるとまた違ってくるだろうが、いずれにせよ上記コマンドはraspbianなら動くのかもしれないけど現状volumioでは動かなさそうな感じだ。

と言うことで、スクリプトを使わずにインストールする。

> sudo npm install -g npm
> sudo npm install -g –unsafe-perm node-red

のコマンドを実行でnode-redをインストールする。これでも結局bcrypt(404)だよ!的に怒られるが強引に進める。

次にもし可能なら

> sudo systemctl enable nodered.service
> sudo npm install -g node-red-contrib-alexa-home-skill

をしておく。1つ目のコマンドはnode-redのサービスをvolumio起動時に自動実行、2つめのコマンドはnode-red起動後にどっちみち必要なスキルをあらかじめコマンドでインストール。
が現状僕の環境ではどっちもうまくいかなかった(bcryptがインストールエラーを吐いているせいなのか?)ので、1つめは以下の強引な手法で、2つめはnode-red起動後に作業する。

まず、
> sudo nano /opt/node-red.sh

#!/bin/sh
sudo node-red

で起動するスクリプトを作成。
sudo chmod a+x /opt/node-red.sh
で権限も与えておく。
次に、
sudo nano /etc/systemd/system/node-red.service

[Unit]
Description = simple service
After=network.target

[Service]
Type=simple
ExecStart= /opt/node-red.sh

[Install]
WantedBy = multi-user.target

でサービスを作って
sudo systemctl enable node-red.service
で強引にサービスを登録する。まあよく分かってる人から見るとすごくダサい解決法なのだろうけど…
これでrebootすると
http://volumio.local/
http://volumio.local:1880/
volumiompdvolumionode-redにアクセスできるようになる。

node-redでスキルをデプロイ

まずは右上のバーガーメニューから
→パレットの管理→ノードを追加
node-red-contrib-alexa-home-skillを検索して追加する。
これで左端に並んでいるノードにalexaが追加される。

次に、こんな感じでノードを並べる。

左上の灰色ノード:alexa:alexa home
左二番目の黄土色ノード:機能:switch
左三番目のサーモン色ノード(4つ):全部 その他:exec
一番右のウグイス色ノード:出力:debug

それぞれのノードの内容はこんな感じ。

アカウントでNode-RED Alexa Home Skill Bridgeのアカウントにログインする。すると下のデバイスに登録したデバイスが表示される(失敗することがあるので、ログインしなおしたり更新したりするとよい)。


スイッチは上からis true→1に、等々の順番を間違えないように。switchから出ていく線が上から順番に1、2、3、4なので間違えないように。
is true →1
is false →2
== 25 →3
== -25 →4


execのコマンドはそれぞれ以下の通り。

1:再生:bash -c “mpc play”
2:停止:bash -c “mpc pause”
3:音量+:bash -c “mpc volume +5”
4:音量-:bash -c “mpc volume -5”

本当はmpc stopで停止するはずなのだが、うちの今の環境では何故かmpc next相当の動作をする…。
この辺のコマンドが正しいかどうかは、volumiosshで接続して直接コマンドを打って確認した方が手っ取り早いです。
mpc(1) – Linux man page
一応コマンドはここに出ているけど、うちの場合、挙動としては
・volumio再起動時:mpcコマンドを打つとstatus:stopとなっている。この状態ではmpc playを入れても再生開始しない。
・Web UIで再生ボタンを押すと、当然だがstatus:playとなる(mpc 無印コマンドで確認)。この状態でmpc stopを入れると何故か次の曲を再生する。
status:playまたはstatus:pausempc playを打つと再生、同様にstatus:playまたはstatus:pausempc pauseを打つと一時停止になるのでこの動きなら問題ないものとする。

これで一通りnode-redの設定は終わり。デプロイする

alexaとvolumioの連携を確認する

すべて設定が終わったら、アレクサに命令して動作確認する。
『アレクサ、カセットつけて』
『アレクサ、カセットけして』
『アレクサ、カセットあかるくして』
『アレクサ、カセットくらくして』
など。メッセージがヘンテコなのは、Alexa上では電灯のデバイスとして認識されている都合上、仕方ない。

もう少しまともにする方法としては、Alexaアプリを開きマイ定型アクションを設定していくしかない(ブラウザ上のhttps://alexa.amazon.co.jp/からは設定できない)
アプリ上で「マイ定型アクションの追加」で
実効条件を追加:「アレクサ、音楽つけて」
アクションを追加:スマートホーム→デバイスをコントロール→カセット→電源:オン
などと設定してあげる。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください