Google Assistant SDKをAndroid Thingsで試せるサンプルが公開されていますのでRaspberry Pi3で動かしてみます。
AndroidThingsがインストールされていて、adb connectで接続できる状態になっている事を前提とします。
■Raspberry Pi3本体以外に必要なもの
- ボタンとLEDのサンプルと同様の配線をしますので、LED、プッシュボタン、抵抗、ワイヤなど
- HDMIケーブル+モニター(あった方が分かり易いですが無くても動作には影響ありません。画面には入力した音声を認識した結果のテキストがListViewで溜まっていきます。)
- USBマイク(サンプルではI2sデバイスでも動かせるようですが、USBマイクでも大丈夫です。アマゾンでも購入できます。https://www.amazon.co.jp/gp/product/B00XU1GHO4/ )
- スピーカー(ジャックに接続するものでOKです。今回は外部入力のある普通のスピーカーにつなぎました。)
■サンプルプロジェクト
https://github.com/androidthings/sample-googleassistant
をcloneしておきます。
■デベロッパプロジェクトの設定
Google Assistant SDKガイド ー Configure a Developer Project and Account Settings
https://developers.google.com/assistant/sdk/develop/python/config-dev-project-and-account
ここの記載内容に従って
- 「GO TO THE PROJECTS PAGE」のリンク先で新規プロジェクトを作成
- 「ENABLE THE API」のリンク先でGoogle Assistant APIを有効にする
- 「CREATE AN OAUTH CLIENT ID」のリンク先で “その他” を選択して作成。
- 画面の ”JSONをダウンロード”を押して、client_secretファイルをダウンロードする。
この時、そのままだとUnknownという名前になってしまう事があるので、その場合は
client_secret_<client-id>.json
という形式に名前を指定してサンプルプロジェクトをcloneしたディレクトリに保存します。(<client-id>の部分は作成した時に付与される長いIDをそのまま入れてください。)
■「アクティビティの管理」画面での設定を行う。
https://myaccount.google.com/activitycontrols
にて、以下を有効にする。
- Web & App Activity(「Chrome の閲覧履歴と Google サービスを使用するウェブサイトやアプリでのアクティビティを含める」のチェックボックスはONにしておく。)
- Device Information
- Voice & Audio Activity
■google-oauthlib-toolを使ってcredentialsを生成する
https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib
・google-auth-oauthlibをインストール
1 |
$ pip install google-auth-oauthlib |
macで作業している場合、pythonのパスがデフォルトのシステムのpythonの状態だとエラーになるかもしれません。
・credentialsを生成
1 |
$ google-oauthlib-tool --client-secrets client_secret_クライアントID.json --credentials app/src/main/res/raw/credentials.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save |
を実行するとブラウザが立ち上がって、アプリがプロジェクトにアクセスするのを承認するか聞いてくるので、OKします。
ログはこんな感じになります。
1 2 3 |
Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=・・・ credentials saved: app/src/main/res/raw/credentials.json |
■Android Studioでプロジェクトを起動
必要なplatformのバージョンがないと言われたらそのままインストールしてください。
今回はUSBマイクを使用するので、AssistantActivity.javaの「I2sデバイスを使用するフラグ」をfalseに設定します。
1 2 3 |
private static final boolean AUDIO_USE_I2S_VOICEHAT_IF_AVAILABLE = true; ↓ private static final boolean AUDIO_USE_I2S_VOICEHAT_IF_AVAILABLE = false; |
これで一度ビルドしてエラーが出なかったらOK。
■RPIにボタンとLEDを接続
Button and LED sample (https://github.com/androidthings/sample-button )と同じ配線をしますが、5vとGND以外はRPIへの接続ピン(LEDへの出力とボタンからの入力)が異なります。
BoardDefaults.javaを見ると、LEDがBCM25、ボタンがBCM23になっていますので、
それに合わせて接続を変更してください。
Raspberry Pi3のピン配はこちらをご参照ください。
https://developer.android.com/things/hardware/raspberrypi-io.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public static String getGPIOForLED() { switch (getBoardVariant()) { case DEVICE_EDISON_ARDUINO: return "IO13"; case DEVICE_EDISON: return "GP45"; case DEVICE_JOULE: return "J6_25"; case DEVICE_RPI3: return "BCM25"; case DEVICE_IMX6UL_PICO: return "GPIO4_IO22"; case DEVICE_IMX6UL_VVDN: return "GPIO3_IO06"; case DEVICE_IMX7D_PICO: return "GPIO_34"; default: throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE); } } /** * Return the GPIO pin that the Button is connected on. */ public static String getGPIOForButton() { switch (getBoardVariant()) { case DEVICE_EDISON_ARDUINO: return "IO12"; case DEVICE_EDISON: return "GP44"; case DEVICE_JOULE: return "J7_71"; case DEVICE_RPI3: return "BCM23"; case DEVICE_IMX6UL_PICO: return "GPIO2_IO03"; case DEVICE_IMX6UL_VVDN: return "GPIO3_IO01"; case DEVICE_IMX7D_PICO: return "GPIO_174"; default: throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE); } } |
試していませんが、Button and LED sampleの配線に合わせてソースを修正しても大丈夫かもしれません。
■実行
Android Studioから実行してアプリが起動したら、
ボタンを押しながら “OK Google” や ”Hello”など適当に英語で話しかけて、終わったらボタンを離してください。(モニターを接続していると画面上に自分が話した内容がテキストでリスト表示されていきます。)
すると、女性の音声で応答が返ってきます。音声認識の精度とレスポンスの早さに驚きました。
「これから雨が降りそう?」とかにも即座に答えてくれました。
試しに「声は変えられますか?」と聞いたら、「今はこの声だけです。」とおっしゃってました。。。
動画では”good afternoon”と呼びかけてみました。