17 February 2019

UbuntuにGoogleアシスタントをインストール

Ubuntu LinuxにGoogleアシスタント(音声アシスタント)をインストールした時のメモ

日経Linux 2019年3月号「クラウドと連携するアプリ! PCを 「AIスピーカー」 に仕立てる」を参考にした。

Actions on Googleのセットアップ

Actions on Google (https://developers.google.com/actions/) にアクセスし、新規デバイスの登録を行う

20190217-action-01.jpg

トップページより、 GO TO ACTIONS CONSOLE に入る

20190217-action-02.jpg

Add/import project を選択する

(既にセットアップが終わっている場合は、ここに表示されるデバイス一覧より、設定したいデバイスを選ぶ)

20190217-action-03.jpg

プロジェクトを作成する。

ここではドロップダウンリストより既存のプロジェクトを選ぶこともできるし、新規プロジェクト名を入力することで新規に作成することもできる

なお、言語・地域を選ぶのをお忘れなく

20190217-action-04.jpg

デバイスの追加 (Device registration)を選択する

20190217-action-05.jpg

プロダクト名、製造者名を入力し、装置の種類( = Speaker )を選択する

プロダクト名は、この後のコマンドラインでの操作で使うため、入力しやすい文字列としておいたほうが良い

20190217-action-06.jpg

デバイスの追加が完了すれば、OAuthの秘密鍵が含まれたjsonファイルがダウンロードできる。ここでダウンロードし忘れても、Actions Console からいつでもダウンロードできる

20190217-action-07.jpg

トライアル機能の選択は SKIP を押して構わない

Actions on Googleの管理

20190217-action-08.jpg

メニュー表示より、Device registration を選択すれば、登録されたデバイス一覧が表示される。この一覧より、OAuthの秘密鍵(json)ダウンロードができる。このファイルには client_id や project_id の値も保存されているので、のちほどコマンドラインでの作業でこれらの値を使うことになる。

Google API コンソールでGoogle Assistant APIを追加

Google API コンソール (https://console.developers.google.com/)を開く

20190217-auth-01.jpg

プロジェクト名をクリックして、プロジェクト選択画面を出す

20190217-auth-02.jpg

おそらく、「すべてのプロジェクト」を選択しないと、さきほどActions on Googleでデバイス登録した時のプロジェクト名が出てこないはず…

ここでデバイス登録した時のプロジェクトを選択する

20190217-add-api-01.jpg

API一覧に「Google Assistant API」が登録されていれば、新規登録は不要。登録されていない場合、画面最上部の 「APIサービスを有効化」 で新規登録する

20190217-add-api02.jpg

20190217-add-api03.jpg

「有効にする」をクリックすると、プロジェクトでAPIが使えるようになる

引き続き、認証情報を設定する

Google API コンソールで認証情報の設定

Google API コンソール (https://console.developers.google.com/) を開いたまま、引き続き設定を続ける

20190217-auth-03.jpg

メニューより、APIとサービス → 認証情報 を開く

画面に「OAuth同意画面を設定してください」のリンクがあるので、OAuth同意画面を設定する。 メールアドレスをドロップダウンリストから選択して、その他は既に設定されている値のまま、「保存」ボタンを押す。

20190217-auth-04.jpg

コマンドラインより使うのは、タイプが「その他」のもの。 OAuthクライアントIDのIDを選択し開いた画面にproject id が表示されている。この値も、のちほどコマンドラインで使うことになる。

20190217-auth-05.jpg

Ubuntu : 必要なパッケージのインストール

Pythonコードのコンパイルで必要になる一連のパッケージを、apt-getやSynapticでインストールする

・ python3-dev
・ python3-venv
・ portaudio19-dev
・ libffi-dev
・ libssl-dev
・ libmpg123-dev

Python仮想環境のインストール

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

仮想環境をインストールするディレクトリを「env」としている

Google Assistantをインストールする

Python仮想環境に入るコマンドは

$ python3 -m venv env

仮想環境下で、Google Assistantをインストールする

(env) $ python -m pip install --upgrade google-assistant-library
(env) $ python -m pip install --upgrade google-assistant-sdk[samples]
(env) $ python -m pip install --upgrade google-auth-oauthlib[tool]

セットアップが完了したら、認証を行う。コマンドラインにOAuth Web認証のURL(下例の茶色で着色部)が表示されるので、コピーしてブラウザで開き、認証コードをコマンドラインに戻す(下例の青色で着色部)

(env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets /home/vm/client_secret*.json
 
Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=131566995753-stOqlee756612oi2h4827m7519ptsvm9.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fassistant-sdk-prototype+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgcm&state=xxxxxxxxxxxxxxxxxxxxxxxx&prompt=consent&access_type=offline
 
Enter the authorization code: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
credentials saved: /home/user/.config/google-oauthlib-tool/credentials.json

初回の認証が行われると、次回からは/home/user/.config/google-oauthlib-tool/credentials.jsonに保存された認証データが用いられるので、次回からこの認証操作は不必要。

Google Assistantを使う

緑で着色した project_id と、青で着色した device_model_id を、それぞれのインストール環境に合わせて、次のようにコマンドを実行する

(env) $ googlesamples-assistant-hotword --project_id test-002-ad837-test-002-product-2zwh6c --device_model_id  test-002-ad837-test-002-product-2zwh6c
device_model_id: test-002-ad837-test-002-product-2zwh6c
device_id: 67866B81C1DB3C97E13FE9F471E7B411
 
Registering...Done.
 
ON_MUTED_CHANGED:
  {"is_muted": false}
ON_START_FINISHED
ON_MEDIA_STATE_IDLE     ← 音声コマンド入力待ち
 

話しかけて回答を得る例は…

ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {"text": "武漢には 李白の詩 などで有名な 黄鶴楼があるを中国語に翻訳"}
ON_RENDER_RESPONSE:
  {"text": "武汉有着名的李白黄鹤楼", "type": 0}
ON_RESPONDING_STARTED:
  {"is_error_response": false}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
  {"with_follow_on_turn": false}

タイマーの実行と、タイマーのブザー停止は…

ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {"text": "タイマー 5分"}
ON_RESPONDING_STARTED:
  {"is_error_response": false}
ON_RENDER_RESPONSE:
  {"text": "5分ですね。 スタート。", "type": 0}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
  {"with_follow_on_turn": false}
 
ON_ALERT_STARTED:
  {"alert_type": 1}
ON_ALERT_FINISHED:
  {"alert_type": 1}
 
ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {"text": "ストップ"}
ON_NO_RESPONSE
ON_CONVERSATION_TURN_FINISHED:
  {"with_follow_on_turn": false}

制限

音楽(radikoなど)は再生不可能

ON_MEDIA_STATE_IDLE
 
ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {"text": "NHK FM を再生"}
ON_RESPONDING_STARTED:
  {"is_error_response": false}
ON_RESPONDING_FINISHED
ON_RENDER_RESPONSE:
  {"text": "この端末では再生できません。他のデバイスを指定してください。", "type": 0}
ON_CONVERSATION_TURN_FINISHED:
  {"with_follow_on_turn": false}