はじめに
WindowsからAlexa端末(Amazon Echo や FireTV,FireHD)にしゃべらせたり、MP3を再生させたりする方法です。
下記で紹介した内容を、Windowsから実施できます。
スクリプトから Fireタブレットや FireTV Stick にしゃべらせる – パソコン鳥のブログ
Amazon Echo でMP3ファイルを再生する(Linux) – パソコン鳥のブログ
スクリプトからEchoでAlexa Skills Kitサウンドライブラリのサウンド再生 – パソコン鳥のブログ
以前紹介した下記記事の方法では動作しなくなっていますが、本記事の方法で動作できます。
また、下記では「Amazonの認証で 2段階認証をするようにしている場合は対応できません。」となっていますが、本記事の方法では 2段階認証でも設定できます。
Windows10 から Alexa端末にしゃべらせる – パソコン鳥のブログ
準備(リフレッシュトークンの取得用)
リフレッシュトークンは、クライアント専用に割り当てられる値のため、以下の作業はクライアントごとに必要です。
Node.js を Windows にインストールします。
下記の Windows Installer (.msi) の箇所からダウンロード・インストールしてください。
リフレッシュトークンを取得するために、alexa-cookie-cli を使用します。
下記からダウンロード・展開してください。
2024.1.29時点の alexa-cookie2 で下記の取り消し線の作業は不要になりました。展開してできたファイル package.json の alexa-cookie2 の箇所を次のように修正します。
(参考:アレクサでインターホンの通知をする #Python – Qiita)
修正前
"alexa-cookie2": "^4.0.1",
修正後
"alexa-cookie2": "^4.1.3",
コマンドプロンプトを開き、alexa-cookie-cli を展開したディレクトリ(package.json があるディレクトリ)に移動します。
次のコマンドを実行します。
npm install
実行で、
To address all issues, run:
npm audit fix
のような表示が出たら、次のコマンドを実行します。
npm audit fix
これで、リフレッシュトークンの取得の準備は完了です。
リフレッシュトークンの取得
エクスプローラでアドレスバーに %TEMP% と入力・Enterを押します。
開かれた場所で、.alexa で始まるファイルがあれば削除します。
続けて、コマンドプロンプトを開き、alexa-cookie-cli を展開したディレクトリ(package.json があるディレクトリ)に移動します。
次を実行します。
実行で、「Error: Please open http://127.0.0.1:8080/ with your browser and login to Amazon. The cookie will be output here after successfull login. / null」と出ても気にしないでください。
2024.1.29 Error:の文面を、2024.1.29時点のものに修正しました
2024.1.23 -a ja-JP から -a ja_JP に修正しました
node cli.js -p amazon.co.jp -a ja_JP -P 8080
上記実行で、待ち状態になります。
上記を実行したWindowsマシン上で、ブラウザで http://127.0.0.1:8080 にアクセスし、Amazonのアカウントでサインインしてください。
2024.1.29 ブラウザでアクセスするURL を http://localhost:8080 から http://127.0.0.1:8080 に修正しました
ブラウザでサインインすると、上記の node cli.js~を実行していたコマンドプロンプトに、Atnr| で始まるコードが表示されます。
2024.1.29 追記
2段階認証の画面が出たら、指示に従って操作してください。
これがリフレッシュトークンです。
後で、alexa_remote_control.sh に設定します。
node cli.js~ を実行していたコマンドプロンプトで CTRL-C を押して終了させます。
ブラウザは閉じて構いません。
また、alexa-cookie-cli を展開したディレクトリは消してOKです。
alexa_remote_control.shの設定
https://frippery.org/busybox/ の「The latest version is always busybox.exe. 」から busybox をダウンロードします。
https://stedolan.github.io/jq/ の Download jq ボタンから Windows(AMD64) を選択し、jq-windows-amd64 をダウンロードします。
https://raw.githubusercontent.com/thorsten-gehrig/alexa-remote-control/master/alexa_remote_control.sh にアクセスし、alexa_remote_control.sh を保存します。
alexa_remote_control.sh 内の SET_REFRESH_TOKEN に、先ほどの「リフレッシュトークンの取得」の手順で取得したリフレッシュトークン(Atnr| で始まるコード)を記述します。
また、alexa_remote_control.sh 内のその他の変数を下記のように設定します。
SET_LANGUAGE='ja-JP'
SET_TTS_LOCALE='ja-JP'
SET_AMAZON='amazon.co.jp'
SET_ALEXA='alexa.amazon.co.jp'
SET_OPTS=' --http1.1'
SET_CURL='curl'
SET_JQ='./jq-windows-amd64'
alexa_remote_control.sh 内には SET_EMAIL、SET_PASSWORD の変数がありますが、使用されないので設定不要です。
デフォルトのままでもいいですし、コメントアウトしてもいいです。
続けて、alexa_remote_control.sh内の行を修正します。
変更前
print "s/"$1" "$2" "$3" "$4" "$5"/'"$(date -d "$x" -u +"%s")"'/g"
変更後
print "s/"$1" "$2" "$3" "$4" "$5"/'"$(powershell -executionpolicy bypass -File getepoch.ps1 "$x")"'/g"
alexa_remote_control.shと同じ場所に、getepoch.ps1 を次の内容で作成します。
((Get-Date($args[0])) - (Get-Date("1970/1/1 0:0:0 GMT"))).TotalSeconds
なお、このPowerShellスクリプトでは指定日時表記をUNIXTIMEに変換していますが、下記ページを参考にしました。
PowerShell/UNIXTIMEを取得する方法 – Windowsと暮らす
上記で用意した busybox、jq-windows-amd64、alexa_remote_control.sh、getepoch.ps1 を同じ個所に置きます。
Alexa端末名の確認
「alexa_remote_control.shの設定」で用意した、alexa_remote_control.shがある場所でコマンドプロンプトを開きます。
(PowerShell では以降のコマンド実行で日本語を含む表示が文字化けします)
次のコマンドを実行します。
chcp 65001
次のコマンドを実行します。
busybox.exe sh alexa_remote_control.sh -a
Alexa端末の一覧が以下のような感じで表示されます。
以降のコマンドで指定する端末名は、ここで表示されたものを指定します。
the following devices exist in your account:
子供部屋
リビング
台所
FireHD8
FireHD7
Fire TV stick
This Device
もし表示されない場合は、エクスプローラでアドレスバーに %TEMP% と入力・Enterを押し、開かれた場所で、.alexa で始まるファイルがあれば削除します。その後、再度実行してみてください。
Alexa端末に Windowsからしゃべらせたり、MP3を再生させる
下記で紹介した内容を、Windowsから実施できますが、alexa_remote_control.sh の実行は本項目の内容に従ってください。
スクリプトから Fireタブレットや FireTV Stick にしゃべらせる – パソコン鳥のブログ
Amazon Echo でMP3ファイルを再生する(Linux) – パソコン鳥のブログ
スクリプトからEchoでAlexa Skills Kitサウンドライブラリのサウンド再生 – パソコン鳥のブログ
command.sh を作成し、上記記事で alexa_remote_control.sh で実行している内容を、command.sh に記述します。
この時、alexa_remote_control.sh の前に ./ を付けて ./alexa_remote_control.sh と記述してください。
保存は 文字コード UTF-8 でしてください。(メモ帳だと UTF-8 で保存されます)
command.shを作成したら、「alexa_remote_control.shの設定」で用意した、alexa_remote_control.sh がある場所にコピーして、そこでコマンドプロンプトを開きます。
コマンドプロンプトで次を実行すると、command.sh に書いた内容が実行されます。
busybox.exe sh command.sh
例えば、次の内容で command.sh を作成します。
(端末名 は、「Alexa端末名の確認」の手順で確認した端末名です)
./alexa_remote_control.sh -d "端末名" -e "speak:しゃべらせる内容"
コマンドプロンプトで busybox.exe sh command.sh を実行すると、Alexa端末がしゃべります。
上記はコマンドプロンプトからの実行方法ですが、バッチファイルから実行する場合は、以下のようにします。
alexa_remote_control.sh、command.sh と同じ個所に、次のような内容でバッチファイルを作成します。
この時、バッチファイルの文字コードは UTF-8 にしてください。
chcp 65001
busybox.exe sh command.sh
このバッチファイルを実行してください。
注意
alexa_remote_control.sh -a 以外のコマンドを連続して実行すると、Alexa端末が反応しないことがあります。
alexa_remote_control.sh の実行間隔は1秒程度おいてください。
コメント
alexa remote controlで使用するリフレッシュトークンに関して、2点確認および2点質問させてください。
■確認事項
①日本からアクセスする場合「-b amazon.co.jp」オプションは必要になりますか?
※helpに「Change to amazon.co.jp for Japan」とあったため。
②helpの記載から「-a ja-JP」は「-a ja_JP」の方が適切だと考えましたが、あっていますか?
※defaultが「de_DE」となっているため。
■質問事項
①Webページの言語が英語またはドイツ語になります。日本語に変更する方法はございますか?
②リフレッシュトークンを紛失してしまいました。初期化することは可能でしょうか。
※同じコマンドを2回目以降も実行しましたが、リフレッシュトークンは出力されませんでした。
コメントありがとうございます。
■確認事項
①こちらでは、記事中のとおり、特に指定していません。
②ご指摘ありがとうございます。ja_JP ですね。ただ、どちらでもエラー無く実行できました。
■質問事項
①すみません、これはどこのことをおっしゃっているかがわかりませんでした。
②エクスプローラでアドレスバーに %TEMP% と入力・Enterを押し、開かれた場所で .alexa で始まるファイルがあれば削除してみてください。
二要素認証を有効にしている場合、-a ja_JPにしないと日本語表示にならない、
二要素認証が働かず、他のデバイスが操作できないリフレッシュトークンに
なる、という事象となりました。
ご指摘ありがとうございます。
本文を修正しました。
refresh tokenの取得と設定までは四苦八苦しながらなんとか完了しました。
次のshの実行ですが、下記のようなメッセージでうまくいきません。
どのような要因が考えられるでしょうか。
■実行したコマンドと結果
c:\alexa>busybox.exe sh alexa_remote_control.sh -login
cookie does not exist. logging in …
trying to get CSRF from handlebars
trying to get CSRF from devices-v2
ERROR: no CSRF cookie received
■生成されたcookie (%TEMP%/.alexa.cookie)
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
.amazon.co.jp TRUE / TRUE 2147483647 x-acbjp “ovq@mOgWBb7khY6cgsEYf0mzeOxMAanm”
.amazon.co.jp TRUE / TRUE 1737993777 ubid-acbjp 356-4888014-4884237
.amazon.co.jp TRUE / TRUE 1737993777 session-id 355-7997727-1457138
.amazon.co.jp TRUE / TRUE 1737993777 session-id-time 2337177777l
コメントありがとうございます。
記事内容を試してみましたが、記事執筆時点よりリフレッシュトークンの取得で挙動が変わったところがありました。
記事を修正していますので、試してみていただけますでしょうか。
変更箇所は、本ページを 2024.1.29 で検索してひっかかった箇所です。