Windows から Alexa端末にしゃべらせたり、MP3を再生させたりする

スポンサーリンク
スポンサーリンク
スポンサーリンク

はじめに

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) の箇所からダウンロード・インストールしてください。

Download | Node.js

リフレッシュトークンを取得するために、alexa-cookie-cli を使用します。
下記からダウンロード・展開してください。

https://github.com/adn77/alexa-cookie-cli/archive/refs/heads/master.zip

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秒程度おいてください。

コメント

  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回目以降も実行しましたが、リフレッシュトークンは出力されませんでした。

  2. パソコン鳥 より:

    コメントありがとうございます。

    ■確認事項
    ①こちらでは、記事中のとおり、特に指定していません。
    ②ご指摘ありがとうございます。ja_JP ですね。ただ、どちらでもエラー無く実行できました。

    ■質問事項
    ①すみません、これはどこのことをおっしゃっているかがわかりませんでした。
    ②エクスプローラでアドレスバーに %TEMP% と入力・Enterを押し、開かれた場所で .alexa で始まるファイルがあれば削除してみてください。

  3. Lalf より:

    二要素認証を有効にしている場合、-a ja_JPにしないと日本語表示にならない、
    二要素認証が働かず、他のデバイスが操作できないリフレッシュトークンに
    なる、という事象となりました。

  4. パソコン鳥 より:

    ご指摘ありがとうございます。
    本文を修正しました。

  5. windowsCUIからAlexaくんをしゃべらせたい より:

    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

  6. パソコン鳥 より:

    コメントありがとうございます。
    記事内容を試してみましたが、記事執筆時点よりリフレッシュトークンの取得で挙動が変わったところがありました。
    記事を修正していますので、試してみていただけますでしょうか。
    変更箇所は、本ページを 2024.1.29 で検索してひっかかった箇所です。

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