記事の内容を試す場合は自己責任でお願いいたします。
- Raspberry Pi Zero WH OSインストール
- Raspberry Pi Zero WHを使ってAmazon Echo Flexから音を出す
- Raspberry Piと赤外線LEDで家電を操作する
- Raspberry PiとBME280を利用して気温、湿度、気圧を測定する
- Raspberry Pi Zero WHにMackerelを導入して死活監視を行う
- Raspberry Piで照度を取得する TSL2572 TSL2561
- AlexaからRaspberry Piを経由して家電を音声で操作する
- AlexaをRaspberry PiのNodeREDから喋らせる
- Raspberry PiとAlexaでオリジナルスキルを作る 「今日のご飯は?」
- Raspberry Pi とSlackとLINE Messaging APIでLINEから家電を操作する
- Raspberry Piで収集したセンサー情報をMachinistに送信する
- Raspberry Piを使ってAlexaからゴミの日のお知らせをする
- Raspberry Piでダイソーのリモートシャッターを使う
- 2台のRaspberry PiとMySQLでレプリケーションを構成する
- iPhoneからRaspberry Piを経由して家電を操作する
- Raspberry PiでWebサーバを立ててブラウザから家電を操作する
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-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を直接喋らせることができるようになりました!
コメント