Alexa Gadgets Toolkit でドムヘッドのモノアイを光らせる


# はじめに

キッカケはこのツイート。そもそも`Alexa Gadgets Toolkit`の存在を忘れていたので、いまさらながら、`Alexa Gadgets Toolkit`をやってみようと思った。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Alexa Gadgets Toolkitを使えば可能かも🤔 ：ESP32をAlexa Gadgets Toolkitデバイスにしよう <a href="https://t.co/pdU67zmSZV">https://t.co/pdU67zmSZV</a></p>&mdash; robo8080 (@robo8080) <a href="https://twitter.com/robo8080/status/1403861931463565313?ref_src=twsrc%5Etfw">June 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Alexa Gadgets Toolkit とは

Bluetooth経由で互換性のあるAmazon Echoデバイスと対話するAlexa接続のアクセサリ。
`Alexa Gadgets Toolkit` を使用することで、独自のAlexaガジェットを作成することができる。 

- Alexaスキルからガジェットにアクセスする。
- Alexaのネイティブ機能に反応してガジェットの動作をトリガーする。
    - Speechmark data
    - Notifications 
    - Timers, alarms, and reminders
    - Wake word detection
    - Current time 
    - Tempo data of songs from Amazon Music 

# Alexaとドムヘッドを連携させるために必要な部品

今回は、[Alexa-Gadgets-Raspberry-Pi-Samples](https://github.com/alexa-samples/Alexa-Gadgets-Raspberry-Pi-Samples)の `Wake Word LED Gadget Example` をそのまま使う。

[![turnToWakeWordの動作確認](http://img.youtube.com/vi/_OahVB4xras/0.jpg)](http://www.youtube.com/watch?v=_OahVB4xras) 

部品
- [DOM HEAD 2](https://gashapon.jp/products/detail.html?jan_code=4549660487319000)
- [Echo Show 10](https://amzn.to/3erzBbo)
- Raspberry Pi 3 Model B+
- Speaker ( Seria )
- Breadboard 
- Red LED
- Resistor(330 ohm)
- Jump wire x 4

※Echoデバイスから音を出したかったが、`Alexa Gadgets Toolkit` でBluetoothを使用してしまったため、スピーカーはイヤホンジャックに接続した。

# Amazon IDとAlexa Gadget Secretを生成する

[Alexa Voice Service Developer Console](https://developer.amazon.com/avs/home.html#/avs/home) にログインして、`製品` をクリックし、新しい商品を作成することで、`Amazon ID` と `Alexa Gadget Secret` が生成できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/d64a72d9-415a-dd54-475f-aa28295c03dd.png)

`Amazon ID` と `Alexa ガジェットのシークレット` を使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/10c1e657-1bfd-36c0-5f65-cd65e5248ff7.png)


# サンプルコードを入手する

`Raspberry Pi` 用のサンプルコードを github から clone して、`Raspberry Pi` に転送する。何も考えずに、`/home/pi/Alexa-Gadgets-Raspberry-Pi-Samples` に配置した。

```
git clone https://github.com/alexa-samples/Alexa-Gadgets-Raspberry-Pi-Samples.git
```


# セットアップする

基本的には、サンプルの[README.md](https://github.com/alexa-samples/Alexa-Gadgets-Raspberry-Pi-Samples/tree/master/src/examples/wakeword)に書かれている通りに進めていけばセットアップができる。


```
pi@raspberrypi:~ $ cd Alexa-Gadgets-Raspberry-Pi-Samples/
pi@raspberrypi:~/Alexa-Gadgets-Raspberry-Pi-Samples $ pwd
/home/pi/Alexa-Gadgets-Raspberry-Pi-Samples
pi@raspberrypi:~/Alexa-Gadgets-Raspberry-Pi-Samples $ sudo python3 launch.py --setup
```

`Amazon ID` と `Alexa ガジェットのシークレット` の入力を求められるので、上記で取得した文字列を入力する。

```
+--------------------------------------------------------------------+
|    .oooooooo.                888                                   |
|   d8P'    'Y8b     .oooo.    888   .ooooo.  oooo    ooo  .oooo.    |
|  888        888   'P  )88b   888  d88' '88b  '88b..8P'  'P  )88b   |
|  888        888    .oP'888   888  888ooo888    Y888'     .oP'888   |
|  '88bb    dd88'   d8(  888   888  888    .o  .o8''88b   d8(  888   |
|   'Y8bb,ood8P'    'Y888888o  888o 'Y8bod8P' o88'   888o 'Y888888o  |
+--------------------------------------------------------------------+

Do you want to configure all examples with your Alexa Gadget credentials (y/n)? y
Enter the Amazon ID for your gadget:            ←　<Amazon ID>
Enter the Alexa Gadget Secret for your gadget:　←　<Alexa ガジェットのシークレット>
　：
　：

※このあと、けっこう時間がかかる。

```

# サンプルプログラムを修正する

サンプルコードに音を出す部分を追加している。デフォルトでインストールされている `pygame` を使ってドムの起動音を鳴らすようにした。ウェイクワードが発話された時、`state.value == 'active` 時に音を出力するようにした。

```python:wakeword.py
#
# Copyright 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
# These materials are licensed under the Amazon Software License in connection with the Alexa Gadgets Program.
# The Agreement is available at https://aws.amazon.com/asl/.
# See the Agreement for the specific terms and conditions of the Agreement.
# Capitalized terms not defined in this file have the meanings given to them in the Agreement.
#

import pygame.mixer
import time
import logging
import sys
from gpiozero import LED

from agt import AlexaGadget

# mixer init
pygame.mixer.init()
pygame.mixer.music.load("/home/pi/launch.mp3")

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logger = logging.getLogger(__name__)

GPIO_PIN = 14

LED = LED(GPIO_PIN)

class WakewordGadget(AlexaGadget):
    """
    An Alexa Gadget that turns an LED on and off in sync with the detection
    of the wake word
    """

    def __init__(self):
        super().__init__()

    def on_alexa_gadget_statelistener_stateupdate(self, directive):
        for state in directive.payload.states:
            if state.name == 'wakeword':
                if state.value == 'active':
                    logger.info('Wake word active - turn on LED')
                    LED.on()
                    # play
                    pygame.mixer.music.play(1)
                    time.sleep(8)
                    pygame.mixer.music.stop()
                elif state.value == 'cleared':
                    logger.info('Wake word cleared - turn off LED')
                    LED.off()


if __name__ == '__main__':
    try:
        WakewordGadget().main()
    finally:
        logger.debug('Cleaning up GPIO')
        LED.close()
```

# 配線

Raspberry PiとLEDの [配線](https://github.com/alexa-samples/Alexa-Gadgets-Raspberry-Pi-Samples/tree/master/src/examples/wakeword)はサンプルそのまま。この赤いLEDをドムのモノアイ部分に埋め込んでいるだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/51f792e4-91db-c6a8-2b15-f72fd05e2d3e.png)

LEDを埋め込むためにパーツを削り、ジャンパーピンの通り道を穴をドリルで開ける。

![Image-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/1b068e87-157c-f73f-d83f-7ff9f7396fdb.jpeg)


# 動作確認

`Wake Word LED Gadget Example` を起動し、Alexaをウェイクする。

```
pi@raspberrypi:~/Alexa-Gadgets-Raspberry-Pi-Samples $ sudo python3 launch.py --example wakeword
```
[![turnToWakeWordの動作確認](http://img.youtube.com/vi/CvuCfRA34rE/0.jpg)](http://www.youtube.com/watch?v=CvuCfRA34rE) 


# おわりに

Alexaの雰囲気を100%壊してしまう点ではイマイチなガジェットかもしれないけど、個人的にはとても満足した。どちらかというと製作にかかった時間のほとんどは、ドムヘッドの塗装と、LEDを埋め込むための改造だった...

# 参考

- [Alexa Gadgets Toolkitとは（Anazon公式）](https://developer.amazon.com/ja-JP/docs/alexa/alexa-gadgets-toolkit/understand-alexa-gadgets-toolkit.html)
- [Alexa Gadgets Raspberry Pi Samples](https://github.com/alexa-samples/Alexa-Gadgets-Raspberry-Pi-Samples)
- [Alexa Voice Service Developer Console](https://developer.amazon.com/avs/home.html#/avs/home)