【Raspberry Pi】ラズパイ3でOKグーグルする

以前ラズパイ3でAlexaしました。
engetu21.hatenablog.com


今度はラズパイ3でOKグーグルしてみます。
developers.google.com

なお、英語は読めないので、ところどころGoogle日本語翻訳機能を使って日本語化してます。

1.ラズパイ3の準備

f:id:engetu21:20190505205007p:plain
ハードウェア毎の準備については、「ハードウェアとネットワークアクセスを設定する」を選択することで、確認することが可能。
最もラズパイに関しては、ここを見るよりは詳しい情報を見たほうがいい。(一応昔書いたけど)
engetu21.hatenablog.com
engetu21.hatenablog.com

2.プロジェクトの作成とAPIの有効化

f:id:engetu21:20190505211244p:plain
※事前にグーグルアカウントを用意しておいたほうがよいです。

手順にしたがって、アクションコンソールから操作を行います。
[アクションコントロールに移動します]を押下。
リンク:https://console.actions.google.com/


f:id:engetu21:20190505212154p:plain
新しく画面が開くため、[Add/import project]を押下。


f:id:engetu21:20190505212520p:plain
利用規約に同意します。下2つは最新情報受け取るかとかそんな感じ。


f:id:engetu21:20190505213052p:plain
プロジェクト名を設定。プロジェクト名はとりあえずデフォルト。日本人なので日本語と日本を設定。


f:id:engetu21:20190505213947p:plain
プロジェクトが作成されるとWelcomeページに飛ぶ。ページ一番下にある[Device registration]を押下する。


f:id:engetu21:20190505215017p:plain
押下すると上記のような画面に。とりあえずこの画面は後ほどいじりますが、今は放置。手順に戻ります。


f:id:engetu21:20190505215317p:plain
手順画面から[APIを有効にする]を押下。


f:id:engetu21:20190505215556p:plain
ページが新しく開くので、[有効にする]を押下することでAPIの設定が完了する。


f:id:engetu21:20190505215853p:plain
作成したプロジェクトにてAPIが使えるようになると上記の画面表示になる。
とりあえずこの画面も放置。


3.アクティビティ管理設定

手順からアクティビティ設定画面に飛ぶ。以下のリンクから飛んでもOK。
https://myaccount.google.com/activitycontrols?pli=1

OKグーグルをするには以下が有効になっていないといけないらしい。

・Webとアプリのアクティビティ
 さらに、Googleのサービスを使用するサイト、アプリ、端末のChromeの履歴とアクティビティを含めるチェックボックスを必ず選択してください。
・デバイス情報
・音声と音声のアクティビティ

とのこと。
いくつかのアクティビティを有効にするので、気になる人はOKグーグル用にアカウントを作ってもいいかもしれない。

f:id:engetu21:20190505223928p:plain

4.デバイス(ラズパイ3)の情報を登録する

https://console.actions.google.com/project/作成したプロジェクト/deviceregistration/
手順に従ってデバイスの登録を行います。


ここでは一旦放置していた↓の画面を利用します。
f:id:engetu21:20190505215017p:plain
[REGISTER MODEL]を押下。


f:id:engetu21:20190505224747p:plain
設定画面になるので、ひとまず適当に設定を行います。
[REGISTER MODEL]を押下。


f:id:engetu21:20190505225652p:plain
認証情報を自動で生成してくれるため、[Download OAuth2.0 credentials]を押下することで、JSONファイルをダウンロードすることができます。


f:id:engetu21:20190505230541p:plain
特性?については今のところは何も設定せず、[SKIP]を押下。


f:id:engetu21:20190505230817p:plain
作成が完了するとメニューにデバイスが表示される。
なお、うっかり認証情報(JSON)でダウンロードし忘れた場合は、デバイスの[・・・]からダウンロードできます。
あるいは、
https://console.developers.google.com/apis/credentials/consent
にアクセスしたあと、認証情報タブに移動し、「OAuth 2.0 クライアント ID」欄に作成した認証情報が追加されているため、そちらからダウンロードすることも可能です。


5.SDKとサンプルコードをインストール

https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
ラズパイ3にて記載されている手順通りにコマンドを実行します。

python3とpipをすでに入れている場合は実行する必要はないかもしれない。

$ sudo apt update
$ sudo apt install python3-dev python3-venv
$ python3 -m venv env
$ ~/env/bin/python -m pip install --upgrade pip setuptools wheel
$ source ~/env/bin/activate

source ~/env/bin/activateを実行することで、コンソールに(env)が付くようになります。どうやら以降の作業で必須の模様。


パッケージをインストール

(env) $ sudo apt install portaudio19-dev libffi-dev libssl-dev libmpg123-dev
(env) $ python -m pip install --upgrade google-assistant-library==1.0.1
(env) $ python -m pip install --upgrade google-assistant-sdk[samples]==0.5.1


認証ツールをインストール

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


次のコマンドにて4項でダウンロードしたJSONファイルが必要になります。
手順ではSCPコマンドでラズパイ3にファイルを渡す手順が記載されていますが、JSONファイルはテキストファイルなので、コンソール上でテキストファイルを作成、中身をコピペでも問題ありません。
ただし、ファイル名は全く同じものにする必要があります。
ファイルを置くのはpiユーザを使っている場合であれば/home/piでよいかと。(絶対パスで指定するので、実際どこでもいい)

(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/pi/client_secret_XXXXXXXXXXXXXX.json

実行すると、以下の形でURLが表示される。

Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=***************

指定されたURLに関してはどの端末からアクセスしてもいい。コピペしてブラウザで開きます。
アカウントの選択画面が出るため、該当のアカウントを押下。

f:id:engetu21:20190505235438p:plain
権限の付与を許可。


f:id:engetu21:20190505235926p:plain
許可するとコードが発行されるため、これをコピーし、ラズパイのコンソールにて設定

Enter the authorization code: コピーしたコード

コードが承認されると以下のように表示され、JSONファイルが生成される(中身を見る必要は特に無い)

credentials saved: /home/pi/.config/google-oauthlib-tool/credentials.json

6.サンプルコードの実行

ラズパイ3上で以下のコマンドを実行する。

$ source ~/env/bin/activate
(env) $ googlesamples-assistant-hotword --project-id my-dev-project --device-model-id my-model

my-dev-projectの部分(プロジェクトID)は作成したプロジェクトから確認する必要があります。

https://console.actions.google.com/
まず、アクションコンソールにアクセス。

f:id:engetu21:20190506003728p:plain
作成したプロジェクトを選択し、左メニューの「Overview」の歯車をクリック、[Project setteings]を押下することで確認することができます。

また、my-modelの部分(モデルID)については、
f:id:engetu21:20190506004302p:plain
「Advanced Options」の[Device registration]を押下し、登録したデバイスを押すことで詳細画面を表示できるため、そこから「Model Id」を確認できます。
f:id:engetu21:20190506004705p:plain


実行に成功すると以下のように表示されます。

( ゚д゚)< OKグーグル
 
ON_CONVERSATION_TURN_STARTED
 
( ゚д゚)< Tell me the weather today(今日の天気を教えて)
 
ON_END_OF_UTTERANCE
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
{"text": "tell me some results today"}
ON_RESPONDING_STARTED:
{"is_error_response": false}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
{"with_follow_on_turn": false}

日本語発音のせいか、正常に認識はされない模様・・・。
また、スピーカーから喋ってくれないのを確認。これはあとで直すとしてとりあえず放置。

7.日本語音声入力に変更する

どうやら、日本語での入力に変更するにはAndroidGoogleアシスタントアプリから変更するらしい。

アプリを起動し、
f:id:engetu21:20190506005645p:plain
右上のアカウントアイコンから[設定]を押下


f:id:engetu21:20190506005732p:plain
アシスタントの[言語]を押下


f:id:engetu21:20190506005811p:plain
Englishになっているのを「日本語」に変更


OKグーグルと呼びかけると以下のようになります。

( ゚д゚)< OKグーグル
 
ON_CONVERSATION_TURN_STARTED
 
( ゚д゚)< 今日は何の日?
 
ON_END_OF_UTTERANCE
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
{"text": "今日は何の日"}
ON_RESPONDING_STARTED:
{"is_error_response": false}
ON_RESPONDING_FINISHED
ON_RENDER_RESPONSE:
{"text": "5月6日、1970年のこの日、日本で改正著作権法が公布され、著作権保護が死後 50 年までになったそうです", "type": 0}
ON_CONVERSATION_TURN_FINISHED:
{"with_follow_on_turn": false}

正常に認識されていますね!
なお、スピーカーから相変わらず喋ってくれない模様。ぐぬぬ・・・
→どうやら音自体は出ているけど、ものすごく音量が低くて聞き取れないレベルだった模様。
 う〜む、ソースを弄るしかないということか?
 弄るとしたら↓のvolume_percentageを変更・・・かな?
 https://github.com/googlesamples/assistant-sdk-python/blob/master/google-assistant-sdk/googlesamples/assistant/grpc/audio_helpers.py
→と思ってたけど、OKグーグルしたあとに「音量を100%にして」というだけで音量上がりましたとさ・・・

8.ウェイクアップワード(ホットワード)で音を鳴らす[2019/5/9追記]

デフォルトのままでは「OKグーグル」と呼んだだけでは反応しているのかどうかがわからないため、受付後に音を鳴らします。
参考:
amikodomolabo.org


クライアントアプリのソースは以下のものが該当する。
/home/pi/env/lib/python3.5/site-packages/googlesamples/assistant/library/hotword.py

これをエディタで開いて「ON_CONVERSATION_TURN_STARTED」で検索します。

$ vi /home/pi/env/lib/python3.5/site-packages/googlesamples/assistant/library/hotword.py
/ON_CONVERSATION_TURN_STARTED


イベント発生時、つまり「OKグーグル」と呼びかけたときの動作としてはprint出力をしているだけのようなので、ここで音を鳴らすようにすればいい模様。

音はwavファイルであれば何でもいいけど、適当なディレクトリに配置し、それを指定。
私はAlexa入れてたときに使ってた音をそのまま流用します。

if event.type == EventType.ON_CONVERSATION_TURN_STARTED:
print()

if event.type == EventType.ON_CONVERSATION_TURN_STARTED:
print()
subprocess.call("aplay /home/pi/env/dong.wav", shell=True) ←追加

ここでは、pythonのsubprocessを使って、aplayコマンドを実行します。
そのため、subprocessのimportも必要。

import argparse
import json
import os.path
import pathlib2 as pathlib

import argparse
import json
import os.path
import pathlib2 as pathlib
import subprocess ←追加

9.Alexaを入れた場合と比較して

Alexaよりウェイクアップワードの検出がかなり精度がよく、ライブラリを自分で変更しなければならないとかがないので、セットアップはとても楽。
天気を聞くなどの簡単なことについてはどちらも遜色無いですが、「〇〇について教えて」系の質問はわからないと言われたり、ピカチュウとの会話はできない(アカウント次第?)ようです。