Raspberry Piで動くGoogle AIY Voice Kit V2というスマートスピーカーキットの基本操作のサンプルをまとめました。LEDやボタン、オーディオの基本操作とGoogleアシスタントAPI、Cloud Speechのサンプル等を載せています。
目次
Voice Kit V2
とは↓こんな感じ↓のダンボール型スマートスピーカーです。
LEDボタン・スピーカー・マイクが搭載されたラズベリーパイのキットです。自分で組み立てます。組立方法はとても簡単なので誰でも作れます。この値段でスマートスピーカーが作れるとは、なんていい時代なんでしょうか。
AIY with Python
組み立ては誰でもできますが、いざ何かしようと思うとプログラミングが必要です。Googleが用意してくれているPython用のライブラリを使用してプログラミングしていきます。というわけでリファレンス的に使えるVoice Kit V2の基本操作のサンプルをまとめておくことにしました。
なお、各スクリプトの1行目で #!/usr/bin/env python3
してるのは、Voice Kit用のRaspbianOSにはPython2系と3系の両方がインストールされているのですが、aiyライブラリがPython3環境にインストールされているので、必ずそちらを使用するようにしているためです。(シェルで普通にpythonを実行すると2系が実行されちゃいますからね・・・)
LED操作(V1・V2)
LEDボタンを光らせたり点滅させたりします。Voice KitにはV1とV2があるのですが、まずは両バージョンに対応している基本操作から。
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)
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)
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)
LEDの点滅(色んなState)
#!/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)
↑BLINK_3〜DECAYは通常のBLINKと同じでした(?)。PULSE_SLOW/PULSE_QUICKはBLINKと違い、ボワーっと点滅します。
LED操作(V2のみ)
Voice Kit V2でのみ使用できるaiy.ledsライブラリです。
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)
↑BLACKは黒とは言えない色でしたが・・・
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)
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)
ボタン
ボタンの押しっ放しを検出
#!/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
ボタンを押した時・離した時を検出
#!/usr/bin/env python3 from aiy.board import Board, Led print('ボタンが押された時・離された時に処理を実行するサンプルです(CTRL+Cで終了)') def on_pressed(): print('押したよね!') def on_released(): print('離したよね!') with Board() as board: board.button.when_pressed = on_pressed board.button.when_released = on_released print('ボタンを押してみて...') while True: pass
スピーチ
aiy.voice.ttsというライブラリで、テキストを発話するAPIです(Text−To-Speech)。ただしこれ、まだ日本語には対応していません・・・。というわけでサンプルは英語です。
テキストを発話
#!/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) # 1オクターブ上 aiy.voice.tts.say("Lovely weather today.", pitch=200) # 早口で aiy.voice.tts.say("The quick brown fox jumped over the lazy dog.", speed=150)
マイク
基本的にはrecord_fileとplay_wavしているだけです。
録音・再生
#!/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)
GoogleのCloud Speechを利用します。SpeechToTextというAPIで、これは音声をテキストに変換するAPIです。使用するためには事前にGoogle Cloud PlatformでAPIを有効化し、認証キーファイル(JSON)をホームディレクトリに配置しておく必要があります。詳細な手順は以下の公式に従って下さい。
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
指定しておきたい定型文があれば、上記のようにhint_phrasesとして登録しておきます。こうしておくとCloudSpeechClient#recoginizeによる音声認識時に優先的にその語を検出してくれるようになります。要は発音が少しボケていてもちゃんと聴き取ってくれるようになるってイメージですね。あらかじめボイスコマンドを設定しておきたいときには便利なオプションだと思います。
Googleアシスタント
いわゆるGoogle Homeのようなアシスタント機能を提供するAPIです。Assistant APIといいます。これも事前にAPIを有効化し、サービスアカウントキーを入手しておく必要があります。以下の公式の手順に従って下さい。
Goolge Homeもどき
#!/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()
最後に
まあこれだけあれば大体のことはできると思います。テキスト→発話の日本語ができないのは痛いですが、これに関しては別のライブラリで一応解決できますので、後日また書こうかな。
参考
関連する記事
- ラズベリーパイに日本語で喋らせる[その2]Amazon Polly
- ラズベリーパイに日本語で喋らせる[その1]Google Cloud Text-To-Speech
- Google AIY Voice Kit V2をキーボード・モニター無しでセットアップして日本語会話まで
- 【ラズパイ】Voice KitにSnowboyを入れてホットワードでSwithBotを操る【よしこちゃん】
- ラズベリーパイに日本語で喋らせる[その3]Open JTalk