Google AIY Voice Kit を試してみる

 Google AIY Projects の Voice Kit を買ってみたのでとりあえず試してみました。

aiyprojects.withgoogle.com

 こんな感じのパッケージで届きます。

f:id:akanuma-hiroaki:20180113200108j:plain:w450

 別途 Raspberry Pi や micro SD カード等も必要なので、単純にスマートスピーカーとして使うだけなら Google Home mini を買った方が安いしお手軽なのですが、 Raspberry Pi 上でスクリプトを作成したり、 GPIO 等でセンサーデバイス等と連携させることもできるのが面白そうだったので購入してみました。今回はひとまず組み立てと動作確認を行ってみます。

 基本的な手順は下記 Google の製品ページで紹介されています。

https://aiyprojects.withgoogle.com/voice/#assembly-guide

 KSY で購入ですると日本語版の組み立てガイドが付属しているのでそれに従って進めます。

https://raspberry-pi.ksyic.com/main/index/pdp.id/331/pdp.open/331

f:id:akanuma-hiroaki:20180113201618j:plain:w450

OS イメージの準備

 キットの組み立ての前に SD カードに OS のイメージを書き込んでおきます。今回は下記イメージをダウンロードして使用しました。

https://dl.google.com/dl/aiyprojects/vision/aiyprojects-2018-01-03.img.xz

 書き込みには Etcher を使用します。

etcher.io

 Etcher を起動して Select Image をクリックしてダウンロードしておいたOSイメージを選択します。

f:id:akanuma-hiroaki:20180113141124p:plain:w450

 SDカードをリーダーに挿入してあればドライブが自動的に選択されていますので、 Flash! をクリックして書き込みを実行します。ドライブが適切に選択されていない場合は Change をクリックして対象のドライブを選択します。

f:id:akanuma-hiroaki:20180113141142p:plain:w450

 下記のような表示になれば無事完了です。

f:id:akanuma-hiroaki:20180113141133p:plain:w450

組み立て

 それではキットを組み立てていきます。箱を開けるとダンボールの筐体や各種パーツ、組み立てガイド(英語)が入っています。

f:id:akanuma-hiroaki:20180113202302j:plain:w450

 まずは GPIO 等の端子を備えたメインのボードである Voice HAT Accessory Board です。

f:id:akanuma-hiroaki:20180113201847j:plain:w450

 これをスペーサーを使って Raspberry Pi にマウントします。

f:id:akanuma-hiroaki:20180113201920j:plain:w450

 そしてスピーカーを Voice HAT の端子に精密ドライバーを使って接続します。

f:id:akanuma-hiroaki:20180113202041j:plain:w450

 次はマイク基盤です。このマイクでユーザの音声入力を受け付けます。

f:id:akanuma-hiroaki:20180113202119j:plain:w450

 これも Voice HAT に接続します。

f:id:akanuma-hiroaki:20180113202155j:plain:w450

 そして外側の筐体と内側のフレームを組み立てます。

f:id:akanuma-hiroaki:20180113202228j:plain:w450

 内側のフレームと先ほどまでに組み立てた基盤やスピーカーを組み合わせて筐体に入れます。

f:id:akanuma-hiroaki:20180113202416j:plain:w450

 上部のボタンを取り付けて箱を閉じれば完成です。

f:id:akanuma-hiroaki:20180113202521j:plain:w450

デバイスの動作確認

 OSイメージを書き込んでおいた micro SD カードを Raspberry Pi に挿入し、USBでキーボードとマウスを接続し、HDMI でモニタを接続したら電源ケーブルを接続して起動します。 Wi-Fi の接続や SSH, VNC の接続が必要であれば設定しておきます。

f:id:akanuma-hiroaki:20180113141153p:plain:w450

 公式のOSイメージを使用していれば動作確認用のスクリプトが用意されています。まずはオーディオデバイスの動作確認用スクリプトです。デスクトップの下記スクリプトをダブルクリックで実行します。

f:id:akanuma-hiroaki:20180115220156p:plain:w450

 実行すると下記のようにスクリプトが実行され、テスト用の音声が再生されますので、スピーカーから聞こえていれば y を入力します。続いてマイクのテストも行われますので、 Enter を押して「Testing, 1 2 3」と喋ります。正しくマイクが機能していれば今喋った内容が再生されますので、 y を入力してテスト終了です。

Enabling audio driver for VoiceKit.
Playing a test sound...
Did you hear the test sound? (y/n) y
When you're ready, press enter and say 'Testing, 1 2 3'...
Recording...
Playing back recorded audio...
Did you hear your own voice? (y/n) y
The audio seems to be working.
Press Enter to close...

 次に Wi-Fi の接続テストです。デスクトップの下記スクリプトをダブルクリックで実行します。

f:id:akanuma-hiroaki:20180115230018p:plain:w450

 実行すると下記のように Wi-Fi の接続確認が行われます。

Checking the WiFi connection...
Trying to contact Google's servers...
The WiFi connection seems to be working.
Press Enter to close...

サンプルプログラムの実行

 公式の OS イメージでは Google Assistant SDK のサンプルプログラムが提供されているのでそれを実行してみます。まずは Google Assistant API を有効にする必要がありますので、Google Cloud Platform(GCP) のコンソールにアクセスして、新しいプロジェクトを作成します。

f:id:akanuma-hiroaki:20180115230834p:plain:w450

 プロジェクト名を入力して 作成 ボタンをクリックします。

f:id:akanuma-hiroaki:20180115230911p:plain:w450

 プロジェクトが作成されたら「API とサービス」メニューから API とサービスの有効化 をクリックします。

f:id:akanuma-hiroaki:20180115230930p:plain:w450

 Google Assistant API を検索してクリックします。

f:id:akanuma-hiroaki:20180115230949p:plain:w450

 API の詳細画面で 有効にする をクリックします。

f:id:akanuma-hiroaki:20180115231008p:plain:w450

 次に認証情報を作成する必要があるので、「認証情報」メニューの画面で 認証情報を作成 プルダウンから OAuth クライアント ID を選択します。

f:id:akanuma-hiroaki:20180115231054p:plain:w450

 最初は同意画面を作成する必要があるので、 同意画面を設定 をクリックします。

f:id:akanuma-hiroaki:20180115231114p:plain:w450

 入力フォームでユーザーに表示するサービス名を設定します。それ以外はそのままで構いませんので、 保存 をクリックします。

f:id:akanuma-hiroaki:20180115231156p:plain:w450

 クライアントIDの作成画面に戻ったら名前を入力して 作成 ボタンをクリックします。

f:id:akanuma-hiroaki:20180115231214p:plain:w450

 これで認証情報の作成は完了ですので、一覧画面からダウンロードボタンをクリックして json ファイルをダウンロードし、 /home/pi/assistant.json として保存しておきます。

f:id:akanuma-hiroaki:20180115231232p:plain:w450

 サンプルプログラム実行の準備ができましたので、デスクトップから Start dev terminal を実行します。

f:id:akanuma-hiroaki:20180116074957p:plain:w450

 ターミナルが起動しますので、下記のようにサンプルプログラムを実行します。初回起動時は OAuth での認証が必要ですのでブラウザ上で認証します。認証が完了するとプログラムが実行されますので、 Wake Word「OK, Google」を使って話しかけます。ちなみに現状では英語のみの対応となっています。

$ src/examples/voice/assistant_library_demo.py
Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=965148223698-v9m9nb4bgdp58qk159cghm1ketnvin5t.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fassistant-sdk-prototype&state=tA7PMNhUtTMQdAdj2vRu7IuMAYcUe3&access_type=offline
既存のブラウザ セッションに新しいウィンドウが作成されました。
[2018-01-13 14:57:30,435] INFO:google_auth_oauthlib.flow:"GET /?state=tA7PMNhUtTMQdAdj2vRu7IuMAYcUe3&code=4/ESIoWeN3UiJqensJetZpHruY2DCoPh6KWWigZzEuqSE HTTP/1.1" 200 65
[2018-01-13 14:57:30,812] INFO:root:OAuth credentials initialized: /home/pi/.cache/voice-recognizer/assistant_credentials.json
Say "OK, Google" then speak, or press Ctrl+C to quit...

 続いて、 Google Assistant の gRPC のサンプルプログラムも提供されているので実行してみます。こちらは Wake Word には対応していないので、プログラムを実行した上でスピーカー上部のボタンを押してから話しかけます。こちらもデフォルトでは英語のみの対応となっています。例えば "What's time is it now?" と話しかけると下記のように認識されていることがわかります。

$ src/examples/voice/assistant_grpc_demo.py
/home/pi/AIY-projects-python/src/aiy/_drivers/_led.py:51: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(channel, GPIO.OUT)
Press the button and speak
[2018-01-13 15:07:12,945] INFO:recorder:started recording
Listening...
[2018-01-13 15:07:46,627] INFO:speech:event_type: 1
[2018-01-13 15:07:46,666] INFO:speech:transcript: what's time is it now
You said " what's time is it now "
Press the button and speak

まとめ

 完成品を買ってくるのとはまた違って、自分で組み立てたデバイスがスマートスピーカーとして動くというのは面白いですね。今回はひとまず組み立てとサンプルプログラムの実行まででしたが、色々なデバイスと組み合わせることもできるので、サンプルプログラムをベースに遊んでみたいと思います。