【Raspberry PI】Google Assistant SDK [1] ~ 初期設定編 ~


gRPC (gRPC Remote Procedure Calls)については、以下の参考文献を参照
http://charleysdiary.hatenablog.com/entry/2016/09/08/163909

■ ハードウェア要件

[1] Raspberry PIのようなインターネットに繋がるデバイス
[2] マイク
[3] スピーカー
https://developers.google.com/assistant/sdk/develop/grpc/

■ 手順

 * 今回は、Pythonを選択

[1] ハードウェアとネット接続の設定

https://developers.google.com/assistant/sdk/develop/python/hardware/setup
以下の関連記事を参照
https://blogs.yahoo.co.jp/dk521123/37155840.html
https://blogs.yahoo.co.jp/dk521123/37157434.html
https://blogs.yahoo.co.jp/dk521123/37171100.html

[2] オーディオ(スピーカー / マイク)の設定とテスト

https://developers.google.com/assistant/sdk/develop/python/hardware/audio
[2-1-a] スピーカーをラズパイに接続し、以下のコマンドを実行し、スピーカーの接続テストをする
speaker-test -t wav

 => 何かしら聞こえたら、OK
 => 終了する場合は、「Ctrl+C」
[2-1-b] 以下のコマンドを実行する
record --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw

 => エラーが発生した場合は、[2-2-a] 以降を行う
[2-1-c] 以下のコマンドを実行する
aplay --format=S16_LE --rate=16000 out.raw
[2-1-d] 以下のコマンドを実行し、ボリュームを調整する
alsamixer

 => エラーがなくここまで進めれば、
[2-2-a] 録音に使えるデバイス(マイク)の一覧を、以下のコマンドで取得する
arecord -l

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio] << ★a
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

 => マイクは、★aより、デバイス番号:0、カード番号:1
[2-2-b] オーディオ・デバイスの一覧を、以下のコマンドで取得する
aplay -l

**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA] << ★b
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
... 略 ...
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

 => スピーカーは、★bより、デバイス番号:0、カード番号:0
[2-2-c] [2-2-a]、[2-2-b]で調べた「デバイス番号」および「カード番号」を .asoundrc ファイルに反映させる
vi ~/.asoundrc
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:1,0" << 「pcm "hw:<マイクのカード番号>,<マイクのデバイス番号>"」
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:0,0" << 「pcm "hw:<スピーカーのカード番号>,<スピーカーのデバイス番号>"」
  }
}
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[2-2-d] もし、 HDMI モニターと3.5mmジャックスピーカーが繋がっていたら、以下を行う
sudo raspi-config

 => 実行したら、[Advanced options]-[Audio]を、お好きな方を選ぶ
  (今回は「Force 3.5mm('headphone') jack」を選択)
[2-2-e] [2-1-a]を繰り返す

[3] Google Developerプロジェクトとアカウントを設定

https://developers.google.com/assistant/sdk/develop/python/config-dev-project-and-account
 [3-1] プロジェクトを作成
 [3-2] 作成したプロジェクトに対して、Google Assistant APIを有効にする
 [3-3] OAuth クライアント ID を作成する
 [3-4] シークレットjsonファイル「client_secret_【client-id】.json」をダウンロードする

[4] ライブラリのダウンロードとサンプルの実行

https://developers.google.com/assistant/sdk/develop/python/run-sample
[4-1] Python3 を設定するために、以下のコマンドを実行
sudo apt-get update
sudo apt-get install python3-dev python3-venv
python3 -m venv env
env/bin/python -m pip install --upgrade pip setuptools
source env/bin/activate

 => 「source env/bin/activate」を実行すると、画面表示が「(env)$ ...」と変化する
※ エラーが出た場合...
 赤字で『TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'』等の
エラーが表示された場合、以下のコマンドを実行して再度、コマンドを実行する
~~~~~
apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py
~~~~~
https://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry
[4-2] サンプルコード及びGoogle Assistantライブラリをインストールするために、以下のコマンドを実行
(env)$ python -m pip install --upgrade google-assistant-library
[4-3] サンプルの実行
 * 以降、サンプルを実行するための手順。
[4-3-1] authorizationツールをインストールするために、以下のコマンドを実行
(env)$ python -m pip install --upgrade google-auth-oauthlib[tool]

 => 『...[tool]』はまとめて実行する
[4-3-2] Google Assistant SDKのサンプルに権限を与えるために以下のコマンドを実行
(env)$ google-oauthlib-tool --client-secrets ~/client_secret_【client-id】.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save

 => 『client_secret_【client-id】.json』は、[3-4]でダウンロードしたjsonファイル。

ssh接続の場合は以下。

(env)$ google-oauthlib-tool --client-secrets ~/client_secret_【client-id】.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save

 => ブラウザが立ち上がり、googleアカウントでログインし、自分のアカウントをクリック。
    そして、選択したアカウントへ許可のリクエストが送られるので「許可」ボタン押下
[4-3-3] 以下を実行しサンプルを起動する
(env)$ google-assistant-demo

ON_MUTED_CHANGED:
  {'is_muted': False}
ON_START_FINISHED
[4-3-4] 「Ok Google」又は「Hey Google」とアメリカ英語の発音(!?)でいった後で、何か英語でいう(例「How are you?」)
ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {'text': 'how are you'} << 「How are you?」って言ってみた
ON_RESPONDING_STARTED:
  {'is_error_response': False}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
  {'with_follow_on_turn': True}

ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
  {'text': 'thank you'} << 「Thank you」って言ってみた
ON_RESPONDING_STARTED:
  {'is_error_response': False}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
  {'with_follow_on_turn': False}