AlexaをRaspberry PiのNodeREDから喋らせる

Raspberry Pi

Raspberry PiからAlexaを喋らせる

これまで、Raspberry PiからBluetoothスピーカとして接続したAlexaから音声を出力していました。

これでも使えていたのですが、OpenJtalkの処理に時間がかかるため、しゃべるまで数秒から数十秒時間がかかっていました。

そこで、Bluetoothスピーカとしての出力ではなく、Alexaとして喋らせることを行います。

Alexaの音声処理が爆速なのですぐにしゃべるようになります。

node-red-contrib-alexa-remote2

NodeREDにnode-red-contrib-alexa-remote2というプラグインを導入することで直接Alexaと接続することができます。

ただい、このアプリは日本のamazonに対応していないので、少し修正する必要があります。

以下のサイトを参考にさせていただきました。ありがとうございます!!

Node-redを使ってAmazon Echoの買い物リストに追加する方法(alexa-cookie2 v3.4.1編)
Amazon Echoに接続されているスマートホーム機器をNode-redから操作する方法をご紹介します。これにより、WebAPI経由でAmazon Echoに接続されたスマート電球をつけるなどが実現可能となります。

感謝しかないのでこんなブログ見てる暇があったら、上記のサイトを訪問してください!!

一応メモっておきます。

node-red-contrib-alexa-remote2がNodeREDにインストールされている前提です。
インストール方法は調べればたくさんあるので省略です。

$ cd ~/.node_red
$ npm list
~~~ 略 ~~~
─┬ node-red-contrib-alexa-remote2@3.10.4
│ └─┬ alexa-remote2@3.3.1
│   ├─┬ alexa-cookie2@3.4.1
│   │ ├── cookie@0.4.1
│   │ ├── express@4.17.1 deduped

このファイルですね。バックアップして修正します。

$ cd node_modules/alexa-cookie2/
$ cp -p alexa-cookie.js alexa-cookie.js.20200916
$ vim alexa-cookie.js

262行目付近に1行追加します。

   261	        _options = __options;
   262		_options.baseAmazonPage='amazon.co.jp'; // add
$ cd /home/pi/.node-red/node_modules/alexa-cookie2/lib/
$ cp -p proxy.js proxy.js.20200916
$ vim proxy.js

181行目を新しく置き換えます。

181:		    //returnedInitUrl =  `https://www.${_options.baseAmazonPage}/ap/signin?openid.return_to=https%3A%2F%2Fwww.${_options.baseAmazonPage}%2Fap%2Fmaplanding&openid.assoc_handle=amzn_dp_project_dee_ios${_options.baseAmazonPageHandle}&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&pageId=amzn_dp_project_dee_ios${_options.baseAmazonPageHandle}&accountStatusPolicy=P1&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns.oa2=http%3A%2F%2Fwww.${_options.baseAmazonPage}%2Fap%2Fext%2Foauth%2F2&openid.oa2.client_id=device%3A${deviceId}&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.oa2.response_type=token&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.pape.max_auth_age=0&openid.oa2.scope=device_auth_access&language=${_options.amazonPageProxyLanguage}`;
182:		returnedInitUrl =  `https://www.amazon.co.jp/ap/signin?showRmrMe=1&openid.return_to=https%3A%2F%2Falexa.amazon.co.jp%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=amzn_dp_project_dee_jp&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&`;

noderedを再起動します。

$ sudo systemctl restart nodered.service

あとはこんな感じで設定して、指示されたIPアドレス:ポート番号に接続してAmazonアカウントでログインできればOKです!

ブラウザでipアドレスにアクセスしてamazonアカウントでログインします。

「接続が拒否されました」の表示が出るかもしれませんが問題ありません。

NodeREDに戻ってRoutine Speakが「Ready」になっていれば準備完了です。

あとは喋らせる言葉をtext欄に入れてinjectノードをつなげてボタンから叩けばAlexaが喋ります!

これで簡単にAlexaを喋らせることができるようになりました。

Shell Scriptから喋らせる

Alexaがしゃべるようになったのはいいのですが、このままではNodeREDからしか喋らせることができません。
私がNodeREDが苦手なだけなのですが、連携を強化する意味でもシェルスクリプトから喋らせるようにします。

ShellからNodeREDを実行するコマンドとかあるのかな?と思っていたのですが、探してみても見つからないため、別の方法を検討します。

以下の方法で実現できました。

まず、ストレージタブにあるWatchノードを作成します。
そこに適当なテキストファイルを指定します。今回は「alexa_speak.txt」というファイルにしました。

次に、fileノードと接続します。

それぞれこのように設定します。

こうすることで、alexa_speak.txtが更新されると、その内容で即時にAlexaが喋ります。

実際に使用するコマンドはこんな感じですかね。

$ echo "おはようワールド!" > /opt/nodered/alexa_speak.txt

これでシェルからNodeREDを経由してAlexaを直接喋らせることができるようになりました!

コメント

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