前回のあらすじ
- GoogleHomeがNestになってた
- ロマンを求めて自作スマートスピーカー
- 使う技術とかハードとか
この記事に書いてること
- PushToTalkで応答させるまで
PushToTalkとは
https://github.com/googlesamples/assistant-sdk-python
ここにあるpythonで書かれたgoogle-assistant-sdkのサンプルのこと。
動作としては
- 起動するとActionConsoleのプロジェクトとgoogleAssistantApiに対しての認証が走る
- 成功するとキーの待ち受け状態に入る
- キーを押すと音声入力出来る
- 入ってきた音声をAssistantで処理して返答してくれる
といった感じ。
最初のステップを見たら察せるが、Google側での下準備がいる。
まずはその導入から始めていこう。
公式リポジトリと
http://wisteriahill.sakura.ne.jp/CMS/WordPress/2019/01/07/raspberry-pi-3-google-assistant/
ここを参考にした。
URLはラズパイだけどdebian系だしほぼ問題なく行けた。
認証情報の準備
Googleアカウントが要ります。
まずは紐付け先となるプロジェクトをActionConsoleで作っていく。
https://console.actions.google.com/
New Project から…
適当に名前をつけてプロジェクトを作成。
右上からproject settingを見るとこんな感じ。
Project IDは後で使うので見方は覚えておく。
その次にGoogleCloudConsoleにてAssistantApiの有効化。
https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview
上記からAPI設定にアクセス。
左上にプロジェクト名が表示されていることを確認して、(されていなかったらプロジェクトを変えて)
有効化しました。
その次に認証情報の設定を、
しました。
この辺の情報、もちろんテスト用のプロジェクトだしもう使ってないものです。
とはいえスクショ貼るのどうなんかなーとも思ったりする。
無料枠だとリクエスト数/日に制限があるけど、開発中ですら上限に達したことはないので家で使う上で問題となることはない。
botでアクセスしまくるとかしなけりゃ。
起動後にリクエスト数見てたら増えていくのがわかるはず。
その次にデバイスモデルの登録。
https://console.actions.google.com/u/0/project/<project-id>/deviceregistration/
このURLなんだが、GUIからなぜか飛べない。
昔のプロジェクトならちゃんとGUIのDevelop
内にdeviceregistration
の項目があるんだけどね…
とりあえず直アクセスでも動作はしてるので裏道ということで。
プロジェクト作ってしばらく放置したら増えるとかあるんかなー。
project-idは各自置き換え。
そして作っていきましょ。
入力し終わったら認証情報のjsonファイルが保存できるのでする。
これを使って認証をかけることになる。
増えましたー。
これで認証情報のjsonをなんか安全な方法でNUCに入れたら下準備は完了。
次はサンプルの必須ライブラリを入れていこう。
動作環境構築
$ python -V
Python 3.8.5
この環境。
ない場合は、
sudo apt-get update
sudo apt-get install python3 python3-venv
これでUbuntuなら入るでしょう。
あとzshだとうまく入らないコマンドがあったのでbash推奨。
python3 -m venv env
env/bin/python -m pip install --upgrade pip setuptools wheel
source env/bin/activate
まずは仮想環境内でライブラリ等を入れることに。
公式推奨なので従います。
sudo apt-get install portaudio19-dev libffi-dev libssl-dev
python -m pip install google-assistant-sdk[samples]
python -m pip install google-auth-oauthlib[tool]
cloneしてきて使ってもいいんだけど、とりあえずお試しで動かしたいのでお手軽にインストール。
必要なものは揃ったので、後は認証を通していく。
初回認証と起動
インストールしたgoogle-auth-oauthlib
を使って初回認証。
google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets <ダウンロードしたjsonファイルのパス>
Please visit this URL to authorize this application: https://<長いURL>
Enter the authorization code: <URLにアクセスして得た認証コードを貼り付け>
長いけど、jsonファイルパスもデフォルトではクソ長い。
コピペしてパスだけ置き換えるのが吉。
そしたらこれまた長いURLが出てくるので、そこにアクセスしてGoogleアカウントへのアクセスを許可する。
言う通りに進めてたら最後にコードが出てくるのでコンソールに貼り付けてエンターで認証完了。
いよいよ起動していく。
googlesamples-assistant-pushtotalk --project-id <project-id> --device-model-id <device-model-id>
プロジェクトIDは作ったの、モデルIDも作ったの。
オプションの情報も保存されるので次回からは、
googlesamples-assistant-pushtotalk
で起動できる。
後はこんな感じで動いてくれる。
googlesamples-assistant-pushtotalk --project-id <project-id> --device-model-id <device-model-id>
INFO:root:Connecting to embeddedassistant.googleapis.com
WARNING:root:Device config not found: [Errno 2] No such file or directory: ''
INFO:root:Registering device
INFO:root:Device registered:
Press Enter to send a new request...
INFO:root:Recording audio request.
INFO:root:Transcript of user request: "今日".
INFO:root:Transcript of user request: "今日の".
INFO:root:Transcript of user request: "今日のて".
INFO:root:Transcript of user request: "今日の天気".
INFO:root:Transcript of user request: "今日の天気は".
INFO:root:End of audio request detected.
INFO:root:Stopping recording.
INFO:root:Transcript of user request: "今日の天気は".
INFO:root:Playing assistant response.
INFO:root:Finished playing assistant response.
Press Enter to send a new request...
エンターキーでマイクからの入力が始まって、レスポンスしてくれる。
WindowsとかMacとかはマイク許可のポップアップが出てくるかも。
ちなみにDevice config not found
の後に表示されるパスにデバイス情報が保存されるので、違うものを使いたい場合はそのファイルを消せばいい。
Macだと
~/Library/Application Support/googlesamples-assistant/device_config.json
忘れるのでメモ。
動かし終わったら仮想環境から抜けておく。
このコマンドもよく忘れる…。
時々入るのも忘れてライブラリ無いって怒られる。
deactivate
これでとりあえずサンプルを動かすところまでは出来た。
次回はキーを押したら起動するのが実用から程遠いので、「OK、Google」…とはいかないが、声でアシスタントを起動できるようにしていこう。
なお、ソースを編集していくので起動方法も若干変える。
今回動いているなら動かすもの自体は同じなので問題ない。
次回:Intel NUCでGoogleHomeもどきを動かす(3)