発売日:2018年1月5日
価格:2180円+税

【特集】
センサー200種総ガイド~
温度からにおいまで

【特集】
3000円でスマートスピーカーを自作!
Google AIY Voice Kit を大解剖

【特集】
みんなのラズパイコンテスト2017
受賞した全50作品を一挙紹介

【付録冊子】 52ページ
みんなのラズパイコンテスト
グランプリ作品のすべて

●詳細目次は<こちら>





特集2「3000円でスマートスピーカーを自作!」p.44~52

2017年12月26日の補足(2018年1月4、17日に追記・修正)

 本誌の発売直前に「Google Assistant SDK」がバージョンアップしました(Google Assistant SDKの2017/12/20のアップデート)。本誌の特集2で紹介したVoice Kitに標準インストールされているGoogle Assistant SDKも、最新版にバージョンアップできます。以下では、同SDKをバージョンアップする手順を補足情報としてまとめました。

(以下、2018年1月4、17日に追記・修正)

 

 このバージョンアップによって、市販のAIスピーカー「Google Home」などと同じように、クラウドサービスのGoogle Assistantと日本語で会話して、ほぼ同じ回答が得られるようになりました(後述のgRPCを使った場合)。

 ただし、SDKをバージョンアップすると「ステップ1」で紹介したサンプルプログラム「assistant_library_demo.py」が動作しなくなる不具合が生じます。これを回避するための方法も、併せてまとめておきました。ただし2018年1月17日時点では、assistant_library_demo.pyは日本語に対応できないようです。

 2018年1月4日に公開した手順には、一部抜けがありました。本ページで「2018年1月17日」で検索するなどして、追記部分を確認してください。おわびして訂正します。

(以上、2018年1月4、17日に追記・修正)

 

 さらに、記事では取り上げませんでしたが、今回のバージョンアップでGoogle Assistant SDKで提供されるAPIの一つ「gRPC」が、日本語での会話に対応しました。このgRPCを使ったサンプルプログラムも、参考情報として最後にまとめてあります。ぜひご参照ください。

※ 以下の作業を進める上での注意点 ※

 以降の作業はすべてVoice KitのPython Virtual Environment上で実行する必要があります。このため、記載されているコマンドはすべて、Voice Kitのデスクトップ画面にあるショートカット「Start dev terminal」から起動した端末にて、実行するようにしてください。

■「Google Assistant SDK」をアップデートする手順

 次のコマンドを実行して、Voice Kitに標準インストールされている「google-assistant-sdk」を最新版の「0.4.0」以上にアップデートします。

$ pip install --upgrade google-assistant-sdk[samples] google-auth-oauthlib[tool] google-assistant-library

■変更履歴
補足情報の公開時(2017年12月26日)に、アップデートすべきパッケージが一つ抜けていました(google-assistant-library)。お詫びして訂正します。本文は修正済みです。[2018年1月17日14:30]


 実行後、正常にアップデートされたことを確認しておきましょう。

$ pip list | grep google-assistant

 「google-assistant-sdk (0.4.0)」(または、それ以上のバージョン)と表示されれば、正常にアップデートできています。

■アップデート後は、デバイス(Voice Kit)の認証と登録が必須に

 最新版のGoogle Assistant SDKでは、認証・登録済みのデバイスからしか同SDKを利用できなくなりました。このため最新版にバージョンアップした場合には、Voice Kitも登録・認証しておく必要があります。

 まず、Google Cloud Platform(GCP)のコンソールで「APIs & Services」の「認証情報」の画面を開きます。項目「OAuth2.0クライアントID」のところで、画面右側に表示されている「ダウンロード」ボタン(図1の赤丸部分)をクリックし、認証情報のJSONファイルをダウンロードします。

図1●「APIs & Services」の「認証情報」の画面
[画像のクリックで拡大表示]

 同じ作業は、ラズパイマガジンに掲載した記事でも紹介しています(p.46、図1、手順16)。記事ではダウンロードしたJSONファイルの名前を「assistant.json」に変更しました。今回は名前を変えず、ダウンロードしたままの名前で利用します。

$ mv ~/Downloads/client_secret_* ~

 ダウンロードしたJSONファイルを使って、まずはOAuth認証を済ませましょう。次のコマンドを実行します。コマンド中の「{ your client secret file }」の部分は、先ほどダウンロードし、移動したJSONファイルの名前と丸ごと置き換えてください。

$ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless --client-secrets { your client secret file }

 実行後、OAuth認証用のURLが表示されます。表示されたURLにWebブラウザーでアクセスすると、アクセスコードを取得できます(図2)。取得したアクセスコードを、先ほどコマンドを実行した端末の画面に表示されている「Enter the authorization code:」に入力してください。

図2●アクセスコードを表示した画面
[画像のクリックで拡大表示]

 ここまででOAuth認証が完了しました。

(以下、2018年1月17日に追記)

 ダウンロードしたJSONファイルは、「assistant.json」のファイル名でコピーを作っておきます。次のコマンドを実行してください。

$ cp ~/client_secret_* ~/assistant.json

(以上、2018年1月17日に追記)

 続いてデバイスを登録します。ホームフォルダーに移動してから、次のコマンドを実行してください。コマンド中の「{ your model id }」の部分はデバイスのモデル名を指定します。適当で構いませんが一意なIDである必要があるため、例えばプロジェクトIDが「TestProject-1020」でデバイスのモデル名が「TestModel01」であれば、二つをくっ付けて「TestProject-1020_TestModel01」などと指定することが推奨されています。GCPのプロジェクトIDは、コンソール画面を開いているURLの中で「project」クエリーパラメーターに表示されています(図3の下線部)。

$ cd ~
$ googlesamples-assistant-devicetool register-model --manufacturer 'developer' --product-name 'voicekit-sample' --type LIGHT --model { your model id }
図3●GCPのコンソール画面のURLに表示されている「project」クエリーパラメーター
[画像のクリックで拡大表示]

 実行後、正しく登録できていることを確認しておきましょう。

$ googlesamples-assistant-devicetool list --model

(以下、2018年1月17日に追記)

 続いてデバイス名を登録します。再びホームフォルダーで次のコマンドを実行します。{ your model id }は先ほどの登録したモデル名を使用し、{ your device id }の部分は自分で考えたデバイス名を指定します。

$ cd ~
$ googlesamples-assistant-devicetool register-device --client-type LIBRARY --model { your model id } --device { your device id }

 次のコマンドで正しく登録できていることを確認しておきましょう。

$ googlesamples-assistant-devicetool list --device

(以上、2018年1月17日に追記)

■登録したデバイスを日本語に設定する(2018年1月4日に追記)

 スマートフォンからGoogle Assistantアプリを起動し(Androidならホームボタンを長押しするなど)、右上の青色のボタンを押します。「使い方・ヒント」の画面で右上のボタンを押し、「設定」を押します。

図4●Google Assistantアプリの設定画面を開く
[画像のクリックで拡大表示]

 設定画面が開くと、「デバイス」の項目に先ほど登録したデバイスが表示されているはずです(少しタイムラグがあります)。表示されたデバイスをタップし、「アシスタントの言語」の項目を「日本語」に設定します。

図5●Google Assistantアプリの設定画面でVoice Kitを日本語に設定する
[画像のクリックで拡大表示]

(以上、2018年1月4日に追記)

■バージョンアップ後、「ステップ1」の「assistant_library_demo.py」が動作しなくなる不具合を解決する方法

 Google Assistant SDKをバージョンアップすると、記事の「ステップ1」で紹介していたサンプルプログラム「assistant_library_demo.py」が動作しなくなります。理由は、同SDKの内部で使っているライブラリが「v1alpha1」から「v1alpha2」へ、大幅にバージョンアップされたためでです。

 解決策としては、「Assistantクラス」の第2引数に「device_model_id」を指定します。assistant_library_demo.pyファイルをテキストエディタで開いて修正してください。

def main():
    device_model_id='aiyproject2-189517'
    credentials = aiy.assistant.auth_helpers.get_assistant_credentials()
    with Assistant(credentials,device_model_id) as assistant:
        for event in assistant.start():
            process_event(event)

(以下、2018年1月4日に追記して、2018年1月17日に変更)

 修正後にコマンドを実行すると、会話ができます。「OK, Google」(ホットワード)と英語で話しかけることで、会話が始まります。ただし2018年1月4日時点では、その後の会話が日本語でできた(その時点で筆者が実際に試したYouTube動画はこちら)のですが、その後のアップデートのためか、2018年1月17日時点では、また英語での会話しかできなくなっているようです。

(以上、2018年1月4日に追記、2018年1月17日に変更)

■「gRPC」を使ったサンプルプログラム「pushtotalk」を試す

 冒頭でお伝えした通り、今回のバージョンアップでgRPCが日本語に対応しました。Google Assistant SDKでは、gRPCを使ったサンプルプログラム「pushtotalk」が用意されています。このサンプルプログラムを使って、日本語で会話できることを確認してみましょう。

 次のコマンドで実行できます。コマンド中の「{ your project id }」はGCPのプロジェクトIDを、「{ your model id }」は先ほど決めたデバイスのモデル名を指定します。

$ googlesamples-assistant-pushtotalk --project-id { your project id } --device-model-id { your model id } --lang 'ja-JP'

 実行後、「Press Enter to send a new request...」と表示されるので[Enter]キーを押し、続けて「いま何時?」などとVoice Kitに発話します。発話した内容が日本語で認識され、応答も日本語で返ってきます。

図6●日本語の会話が可能になったGoogle Assistant機能の実行画面
[画像のクリックで拡大表示]

■「gRPC」を組み込んだプログラムを作ってみる

 日本語で会話できることが確認できたので、実際にgRPCを使った日本語対応のGoogle Assistantの機能をVoice Kitに組み込んでみましょう。とはいえ、ゼロからプログラミングするのは大変なので、筆者がサンプルプログラムを用意しました。以下のコマンドで「~/AIY-voice-kit-python/src」フォルダーにダウンロードしてください。

$ cd ~/AIY-voice-kit-python
$ wget https://raw.githubusercontent.com/garicchi/voicekit-sample/master/assistant_japanese.py -O src/assistant_japanese.py

 ダウンロードしたサンプルプログラムを自分のVoice Kitで動作させるには、先ほど指定した「project id」(プロジェクトID)と「device model id」(デバイスのモデル名)を、サンプルプログラムの中で指定する必要があります。サンプルプログラムをテキストエディタで開いて編集しましょう。

$ nano src/assistant_japanese.py

 main関数の直下に表記されている「{ your device model id }」と「{ your project id }」の文字列を、それぞれ丸ごと自分が指定したプロジェクトIDとデバイスのモデル名に置き換えてください。置き換えたら[Ctrl]+[X]キーを押し、表示されるファイルの保存確認メッセージで[Y]キーを押してテキストエディタを閉じます。

 続いて、依存ライブラリを「~/AIY-voice-kit-python/src」フォルダーに移します。

$ cp -R ~/AIY-voice-kit-python/env/lib/python3.5/site-packages/googlesamples/ ~/AIY-voice-kit-python/src/

■変更履歴
1月4日の補足情報の更新時には、cpコマンドのコピー元フォルダー名が「python3.4」でしたが、1月17日時点では「python3.5」に変わっていたので、修正しました。[2018年1月17日 14:30]


 以上でサンプルプログラムを実行する準備が整いました。次のコマンドでサンプルプログラムを実行してみましょう。

$ python src/assistant_japanese.py

 実行後、Voice KitのLEDボタンを押すと、Google Assistantと日本語で会話できます。会話の継続機能も実装しているので、例えば「愚痴聞いてタンバリン」などの機能も正しく認識して動作します。

 筆者が試した動画を公開しています。ぜひご覧ください。

■サンプルプログラム「assistant_japanese.py」のソースコードを読み解く

 gRPCは、ホットワードを用いないでグーグルアシスタント機能を利用するためのAPIです。今回のプログラムでは、Voice KitのLEDボタンを押すと、会話を始められるように設定してあります。そのサンプルプログラム「assistant_japanese.py」の中身について、簡単に解説しておきます。


■変更履歴
補足情報の公開時(12月26日)、上の段落で不正確な表現があったので、修正しました。[2018年1月17日14:30


 「initialize関数」でデバイスを初期設定します。このとき、「device_model_id」と「device_id」「conversation_stream」「gRPC_channel」「device_handler」を作成しています。そして、それを「SampleAssistantクラス」に渡して初期化します。「continue_talk = assistant.assist()」の部分で、Google Assistantでの音声認識、発話を処理し、会話継続が必要であれば、戻り値として返ってきます。

 SampleAssistantクラスの実装はWebサイトで公開されています。参考にすれば、Google Assistantとの会話をより細かくプログラミングできます。

# -*- coding: utf-8 -*-  

# --------- 省略 -------------   


# Google Assistantデバイスの初期設定 
def initialize(device_model_id=None,project_id=None,lang='ja-JP'): 
    # ログ設定 
    logging.basicConfig(level=logging.INFO)  

    # --------- 省略 ------------- 
                
    return device_model_id,device_id,conversation_stream,grpc_channel,device_handler   


def main(): 
    # 自身の情報に置き換える 
    device_model_id='{ your device model id }' 
    project_id='{ your project id }' 
    lang='ja-JP' 
    DEFAULT_GRPC_DEADLINE = 60 * 3 + 5  

    button = aiy.voicehat.get_button() 
    led = aiy.voicehat.get_led() 
    # 初期設定 
    device_model_id,device_id,conversation_stream,grpc_channel,device_handler = initialize(device_model_id,project_id,lang)  
    
    # pushtotalk.pyのSampleAssistantを使用する 
    with SampleAssistant(lang, device_model_id, device_id, 
                         conversation_stream, 
                         grpc_channel, DEFAULT_GRPC_DEADLINE, 
                         device_handler) as assistant:  

        continue_talk = False 
        while True: 
            led.set_state(aiy.voicehat.LED.OFF) 
            # 会話が前回からつながっているならボタン入力をスキップ 
            if not continue_talk: 
                print('\n*********************\n') 
                print('ボタンを押して話してください') 
                print('\n*********************\n') 
                button.wait_for_press()  
                
            led.set_state(aiy.voicehat.LED.ON) 
            continue_talk = assistant.assist()  
            
if __name__ == '__main__': 
    main()

■おわりに

 サンプルプログラム「assistant_japanese.py」で確認できたように、今回のバージョンアップによって記事では紹介していなかったgRPCを利用した開発でも、Voice Kit上でGoogle Homeの会話機能を取り入れられるようになりました。残念ながらホットワードはまだ英語版の「OK、Google」にしか対応していませんが、今後のアップデートで早急に日本語でのホットワードにも対応すると思われます。皆さんもGoogle Assistant SDKとVoice Kitを使ってカスタマイズ版のGoogle Homeを作ってみましょう。

 本ページは随時更新します。