はじめてのGoogle AIY Voice Kit⑥【サンプルコード実行編】

# はじめに
前回のラズパイSSH接続編の記事は[こちら](https://qiita.com/yuzuki6v6/items/c64453e15a5d4a700a22)から:information_desk_person:
今回はサンプルコード実行編です。
LEDの操作、ボタンの操作、スピーチ（発話）、マイクの機能を試していきたいと思います。

# サンプルコードでできること
サンプルコードは[公式サイト](https://aiyprojects.withgoogle.com/voice/#makers-guide--python-api-library)に記述してあります。
また、今回は[こちら](https://ohmyenter.com/cheat-sheet-for-google-aiy-voice-kit-v2-with-python/)のサイトも併せて参考にさせていただきました。

サンプルコードでは、以下の機能を確認することができます。

- LEDの操作
  - LEDのオン・オフ
  - LEDの点滅
  - LEDの明るさ調整
  - LEDの点滅形式
  - LEDをカラフルに点灯
  - LEDを好きな色で点灯
  - LEDを好きなパターンで点滅
- ボタンの操作
  - ボタンの押しっぱなしを検出
  - ボタンを押した時・離した時を検出
- スピーチ（発話）
  - テキストを発話
- マイク
  - 録音・再生
- 音声認識（Cloud Speech）
  - Speech to Text（書き取り）
- Googleアシスタント
  - Goolge Home

# LEDのオン・オフを実施してみる
## ディレクトリとPythonファイルの作成
①以下のコマンドを入力し、作業用の「work」ディレクトリを作成します。

```
mkdir work
```

②以下のコマンドを入力し、workディレクトリに移動します。

```
cd work
```

③テキストエディタ「vi」（Raspberry Piに標準でインストールされています）を起動し、workディレクトリに「led_onoff.py」というファイルを作成します。（「.py」はPythonのファイルを意味しています）

```
sudo vi led_onoff.py
```

④viエディタが起動します。
viエディタはコマンドモードになっているため、キーボードをタイプしても何も入力できないようになっています。
そのため、キーボードの[i]を押し、コマンドモードから入力モードに変更します。

## コードの記述

⑤以下のコードを入力します。

```python
#!/usr/bin/env python3
import time
from aiy.board import Board, Led

print('LEDを点灯・消灯するサンプルです')
with Board() as board:
    print('点灯します')
    board.led.state = Led.ON
    time.sleep(3)
    print('消灯します')
    board.led.state = Led.OFF
    time.sleep(3)
```

⑥コードを入力したら、ファイルを保存します。
この時、テキストを入力するモード（入力モード）になっているため、コマンドモードに戻します。
戻すためには、[esc]キーを押します。

⑦コマンドモードになったら、以下のコマンドを入力します。

```
:wq！
```

⑧[Enter]を押下し、作成したPythonのプログラムファイルを保存します。

## プログラムの実行
⑨以下のコマンドを入力し、先程作成した「led_onoff.py」を実行します。

```
python3 led_onoff.py
```

## 実行結果
Tera Term画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921847/221174b3-7213-cb1a-3aaf-b942b5086f0d.png)

光りました！
![IMG_0782.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921847/7f08c202-96f7-e2e8-8e6b-5d5743000ac1.jpeg)

# サンプルコード一覧
**サンプルコードでできること**で紹介したサンプルコードを以下にまとめました。

## LEDの操作

```python:LEDのオン・オフ
#!/usr/bin/env python3
import time
from aiy.board import Board, Led

print('LEDを点灯・消灯するサンプルです')
with Board() as board:
    print('点灯します')
    board.led.state = Led.ON
    time.sleep(3)
    print('消灯します')
    board.led.state = Led.OFF
    time.sleep(3)
```
```python:LEDの点滅
#!/usr/bin/env python3
import time
from aiy.board import Board, Led

print('LEDを点滅させるサンプルです')
with Board() as board:
    board.led.state = Led.BLINK
    time.sleep(3)
```
```python:LEDの明るさ調整
#!/usr/bin/env python3
import time
from aiy.board import Board, Led

print('LEDの明るさを変更させるサンプルです')
with Board() as board:
    print('まずは暗く')
    board.led.brightness = 0.1
    board.led.state = Led.ON
    time.sleep(3)
    board.led.state = Led.OFF
    print('次は明るく')
    board.led.brightness = 1.0
    board.led.state = Led.ON
    time.sleep(3)
```
```python:LEDの点滅形式
#!/usr/bin/env python3
import time
from aiy.board import Board, Led

print('LEDを色んな感じで点滅させます')
with Board() as board:
    print('BLINK_3')
    board.led.state = Led.BLINK_3
    time.sleep(5)
    board.led.state = Led.OFF
    time.sleep(3)

    print('BEACON')
    board.led.state = Led.BEACON
    time.sleep(5)
    board.led.state = Led.OFF
    time.sleep(3)

    print('BEACON_DARK')
    board.led.state = Led.BEACON_DARK
    time.sleep(5)
    board.led.state = Led.OFF
    time.sleep(3)

    print('DECAY')
    board.led.state = Led.DECAY
    time.sleep(5)
    board.led.state = Led.OFF
    time.sleep(3)

    print('PULSE_SLOW')
    board.led.state = Led.PULSE_SLOW
    time.sleep(5)
    board.led.state = Led.OFF
    time.sleep(3)

    print('PULSE_QUICK')
    board.led.state = Led.PULSE_QUICK
    time.sleep(5)
```
```python:LEDをカラフルに点灯
#!/usr/bin/env python3
import time
from aiy.leds import Leds, Color

print('LEDをカラフルに点灯させるサンプルです')

COLORS = (
    Color.BLACK,
    Color.BLUE,
    Color.CYAN,
    Color.GREEN,
    Color.PURPLE,
    Color.RED,
    Color.WHITE,
    Color.YELLOW,
)

with Leds() as leds:
    for color in COLORS:
        for _ in range(2):
            leds.update(Leds.rgb_on(color))
            time.sleep(1)
            leds.update(Leds.rgb_off())
            time.sleep(1)
```
```python:LEDを好きな色で点灯
#!/usr/bin/env python3
import time
from aiy.leds import Leds, Color

print('LEDを好きな色に点灯させるサンプルです')

with Leds() as leds:
    # オレンジっぽい色
    leds.update(Leds.rgb_on(Color.blend(Color.RED, Color.YELLOW, 0.9)))
    time.sleep(3)
```
```python:LEDを好きなパターンで点滅
#!/usr/bin/env python3
import time
from aiy.leds import Leds, Color, Pattern

print('LEDを好きなパターンで点滅させるサンプルです')

with Leds() as leds:
    print('チカチカと点滅 blink500')
    leds.pattern = Pattern.blink(400)
    leds.update(Leds.rgb_pattern(Color.BLUE))
    time.sleep(5)
    print('ブォーンブォーンと点滅 breathe500')
    leds.pattern = Pattern.breathe(800)
    leds.update(Leds.rgb_pattern(Color.RED))
    time.sleep(5)
```
## ボタンの操作
```python:ボタンの押しっぱなしを検出
#!/usr/bin/env python3
from aiy.board import Board, Led

print('ボタンの押しっ放しを検出するサンプルです（CTRL+Cで終了）')

with Board() as board:
    while True:
        print('ボタンを押しっ放しにしてください...')
        board.button.wait_for_press()
        print('オン！ 今度は離してみて！')
        board.led.state = Led.ON
        board.button.wait_for_release()
        print('オフ！')
        board.led.state = Led.OFF
```
## スピーチ（発話）
```python:テキストを発話
#!/usr/bin/env python3
import aiy.voice.tts

print('Text−To-Speech（発話）のサンプルです（英語）')

# 普通に
aiy.voice.tts.say("Hello, I'm yoshiko.")
# 気取って
aiy.voice.tts.say("What have you got for me tonight?", lang='en-GB')
# 大声で
aiy.voice.tts.say("Put a sock in it!", volume=100)
# １オクターブ上
aiy.voice.tts.say("Lovely weather today.", pitch=200)
# 早口で
aiy.voice.tts.say("The quick brown fox jumped over the lazy dog.", speed=150)
```
## マイク
```python:録音・再生
#!/usr/bin/env python3
import time
import threading

from aiy.board import Board, Led
from aiy.voice.audio import AudioFormat, play_wav, record_file

with Board() as board:
    print('ボタンを押して録音開始')
    board.led.state = Led.ON
    board.button.wait_for_press()
    board.led.state = Led.OFF

    done = threading.Event()
    board.button.when_pressed = done.set

    def wait():
        start = time.monotonic()
        while not done.is_set():
            duration = time.monotonic() - start
            print('録音中: %.02f 秒 [ボタンを押してストップ]' % duration)
            time.sleep(0.5)

    record_file(AudioFormat.CD, filename='audio_record.wav', wait=wait, filetype='wav')
    print('ボタンを押して再生')
    board.led.state = Led.ON
    board.button.wait_for_press()
    board.led.state = Led.OFF

    print('再生中...')
    play_wav('audio_record.wav')
    print('終了')
```

## 音声認識（Cloud Speech-to-Text API）
Googleの「Cloud Speech-to-Text」というAPI（音声をテキストに変換する）を使用します。
「Speech-to-Text」を使用するためには、事前にGoogle Cloud PlatformでAPIを有効化し、秘密鍵（JSON）をホームディレクトリに配置しておく必要があります。
詳細な手順は別の記事で紹介予定です。

```python:Speech-to-Text（書き取り）
#!/usr/bin/env python3
import datetime
from aiy.board import Board
from aiy.cloudspeech import CloudSpeechClient

print('Speech To Text（書き取り）のサンプルです（"終了"と言うと終了します）')
client = CloudSpeechClient()
with Board() as board:
    while True:
        print('聴き取り中・・・')
        text = client.recognize(language_code='ja-JP',
                                hint_phrases=('今何時', '今日の天気は', '終了'))
        if text is None:
            print('何かしゃべってよ')
            continue

        print('「{}」と言いましたね！'.format(text))

        if '今何時' in text:
            now = datetime.datetime.now()
            print(now)
        if '今日の天気は' in text:
            print('たぶん晴れじゃないかなあ')
        elif '終了' in text:
            print('え？もう行っちゃうの・・・？')
            break
```
## Googleアシスタント
「Google Assistant API」（Google Homeのようなアシスタント機能を提供する）を使用します。
こちらも事前にAPIを有効化し、サービスアカウントキーを取得する必要があります。
詳細な手順は別の記事で紹介予定です。

```python:GoolgeHome
#!/usr/bin/env python3
from aiy.assistant.grpc import AssistantServiceClientWithLed
from aiy.board import Board
print('Google Homeもどきのサンプルです（CTRL+Cで終了）')

with Board() as board:
    assistant = AssistantServiceClientWithLed(board=board,
                                              volume_percentage=50,
                                              language_code='ja-JP')
    while True:
        print('ボタンを押して会話を始めましょう')
        board.button.wait_for_press()
        print('スタート！')
        assistant.conversation()
```