ラズパイ3でGoogle Assistant を使ってみる(メモ)


音声認識エンジン Juliusとの連携について


この方のページを参考にしました。

詳細は譲って、手続きのみをさっさと。

Google側での作業

ラズパイでブラウザー(既定はChromium)を開いて、

ACTION CONSOLEでプロジェクトを新規に作成。

以下は例です。

Project
MyAssistant

Language->Japanese

Country->Japan

————————————-
ページを閉じず別タブでGoogle Assistant APIを有効にする

ProjectがMyAssistantになっていることを確認

有効をクリック

OAuth同意画面のタブをクリック

メールアドレスを設定して保存

————————————-

元のタブに戻って、

緑のアイコンの「Device registration」をクリック

REGISTER MODEL

3つ目のTypeは選びづらいです。根気よくアイコンが変わる場所を探します。

XXX_Project
XXX_Project_A
Lights

Device Model idは控えておきます、後で使います。

myassistant-*****-xxx_project-yyyyyy <=Device Model ID

「REGISTER MODEL」をクリック

「Download OAuth 2.0 credetials」でダウンロード

「NEXT」ボタンをクリックします。

次に、traitsを保存(SAVE TRAITS)するためのページに遷移しますが、ここでは「SKIP」をクリックしてスキップします。

 

project IDを確認しておく

バーガーアイコンー>Overview

myassistant-***** <= project ID

 

別タブでアクティビティ管理画面

下記の4点の設定を確認してください。

  • 「ウェブとアプリのアクティビティ」を有効(青色)に
  • 「Chrome の閲覧履歴と Google サービスを使用するウェブサイトやアプリでのアクティビティを含める」にチェック
  • 「端末情報」を有効(青色)に
  • 「音声アクティビティ」を有効(青色)に

 

ラズパイ側での作業

 

ターミナルを開く

ダウンロードしたjsonファイルを/home/piに移動しておく

$ mv Downloads/*.json .

仮想環境にAssistantをインストールします。

$ sudo apt-get update

$ sudo apt-get install python3-dev python3-venv

WisteriaHillではこのinstallは失敗しましたが、影響はないようです(?)。

 

$ python3 -m venv env

$ env/bin/python -m pip install pip setuptools

$ source env/bin/activate

(env) $ sudo apt-get install portaudio19-dev libffi-dev libssl-dev
(env) $ python -m pip install  google-assistant-library
(env)$ python -m pip install  google-assistant-sdk[samples]
(env) $ python -m pip install  google-auth-oauthlib[tool]

 

表示されるURLに移動して、Authrization Codeを取得して、ターミナル画面にペーストして完了。

 

OR

(env) $ google-assistant-demo

 


●Error 401になる場合

learn moreで対象ページ移動

不足情報(メールの登録など)を補って保存

●Failed to register device PERMISSION_DENIED (403):

Assistant APIが有効になっていない場合もあるので管理画面で有効化

 

●日本語が認識されない場合

こういうやり方をするそうです
Android端末のアシスタントアプリ(なければPlayからDL)で日本語設定

設定->アシスタントのタブ->アシスタントデバイスー>(作成したプロジェクト名)->アカウントに基づく情報を有効化

 

●python -m pip install  google-assistant-sdk[samples]がExceptionエラーで途中で止まる

理由は不明ですが、エラーにかまわず、最後までインストールを実行し、最後にもう一度、実行します。

何の問題もなくsamplesが入ってしまいます。理由は不明です。

 

 


シェルスクリプトでAssistantの仮想環境を起動

仮想環境用のシェルスクリプト

【grpc.sh】

 

ターミナルでgrpc.shを実行するシェルスクリプト

【grpc_wakeon.sh】

 

 

grpc_wakeon.shに実行権をつけてダブルクリックで起動

 


Google Assistant Libraryのhotwordで「ok,google」してお天気を尋ねたの図。

hotwordのメインコード

/home/pi/env/bin/googlesamples-assistant-hotword

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

/home/pi/env/lib/python3.5/site-packages/google/assistant/library/*

また、hotwordではなくReturnキーをトリガーにすることもできます。

 

以下のGoogle Assistant Service のpushtotalkとtextinputはhotwordとは異なるコード体系を使っています(gRPC)。

 

pushtotalkを使った例

hotwordとはオプションの綴りが違います

devaice_model_id -> device-model-id

コードを修正(?)すれば、トリガー無しの連続認識も可能です。

連続認識の場合は、SampleAssistantの中の以下のコードを書き換えます。

 

ここをシンプルに以下のように記述

 

この場合、環境ノイズも拾っているみたいで、nullというか空が返ってきているようだけど、これもリクエストにカウントされているのかな?認識できない場合はノーカウント?

要調査です。

どうも環境ノイズもカウントしているっぽいですね。Juliusがウェイクワードをキャッチするまでは、continue_conversation = assistant.assist()をブロックしておいた方がいいようです。

 

 

あるいは、文字入力をトリガーにして応答を返すこともできます。

 

textinputを使った例

textinput ではdevice-idのオプションが必要
googlesamples-assistant-pushtotalkの画面で表示されるので控えておきましょう

 

この場合は音声応答ではなく文字で応えてくれます。

 

なお、pushtotalkもtextinputもServiceというシステムのサブセットのようなもので、まったく別々のものというわけではないです。

Assistant SDKにあるpushtotalk.pyとtextinput.pyのコードを見比べるとじんわり分かります。

従って、例えばpushtotalkで音声認識した結果と応答を共にテキスト形式で取得するということも可能です。

逆に、文字入力を受けて、応答を音声で出力することも可能です(Googleの音声合成の声が気に入ってればの話ですけど)。

 

 


JulilusとGoogle Assistantを連携させてみる

JuliusをフロントエンドにしてAssistantと連携するワケ。

〇現状では、認識精度はAssistantの方が上。

Juliusの認識精度をAssistant並みに向上できれば連携は不要なのだが。

〇Assistantには制限がある(引っかかったらJulius単体に切り替え)。

クラウドが使えない環境でスタンドアローンの自己完結型でも使いたい。

〇ウェイクワード(ホットワード)に好きなものを使いたい。

こういうものもあるそうです(Porcupine と Snowboy)

WisteriaHillはスマートスピーカーを使う予定はないので見送っています。

〇応答に他の音声合成エンジンを使いたい。

〇色々な家電やセンサーの制御に使いたい。

〇Assistantは発声を認識して結果を返してくれるだけで十分。応答は必ずしも必要ではない。

データベースナレッジベースをいろいろ使いたい。

〇応答結果を他のメディア(メールブラウザーメモ、即応性の良いUSBサーマルレシートプリンターなど)に渡したい。

サーマルプリンターはレシートに使うわけではなく、メモ程度のものをさっさと印刷するのに使います。

〇「繰り返して」というようなフレーズをJulius側で認識できれば、Assistantの応答を聞き直せるようにしたい。Assistantを使うかどうかの判断をJuliusサイドに任せる(繰り返して…というワードの認識精度は結構高いです)。

〇質問したら即応答が返ってきたり、淡々と「わかりません」とか「おやくにたてそうもありません」みたいに応える、あの愛想の無さを何とかしたい。

 

…..etc

 

Juliusを使ったプロセスとAssistantのプロセスはsocketで接続しています。

マイクからの音声はJuliusとAssistantの両方に渡されます

Assistantの方はまずはブロックしておきます。

Juliusがウェイクワードを拾ってからAssistantのブロックを解除します。

Juliusサイドからは「はいはーい」みたいな返答を返します。これがAssistantに命令なり質問なりを行うキュー出しになります。

こうすることで、Assistantが無意味に環境ノイズを拾いまくるのを防ぎます。

Julius -> Assistant

Assistant -> Julius

JuliusとAssistantを連携させる場合、厄介なのは家電制御にも使う場合です。

発話内容が、「~して!」というお願い系なのか「~って何?」という質問系なのかをJulius側で判断しないといけない。

Assistantからは発声の認識と、発話内容についての応答の2つの結果が返ってくるので発声の認識結果から家電制御するか応答をそのまま音声合成して流すかの判断。

例えば、お願い系の発話

赤が発声の認識結果、黄色が応答です。Google Homeは使う予定はないのでこんな応答になっています。

 

質問系ならこんな感じ。

間違って認識した結果の応答は棄却するという判断も必要。

形態素解析だけで何とかなるものなのか思案してみます。

あるキーワードが含まれるかどうかだけなら、分かち書きがあればいいだけだけど…。

要は、ワードと品詞と並び順で判断できるのか……ということ。

同じような応答が返ってくるようなら、そこで判断してもいいですし。

ウェイクワード(ホットワード)を別にする….という手もあるし。

Juliusについてはこのページ参照

 

コードの紹介とかその他いろいろ準備中


 

レーベンシュタイン距離が判断に使えるか調べてみます。

 


マイクからの入力をJuliusとAssistantの両方に渡す

  この状態で一度Juliusを起動して、走っているのを確認して終了。 今度はAssistantを起動して、走っているのを確認して終了。 次に、.soundrcを改名(例:.soundrc_X)しておきます。 で、Juliusを起動して、同時にAssistantを起動します。 両方機能すると思います。 もっとうまいやり方があると思うので調査中。 *

考え方が間違ってる?

両方に渡されないのは.asoundrcが原因なのだから削除すればいい....が正解?

-->

JulisやAssistantがマイクのような入力デバイスを見失って起動できない場合があります。

ALSA設定ファイル(/home/pi/.asoundrc)が原因の場合があります。

対策 -> 削除

このALSA設定ファイルはメニュバーの設定で出力先の変更をしたり、ハード的に変更したりすると勝手に作られてしまうので注意が必要です。

 


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*