Alexa に、好きな言葉をコマンドラインから話させる方法です。
Alexa スキル等の開発は必要無く、mac だけで実現可能です。
Webの記事をいくつか調べて行った所、いくつか詰まったポイントがあったので解決方法を記載します。
概要
- alexa-cookie-cli を使って、Webで Amazon にログインし、リフレッシュトークンを取得する。
- alexa-remote-control のシェルスクリプトを使って、コマンドラインで発話リクエストを送る。
手順としては以上だけです。
そして、注意点としては大きく以下だけ。
alexa-cookie-cli は、amazon.co.jp のエンドポイントに対応していないので、amazon.com でログインする。
つまり、amazon.com で認証してリフレッシュトークンを作って、それを使って alexa.amazon.co.jp にリクエストすればうまくいきます。
手順
1. プロジェクトディレクトリを作る。
mkdir alexa
cd alexa
2. alexa-cookie-cli, alexa-remote-control をダウンロードする。
シェルスクリプトを作ってダウンロードします。
vim setup.sh
setup.sh
#!/usr/bin/env zsh
cd $(dirname $0) || exit
curl https://raw.githubusercontent.com/thorsten-gehrig/alexa-remote-control/refs/heads/master/alexa_remote_control.sh -O
chmod +x alexa_remote_control.sh
curl https://github.com/adn77/alexa-cookie-cli/releases/download/v5.0.1/alexa-cookie-cli-macos-x64 -O
chmod +x alexa-cookie-cli-macos-x64
chmod +x setup.sh
./setup.sh
ダウンロードしたプログラムはマルウェアスキャンを行ってください。
3. リフレッシュトークンを作る
シェルスクリプトを作って実行します。
login-amazon.sh
#!/usr/bin/env zsh
cd $(dirname $0) || exit
# 日本指定だとリフレッシュトークンは取得できない。amazon.com なら取得できる。
./alexa-cookie-cli-macos-x64 \
--amazonPage amazon.com \
--baseAmazonPage amazon.com \
--amazonPageProxyLanguage 'en_US' \
--acceptLanguage 'en-US' \
--debug | tee .secret.login-output.log
実行すると、 Error: Please open http://127.0.0.1:8080/ with your browser and login to Amazon.
と表示されるので、ブラウザで http://127.0.0.1:8080/ を開いてログインします。
amazon.co.jp で使っているメールアドレスとパスワードで OK です。
Error:
と表示されてびびりますが、プログラムがエラーなわけではなく、
ただロガー出力で上位レベルで表示したいため Error としているだけでした。
びびるのでやめてほしいです。
--debug
は入れてしまいましたが、書かなくてOKです。
ログイン完了後に、最後の方に refreshToken: Atnr|....
と表示されれれば成功しています。
amazon.co.jp のエンドポイントで行うと成功しません。
ログは秘密認証情報が含まれるので、取り扱いに注意してください。
save-refresh-token-from-log.sh
さきほどの出力からリフレッシュトークンを抽出します。
今回はファイルにしていますが、秘密認証情報なので可能な限り安全な方法で保存してください。
#!/usr/bin/env zsh
cd $(dirname $0) || exit
grep ' refreshToken: Atnr|' .secret.login-output.log | sed -e 's/ refreshToken: //g' > .secret.refresh-token.txt
4. デバイスリストを取得する
先ほどのリフレッシュトークンを使って、Alexa の APIにリクエストして、所有デバイスの一覧を取得します。
今回は、co.jp のエンドポイントで OK です。
list-devices.sh
#!/usr/bin/env zsh
cd $(dirname $0) || exit
export REFRESH_TOKEN=$(cat .secret.refresh-token.txt)
export TTS_LOCALE='ja-JP'
export AMAZON='amazon.co.jp'
export ALEXA='alexa.amazon.co.jp'
export CURL=$(which curl)
export JQ=$(which jq)
./alexa_remote_control.sh -a
実行すると、所有デバイスが標準出力に出ます。
なお、 /tmp/.alexa.devicelist.json
/tmp/.alexa.devicelist.txt
にも、それぞれ結果のキャッシュが残ります。
export TMP=$(pwd)
とすれば、キャッシュの保存先をカレントディレクトリにできます。
5. 発話する
alexa-speech.sh
#!/usr/bin/env zsh
cd $(dirname $0) || exit
export REFRESH_TOKEN=$(cat .secret.refresh-token.txt)
export TTS_LOCALE='ja-JP'
export AMAZON='amazon.co.jp'
export ALEXA='alexa.amazon.co.jp'
export CURL=$(which curl)
export JQ=$(which jq)
./alexa_remote_control.sh -d "書斎のEcho Dot" -e speak:"デプロイしました。"
speak: の引数には、SSML を使って声のトーンを変えることもできます。
下記の記事が参考になりました。