5.4.14.URL・地図画像・ストリートビュー画像を取得する機能の追加

GoogleのAPIを利用し、指定した場所や住所のGoogleMap(地図)の画像とURLを取得する機能を作成します。

1)GoogleのAPIを有効にしてキーを作成する。

下記の3件のAPIを有効にします。(マップのカテゴリーをすべて表示して探してください。)

・Geocoding API

・Maps Static API

・Street View  Static API

APIの有効化の方法は、「5.2.4.3.Googleのライブラリ(Cloud Speech)の利用準備」を参考にしてください。

認証情報から「APIキー」を作成してください。ここで作成/利用するキーは、参考としている「5.2.4.3.Googleのライブラリ(Cloud Speech)の利用準備」で作成したサービスアカウントキーとは種類が異なるので注意してください。

APIとサービスの認証情報から認証情報を作成、APIキーをクリックで作成できます。

作成したAPIキーは、APIキーの項目の下記の赤枠の部分に表示されます。

 

2)プログラムを作成する

[get_map.py]

①地図の基本的な情報(緯度/経度等の情報)を取得するプログラム

今回作成した「GoogleのAPIキー」と「住所または建物/場所の名称」から地図の基本的な情報を取得する関数を作成します。

②地図のURLを取得するプログラム

「①で作成したget_mapinfo」を利用して基本的な情報を取得。その情報から取得できる「緯度/経度」及び「place_id(場所に割り当てられた番号)」をもとに、対象の地図のURLを取得する関数を作成します。

③地図画像を取得するプログラム

「①で作成したget_mapinfo」を利用して基本的な情報を取得。その情報から取得できる「緯度/経度」をもとに地図画像を取得する関数を作成します。

④地図の場所のストリートビュー画像を取得するプログラム

「①で作成したget_mapinfo」を利用して基本的な情報を取得。その情報から取得できる「緯度/経度」をもとに、対象の地図のストリートビュー画像を取得する関数を作成します。

⑤テストする。

URL/地図画像/ストリートビューの画像取得の機能をテストするためのプログラムです。googleのAPIキー、アドレスが不正な場合にエラーとならないように、エラー処理を入れてあります。
 

getmap.pyを実行し、URLが表示され、地図画像とストリートビュー画像ファイルが作成されていたらOKです。  

5.4.13.サーボモーターとスピーカーの競合の解消

サーボモーターはpwmという信号を利用して動いています。
現在は、モノラルのスピーカーをD級アンプを利用して直接Raspberry pi に接続し、このpwmという信号を利用しています。しかし、サーボモーターとスピーカーを同時に利用すると競合が発生し動作不具合が発生するようです。このため、今回はサーボモーターの競合を解消するために、別回路(部品)を利用して動かします。また、このことにより、Raspberry piのpwm信号のピン数が限定的であったことから、サーボモータの接続にも限界がありましたが、この数の制限の解消も目的としています。

今回は、PCA9685というサーボモータードライバを利用します。

 

1)Raspberry Pi、PCA9685の配線

ジャンパー線を下図の通りに接続します。

[Raspberry Pi側]

[PCA9685側]

電池(単三電池4本が入った電池ケース)を画像のように接続します。

GND側➡マイナス(黒)  V+側➡プラス(赤)

 

2)ライブラリのインストール

sudo pip3 install adafruit-pca9685

 

3)プログラムの作成と修正

新しく「servo_new.py」を作成し、「BrainAction.py」を修正します。

[servo_new.py]

 

[BrainAction.py]

NagoRobo_Main.pyを実行し、サーボモーターの稼働とスピーカーの正常稼働確認ができれば完成です。

 

5.4.12.アラーム機能の追加

アラーム機能を作成します。

時刻を設定すると、直近の設定した時刻になると「時間です。」とお知らせする機能です。

今後は、時間になると音楽を再生したり、録音した音声ファイルを再生したりとアラーム機能を充実させていきますが、まずは、基本的な時間になるとお知らせしてくれる機能を作成します。

プログラムの流れとしては、下記のフローチャートの通りです。(flgチェックの分岐でalarm以外の分岐は省いています。)

1)Dialogflowの設定

下記の表に従ってIntentesとEntitiesを作成してください。

2)修正および作成するプログラム以下の通りです。

①[BrainAction.py](既存)

②[NagoRobo_Main.py](既存)

③[TextToDate.py](新規)

④[Alarm.py](新規)

⑤[AlarmList.json](新規)

3)TextToDate.pyについて

アラームのセットは音声で行います。処理ステップとして音声はテキスト化されます。想定している音声の時刻は「12時15分」といった形式となります。プログラムでは、アラームの時刻を日付型で取り扱いますが、「12時15分」という形式のデータを日付型のデータに直接変換する関数がpythonでは用意されていません。そのため、この形式のデータを日付型へ変換する為のプログラムを用意しています。

例:12時15分

      ⇩ 変換

  12:15:00               ⇦ 日付型データ

TextToDate.py

※TextToDate.pyはフローチャートの黄緑のボックスの処理になります。

4)AlarmList.jsonについて

設定された時刻データは「AlarmList.json」にjson形式にて登録していきます。

AlarmList.json

4)Alarm.pyについて

Alarm.pyはアラーム機能の核となるプログラムです。

「アラームセット」、「指定した時間のアラームデータの削除」、「指定したシーケンスNOのアラームデータの削除」、「指定した時刻のアラームデータのシーケンス番号の配列を返す」、「アラームチェック」の5つの関数を作成しています。

 

Alarm.pyはフローチャートのピンクのボックスの処理になります。

 

※「アラームセット」と発声し、アラームを設定した時間に「時間です。」とロボット発声したら成功です。

前の投稿/次の投稿/メニューページへ戻る

5.4.10.音声認識機能の差し替え(docomoからGoogleへ)

現在、声を文字変換する音声認識機能は、docomoの音声認識APIを利用しています。これをGoogleの音声認識APIの利用にプログラムを修正します。

1)VoiceToText_Google.pyを修正します。

声を文字化できなかった場合にエラーが起こらない様に処理を分岐するように「VoiceToText_Google.py」を修正します。

[VoiceToText_Google.py]

 

2)BrainAction.pyを修正する。

[BrainAction.py]

 

3)NagoRobo_Main.pyを修正します。

[NagoRobo_Main.py]

NagoRobo_Main.pyのプログラムを実行し、文字化したデータとその確度が表示されたらOKです。

 

前の投稿/次の投稿/メニューページへ戻る

5.4.11.NagoRobo_Main.pyを自動起動する

Raspberry piを起動した際にロボットのプログラム自動的に起動することができると便利なので、その設定を行います。

手順としては

1)ロボットのプログラム(NagoRobo_Main.py)がどのフォルダからでも起動できるように、プログラム内部でフォルダを参照してデータを取得している部分を、動的にファイルの場所を取得できるように修正します。

2)自動起動の設定を行う。設定内容としては、ターミナルを起動しNagoRobo_Main.pyをパス付で実行する。

では、順番に対応します。

1)プログラム内部のフォルダ内にあるファイルのパスを動的に取得するように変更。

変更対象のファイルは下記の4つです。

keylist.json

phraselist.json

yahoo_arealist.txt

RobotNago-〇〇〇〇.json(googlekeyファイル)

[NagoRobo_Main.py]を修正します。

# ★と記載されている部分を追加/修正します。

[NagoRobo_Main.py]

keylist.jsonとRobotNago-〇○○○.jsonをパスを指定して参照するように修正します。

[GetWeather.py]

yahoo_arealist.txtをパスを指定して参照するように修正します。

[news_rp_speak.py]

phraselist.jsonをパスを指定して参照するように修正します。

2)自動起動用の設定を行います。

①cd ~/.config/lxsession/LXDE-piで、フォルダーを移動します。

④「sudo nano autostart」でファイルを開きます。

⑤「autostart」ファイルの中に下記を追記して保存します。

@lxterminal -e sudo python3 /home/pi/Python3/NagoRobo_Main.py

再起動し、自動でターミナルが起動され、NagoRobo_Main.pyが実行できていたらOKです。

前の投稿/次の投稿/メニューページへ戻る

 

5.4.8.1.会話をGoogle SpreadSheetへ記録する

Google Cloud PlatformのAPIを使ってロボットとの会話をGoogleのSpreadSheetへ記録するプログラムを作成します。

1)APIの有効化

まずは、Google Cloud PlatformのAPIを有効化しましょう。今回のプログラムには2つのAPIを使います。下記の2点を有効化してください。

 ・Google Drive API

・Google Sheets API

2)Google SpreadSheetを作成する

Google SpreadSheetを作成してください。

まずは適当な名前を付けてください。今回は「RegConversation」とします。

3)作成したSpreadSheetをAPIを使ってプログラムから操作できるように共有化する

「共有」クリックし、「他のユーザーと共有」の画面を起動してください。

 

次にサービスキーのclient_emailのアドレスを入力してください。共有先として追加してください。サービスキーのclient_emailはjsonデータを展開すると記載されています。

先ほど作成したSpreadSheetを開き、下記の通りに項目を入力してください。Sheet名「InformationSheet」です。また、図と同じセルにLatestSheetとLatestRowを入力し、値を初期値は0としておきます。

LatestSheet:Sheet数を管理します。現在のSheetの枚数を記録していきます。(InformationSheetは枚数に含まれません)

LatestRow:行数を管理します。行数はSheetごとに管理するのではなく全てのSheetを通して行数を数えます。

 

4)SpreadSheetに会話データを追加するプログラムの仕様

会話のデータを追加するプログラムを作成します。プログラムの簡単な仕様としては

①InformationSheetのLatestSheetの値を確認し、数が0枚なら「data1」というSheetを追加。(Sheetの追加と同時に5列1行のセルを追加しカラム名を入力する。)

②LatestRowの値が前回のSheetの追加から1000行増えていると新たにSheetを追加して記録をする

③次に発話された内容のテキストをカラムの項目ごとに記録する(ユーザー/ロボットともに)

※Sheet名は「data2」、「data3」・・・と追加

 

5)ライブラリをインストール

sudo pip3 install gspread

sudo pip3 install oauth2client

6)プログラムの作成

[TalkToRecord_Google.py]

プログラム上のS_sheetにURLに含まれているIDを入力します。URL上に表示されています。

赤線部分の「d/」から「/」の間がIDです。

合わせてGoogleサービスキーも入力します。これでプログラムが完成しました。

実行し、作成したSpreadSheetに会話の内容が記録できれば完成です。

前の投稿/次の投稿/メニューページへ戻る

5.4.9.Google Cloud Text-To-Speechを試してみる

テキストを読み上げる機能は、5.2.6.1.から5.2.6.3.までに作成していますが、ここでは新しくリリースされているGoogleのAPIを利用してテキストの読み上げを行えるようにします。

1)ライブラリをインストールします。

sudo pip3 install –upgrade google-cloud-texttospeech

2)プログラムを作成します。

[TextToSpeech_Google.py]

プログラムを実行し、「こんにちは」と女性の声で聞こえたらOKです。

※再生されない場合は、カード番号を変更して試してみてください。

前の投稿/次の投稿/メニューページへ戻る

5.4.8.2.TalkToRecord_Google.pyをBrainAction.pyへ組み込む

前回、作成したTalkToRecord_Google.pyをBrainAction.pyへ組み込み会話の記録ができるようにしていきます。また、Google SpreadSheetのIDをKeylist.jsonへ追加し、NagoRobo_Main.py起動時に取得する形にするので、NagoRobo_Main.pyの修正も行います。

1)Keylist.jsonにGoogle SpreadSheetのIDを追加する

2)NagoRobo_Main.pyを修正する

3)BrainAction.pyへ組み込む

上記の手順で進めていきます。

1)Keylist.jsonにGoogle SpreadSheetのIDを追加する

下記の図の通り、Keylist.jsonに前回の章で確認したURLに含まれているIDを追加してくさだい。

2)NagoRobo_Main.pyを修正する

[NagoRobo_Main.py]

インスタンスの生成の所で下記の図の赤線部分を追記してください。

 

3)BrainAction.pyへ組み込む

BrainAction.pyへ組み込む準備ができましたので、TalkToRecord_Google.pyのプログラムを組み込んでいきます。

[BrainAction.py]

赤文字の追加部分を記載してください。Google SpreadSheetへアクセスする為のURLに含まれているIDを引き渡す処理をします。

プログラムの#—追加—#のとコメントされている個所にTalkToRecord_Google.pyの関数を呼び出す処理を追加記載しています。ユーザー、AIの発話毎に関数を呼び出しています。

これでBrainAction.pyへの組み込みが完了しました。NagoRobo_Main.pyを実行し、会話の記録ができるか確認してください。

前の投稿/次の投稿/メニューページへ戻る

5.3.1.2.写真を撮ってその情報を発話するプログラム

今回は、写真を撮ってその情報を発話するプログラムを作成します。

このプログラムを作成する為に写真情報を取得するプログラムを作成していきます。Google Cloud PlatformにてVisionのAPIを有効化してください。

また、写真情報は英語で取得されるので、以前作成したTranslate_Google.pyのプログラムを和訳もできるように修正していきます。

[写真情報を取得機能作成(VisionToText_Google.py)]

ライブラリのインストール

sudo pip3 install –upgrade google-cloud-vision

※upgradeの前のハイフンは2つです。

sudo pip3 install oauth2client

ライブラリのインストールが終了したらプログラムを作成していきます。

[VisionToText_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

下記のコマンドでプログラムを実行してください。

sudo python3 VisionToText_Google.py

写真情報のレスポンスが返ってきたら成功です。

[翻訳機能の修正(Translate_Google.py)]

現在は、Translate_Google.pyは英訳しかできませんが、和訳もできるように言語を引数としてセットし、多言語翻訳ができるようにしていきます。

ライブラリのインストールは「5.2.7.4.翻訳する(Google)」の章でインストール済みです。

では、プログラムを修正していきます。

[Translate_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

引数に「ja」をセットし、「This is a pen」を和訳してみます。実行コマンドは下記の通りです。

sudo python3 Translate_Google.py

[プログラムを組み合わせて、写真を撮ってその情報を発話するプログラムの作成]

写真情報取得のプログラムの作成と翻訳のプログラムの修正が完了したので、プログラムを組み合わせて、写真を撮ってその情報を発話するプログラムを作成していきます。

※写真を撮るプログラムは「5.3.1.1.写真を撮る機能の作成」の章で作った「takeapicture.py」のプログラムを使います。

[AnalysisImageToSpeech_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

では、プログラムを実行してみましょう。下記のコマンドで実行できます。

sudo python3 AnalysisImageToSpeech_Google.py

レスポンスが返ってきたら成功です。

前の投稿/次の投稿/メニューページへ戻る

5.4.7.各種API利用時のキー情報をファイルで管理する

各種API機能を利用するためには、セキュリティ確保のためにキー情報の取得とプログラムでの利用が必要となっています。現在は、このキー情報をプログラムの中に直接記述していることから、プログラムのメンテナンス性やセキュリティの観点から課題となっています。

今回、このキー情報を効率的に管理し、且つ将来的にセキュリティの向上を容易にするために、キー情報を管理するキーリスト(json形式)を作成し、プログラム起動時にキーリストを読み込んでキー情報を取得するようにプログラムを修正します。これによりキー情報の管理を効率化する事ができます。

今回管理するキー情報としては

・Google サービスキー

・DialogFolw Client Access Token

・docomo APIキー及びappId

となります。

キー情報をファイルで管理する為に以下の手順で修正を行います。

1)GConversation_docomo.pyの修正

2)QA_docomo.pyの修正

3)keylist.json(json形式)の作成

4)NagoRobo_Main.pyの修正

5)BrainAction.pyの修正

 

1)GConversation_docomo.pyの修正

GConversation_docomo.pyの修正を行います。今まではappIdをプログラムに直接記載してましたが、appIdを引数にセットし実行するように修正します。

[GConversation_docomo.py]

2)QA_docomo.pyの修正

QA_docomo.pyのプログラムもGConversation_docomo.pyと同様にappIdを引数としてセットするように修正します。

[QA_docomo.py]

3)keylist.jsonの作成(json形式)

[keylist.json]

コメントをGoogle サービスキー、DialogFolw Client Access Token、docomo APIキーに書き替えてください。

また、keylist.jsonはプログラムが配置されているフォルダへ保管してください。

4)NagoRobo_Main.pyの修正

[NagoRobo_Main.py]

赤い下線のライブラリのインポート処理を追記します。

「ここから–ここまで」の処理を修正する

これでNagoRobo_Main.pyを実行するとkeylist.jsonを確認し、キーをkeylist.jsonから取得するようになります。また、keylist.jsonに「Id_docomo」というキーネームがなければGetMyappId.pyの関数を呼び出し、appIdを自動取得します。1度、appIdを取得すれば次回の起動時にはGetMyappId.pyの呼び出しは行いません。

5)BrainAction.pyの修正

BrainAction.pyはGConversation_docomo.pyとQA_docomo.pyの関数の呼び出し時に引数にappIdをセットするように修正を行います。

プロパティの処理の「ここから₋₋ここまで」の部分を追記します。appIdをNagoRobo_Main.pyから受けとる処理です。

[BrainAction.py]

赤い下線部分に第三引数としてappIdを追記します。

先ほど同様にQA_docomo.pyの関数の呼び出しの際にも赤い下線部分に第三引数としてappIdをセットします。

 

これですべてのプログラムの修正が完了しました。NagoRobo_Main.pyを実行し、問題なく動けば完成です。

※docomoのappIdを取得するプログラムGetMyappId.pyについては「5.4.1.自然対話:雑談機能の追加」をご参照ください。

前の投稿/次の投稿/メニューページへ戻る