nyabot’s diary

電気猫の夢を見るお話

Google AssistantをRaspberry Piに導入する。再戦!

以前(↓)、うまくいかずに途中で断念したGoogle Assistantの導入に再挑戦した話。

nyabot.hatenablog.com

使用したコマンドとか詰まったところとか、後から自分で見直すための備忘録。

経緯とか

ラズパイにGoogle Assistantを入れたいというのは、Google AssistantとSnowboyで任意のhotwordで起動するアシスタントを作りたい、という動機によるもの。
以前、Google Assistantの導入については一度挑戦したのだけれど、demoは動くものの意図した動作をしなかった。

前回色々試したときからもう半年近く経ってしまい、忘れたことが多いのでもう一度初めからやり直すことにした。

Google Assistantにはlibraryとserviceがあるとか(どちらを使えばいいか未だよくわかっていない)、Google Cloud PlatformとActions On Googleが何なのかとか、そういうの周辺情報も少しずつ調べていて、ようやくGoogle Assistantが属するサービス群の全体像が見えてきた。

とはいえ結局のところ、Google Assistantを導入する段階ではまだ他のサービスを使用する必要もないようで。とりあえず公式ドキュメントに沿ってアカウントの設定やプロジェクトの作成だけ行っていればいいのだろうと判断。  

仮想環境の構築

まずはGoogle Assistantを動作させる環境を作る。
Pythonのvenvというコマンドを使用するのだけれど、任意の名前で仮想環境は作れるみたい。
僕はこれから作るロボットの名前(すでに名前だけ決まっている)から、nyabotという名を付けることにした。

$ python3 -m venv env/nyabot

セットアップツールのインストール

$ env/nyabot/bin/python -m pip install --upgrade pip setuptools wheel

仮想環境に入る

$ source env/nyabot/bin/activate

(nyabot)$ python --version

仮想環境を作ったらそれを動かして、pythonのバージョン確認もしておく。

google cloud platform にてプロジェクト作成、認証情報作成

OAuth同意画面ではアイコンとか変更するとGoogleによる確認が行われるまでアクティブにならないので注意。
僕はそれをやってしまってプロジェクトを作り直した。

公式ドキュメントに従い、Actions On Google でデバイスモデルの登録を行う。

developers.google.com

認証情報ファイルをダウンロードし/home/piに移動

client_secret_xxxxxxxxxxxx.json というファイル。ラズパイをリモートで操作している場合、別PCでダウンロードすることが多いと思う。ラズパイへの転送にはscpを使い、そのあたりの説明も公式ドキュメントが詳しい。

Google Assistant SDKのセットアップ

(nyabot)$ python -m pip install --upgrade google-assistant-sdk[samples]

認証用ライブラリのインストール

(nyabot)$ python -m pip install --upgrade google-auth-oauthlib[tool]

認証

(nyabot)$ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless --client-secrets /home/pi/client_secret_XXXXX.json

上記コマンドのjsonファイル名は認証情報ファイルの名前に変えて実行する。
Please Visit this URL ~と出てくるので、表示されたURL(以下)にアクセスし、認証。

その後、上記の認証画面で表示されるコードをコピーしてターミナルに貼り付けEnter。

以下のように認証情報が保存されたと表示がされればOK。
credentials saved: /home/pi/.config/google-oauthlib-tool/credentials.json

デモコードでテスト

(nyabot)$ googlesamples-assistant-hotword --project-id my-dev-project --device-model-id my-model

IDはそれぞれ自分のプロジェクト、モデルのものに書き換えて実行。

Segmentation fault
エラー。

バイスの登録をする必要がある?
https://stackoverflow.com/questions/50440960/google-assistant-on-raspberry-pi-segmentation-fault

(nyabot)$ googlesamples-assistant-devicetool --project-id my-project-id register-device --device my-device-code --model my-model-id --client-type SERVICE

client-typeはわからなかった。libraryとservice、どっち入れてるんだろ?(後から問題になる気がする)

上記を試してみたが、すでに同じデバイスインスタンスが存在するとのこと。
違うらしい。

解決策を見つけた。

Google Assistant on Ubuntu 'segmentation fault(core dumped)' · Issue #314 · googlesamples/assistant-sdk-python · GitHub

googsamples-assistant-hotwordでは機能せず、しかしgoogle-assistant-demoを使用すると以降hotwordでも動作する、との回答が。試してみる。

(nyabot)$ google-assistant-demo --project-id my-project-id --device-model-id my-model-id

デモが無事動いたので、公式ドキュメントにあるhotwordのサンプルコードを試す。

(nyabot)$ googlesamples-assistant-hotword --project-id my-project-id --device-model-id my-model-id

動作OK。OK, Googleに反応して聞き取りを開始する。

同様に、googlesamples-assistant-pushtotalkも試す。

(nyabot)$ googlesamples-assistant-pushtotalk --project-id my-project-id --device-model-id my-model-id

こちらもOK。Enterを押すと聞き取りを開始する。

日本語を有効にする

pushtotalkは英語音声のみ認識するようだったので、スマホにアプリを入れて言語設定→日本語に設定。

サンプルはモデルIDとインスタンスIDの両方を保存します。これらを引数として指定せずにサンプルを実行すると、保存されたIDがデフォルトで使用されます。とのこと。 つまり、一度実行した後は以下のコマンドで呼び出し可能。

(nyabot)$ googlesamples-assistant-pushtotalk

Google Assistant 導入完了!

ラズパイ起動後、仮想環境の立ち上げ、GoogleAssistantの起動が以下コマンドでできるように。

$ source env/nyabot/bin/activate (nyabot)$ googlesamples-assistant-pushtotalk

よし。ちょっと懸念点(libraryとserviceの違いが。。。)があるけれど、とにかく意図した動作をしてくれるようにはなった。

公式ドキュメントのほか、以下のブログを参考にさせていただきました。ありがとうございます!
僕の目指していることの先駆者様。次にやろうと思っているSnowboyの導入と連携も書かれていて、とても素晴らしい。

【ラズパイ】Voice KitにSnowboyを入れてホットワードでSwithBotを操る【よしこちゃん】 - Oh My Enter!

願いごとを叶えてくれる「かみさま」をRaspberry Piに実装する - 現ア集のブログ

つづく。

追記

動かなくなった。かなしい。

nyabot.hatenablog.com