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を直接喋らせることができるようになりました!
コメント