はじめに
Sonos を enebular (Node-RED) から操作するノードを調べていた時に Amazon Polly を利用する TTS (Text To Speech) ノードを見つけて、それを使用できるようにするメモです。
Sonos とは
米国サンタバーバラ生まれのワイヤレスホームサウンドシステムです。
https://www.sonos.com/ja-jp/home
Sonos を操作するツールを調べたメモ
https://qiita.com/kitazaki/items/ccde18e10f49fcbb9437
Amazon Polly とは
深層学習を使用して文章をリアルな音声に変換するサービスです。日本語は女性 (Mizuki) と男性 (Takumi) の声が用意されています。
https://aws.amazon.com/jp/polly/
環境
Sonos と同じネットワークに Raspberry Pi を接続して enebular agent をインストールすれば、sonospollytts ノードは問題なく使用できます。
動作概要
- Amazon Polly サービスに対してテキスト文章を送信します。
- テキスト文章から音声変換された mp3 ファイルをダウンロードします。
- Raspberry Pi から Sonos へ mp3 ファイルを再生することを指示します。
- Sonos から Raspberry Pi へアクセスし、mp3 ファイルを取得して再生します。
Raspberry Pi Desktop
ブラウザでアクセスするクラウド環境の enebular は Heroku へデプロイされるため使用できません。問題になるのは動作概要 2. で、ダウンロードされた mp3 ファイルは一時的にストレージ (デフィルトでは /tmp ディレクトリ) に保存される実装になっているため、エラーとなります。
Raspberry Pi が手元に無い場合、他の選択肢としては 仮想環境で動作する Raspberry Pi Desktop へ enebular agent をインストールして使用する方法があります。

enebular editor
enebular editor は ポート番号 1888 で起動する (Node-REDは通常、ポート番号 1880 で起動する) ため、sonospollytts ノードのポート設定を変更すれば動作します。(sonospollytts ノード Version 1.0.21 まで)
動作概要 2. で、ダウンロードされた mp3 ファイルは enebular editor を動作させている PC (今回は MacBookPro を使用) のストレージ (デフォルトでは /tmp ディレクトリ) に保存されます。

※2019/11/11 更新
sonospollytts ノードが 1.1.0 にバージョンアップされ、Node-RED の Webserver 機能の利用ではなく、sonospollytts ノード自体の Webserver 機能の利用に変更された (Sonos の HTTPS SSL certificate 問題の対策) ため、ポート番号が 1980 に変更されました。そのため、sonospollytts ノードのポート設定を変更する必要が無くなりました。

準備
- MacBookPro (macOS Mojave 10.14.6)
- VirtualBox (6.0.14)
- https://www.virtualbox.org
- Debian Stretch with Raspberry Pi Desktop (2019-04-11-rpd-x86-stretch.iso)
- https://www.raspberrypi.org/downloads/raspberry-pi-desktop/
※ Debian Buster with Raspberry Pi Desktop (2019-09-25-rpd-x86-buster.iso) がリリースされていますが、enebular agent のサポート対象外なので、1つ前のリリースの Stretch で動作確認しました。
- enebular-agent (2.8.0)
- enebular editor (0.12.0)
Raspberry Pi Desktop のインストールと VirtualBox の環境設定
- VirtualBox のインストール
VirtualBox をインストールします。合わせて拡張パック (Extension Pack) もインストールします。

- Raspberry Pi Desktop のインストール
VirtualBox のメニューから「仮想マシン」→「新規」を選択して、新しい仮想マシンを追加します。
名前「(任意)」
タイプ「Linux」
バージョン「Linux 2.6 / 3.x / 4.x (64-bit)」
メモリーサイズ「2048MB」
仮想ハードディスク「VDI」「可変サイズ」「16.00GB」


- Raspberry Pi Desktop の起動
VirtualBox のメニューから「仮想マシン」→「起動」を選択して、Raspberry Pi Desktop を起動します。起動後、Raspberry Pi Desktop のインストールを行います。

- VirtualBox の環境設定
VirtualBox のメニューから「仮想マシン」→「設定」を選択して、「ネットワーク」→「アダプター 1」→「高度」で「ポートフォワーディング」の設定を行います。仮想マシンのネットワークアダプターは NAT で割り当てられているため、ホスト OS (今回は macOS) からゲスト OS (Raspberry Pi Desktop) への通信を転送する必要があります。



-
enebular-agent のインストール
フローのデプロイが楽になるため、AWS IoT を利用して enebular-agent をインストールします。
(参考) Raspberry Pi を AWS IoT に繋いで enebular と連携
https://qiita.com/kitazaki/items/ffd50396cb09d6ab7050
(参考) enebular agentをバージョンアップ(2.5.0)してみた。
https://note.mu/kitazaki/n/n09fb4c73785f -
フローのデプロイ
enebular web dashboard または enebular editor からフローをRaspberry Pi Desktop へデプロイします。


enebular editor の起動
enebular editor の場合は、インストールや設定の必要は無く、デスクトップモードでフローを起動すればOKです。
サンプルフロー
inject ノードと sonospollytts ノードを接続します。debug ノードは無くても動作には問題ありません。
inject ノードの編集を行います。ペイロードは「文字列」を選択し、値に発話させたい文章 (ここでは「こんにちは」 )を設定します。
sonospollytts ノードの編集を行います。
Polly Config は AWS IAM で作成した Polly Access key と Polly Secret key を設定します。
Polly Voice は 日本語では Mizuki (女性) と Takumi (男性) から選択できます。
Sonos IP は Sonos に割り当てられた IP アドレスを設定します。
Sonos Hailing は Disable を設定します。
Node-Red IP は ホスト OS に割り当てられた IP アドレスを設定します。 ゲスト OS に割り当てられた IP アドレスは設定しません。
まとめ
Sonos の指定した mp3 を再生する機能と Amazon Polly を利用して Sonos から発話させてみました。
音楽を再生している途中で Sonos が突然しゃべり始めると、ちょっとビックリすると思います。(笑
良き Sonos ライフを!