Alexaに好きな言葉をコマンドラインで話させる 2025年版

Alexa に、好きな言葉をコマンドラインから話させる方法です。

Alexa スキル等の開発は必要無く、mac だけで実現可能です。

Webの記事をいくつか調べて行った所、いくつか詰まったポイントがあったので解決方法を記載します。

# 概要

1. [alexa-cookie-cli](https://github.com/adn77/alexa-cookie-cli) を使って、Webで Amazon にログインし、リフレッシュトークンを取得する。
2. [alexa-remote-control](https://github.com/thorsten-gehrig/alexa-remote-control/tree/master) のシェルスクリプトを使って、コマンドラインで発話リクエストを送る。

手順としては以上だけです。

そして、注意点としては大きく以下だけ。

**[alexa-cookie-cli](https://github.com/adn77/alexa-cookie-cli) は、amazon.co.jp のエンドポイントに対応していないので、amazon.com でログインする。**

つまり、**amazon.com** で認証してリフレッシュトークンを作って、それを使って **alexa.amazon.co.jp** にリクエストすればうまくいきます。


# 手順

## 1. プロジェクトディレクトリを作る。

```shell
mkdir alexa
cd alexa
```


## 2. alexa-cookie-cli, alexa-remote-control をダウンロードする。

シェルスクリプトを作ってダウンロードします。

```shell
vim setup.sh
```

#### setup.sh
```shell
#!/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
```

```shell
chmod +x setup.sh
./setup.sh
```

ダウンロードしたプログラムはマルウェアスキャンを行ってください。

## 3. リフレッシュトークンを作る

シェルスクリプトを作って実行します。


#### login-amazon.sh
```shell
#!/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
さきほどの出力からリフレッシュトークンを抽出します。

今回はファイルにしていますが、秘密認証情報なので可能な限り安全な方法で保存してください。

```shell
#!/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
```shell
#!/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
```shell
#!/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 を使って声のトーンを変えることもできます。

下記の記事が参考になりました。

[Alexa(Amazon Echo)をコマンドラインから自由に喋らせる方法 #Terminal - Qiita](https://qiita.com/shge/items/169de61c8f246d26c110)

[Alexaの喋り方を制御できるSSMLを色々と試してみました | DevelopersIO](https://dev.classmethod.jp/articles/ssml-summary/)