※仮想環境について

仮想環境について

Raspberry PiにはOSを準備すると、デフォルトで2つのバージョンのPython(version2.7とversion3台)がインストールされています。よって、私たちが改めてインストールする必要はありません。ただし、開発する場合には、開発するプログラムによっていろいろなライブラリーを組み込んで開発する必要があります。このライブラリーの組み込み(インストール)で、ライブラリー同士が干渉しあってトラブルが発生して開発でつまずくことが多いことから、インストールしているライブラリを管理しやすいように、プログラム毎に個別の環境を用意し、各環境に必要なライブラリだけをインストールして開発を行うことによりライブラリの導入によるトラブルを減らすことが可能です。

この個別の環境として、仮想環境というものを開発プログラム毎に用意して、上記の個別の環境を実現することが可能です。

ただし、今回の開発ではRaspberry pi のGPIO制御を行うにあたってsudoでの実行が必須となっている箇所があります。よって、今回の開発では、プログラム管理用のフォルダは作成して管理するものの、ライブラリの管理はドキュメント上で管理することとし、仮想環境を利用しない方針とします。

しかし、仮想環境そのものは開発上有効なものであることから、仮想環境の構築の仕方について以下に説明します。

2)仮想環境作成の手順

①仮想環境を作成するためのツールはPython3.3以降標準で入っているvenvを利用します。(※インストールは不要です。)

➁プロジェクト管理用のフォルダーを作成

基本的にはどのようなフォルダー名でも構いませんが、今回は「home/pi」の直下に「Python3Venv」名前のフォルダーを作成します。「home/pi」直下とはpiというファルダの事です。

フォルダの作成はターミナルから行います。Terminalを起動しましょう。Terminalを起動すると下記の画面が立ち上がります。             Terminalで操作したいフォルダを指定する時はcdというコマンドを使ってファルダを移動する必要があります。ですが、Terminalは起動するとデフォルトでhome/pi直下にディレクトリ(ファイル)がありますので今回は移動する必要はありません。フォルダの作成はTerminalに下記を記述し作成する事ができます。

mkdir Python3Venv

➂個別プロジェクト用の仮想環境の作成

上記で作成したフォルダーに移動して下記のコマンドを実行して、個別プロジェクト用の仮想環境を作成します。今回はPython3(pythonのバージョンv3台)で開発開発します。「py3test」という環境を作成します。

cd Python3Venv                               ←フォルダー移動

python3 -m venv py3test           ←環境作成

※赤字の部分はpython3の環境を作成することを指しています。Python2の場合にはpython2と記載して作成します。

※少し実行に時間がかかります。

 

④作成した仮想環境の起動

作成した仮想環境を起動するには、作成した仮想環境のフォルダ「py3test」以下のコマンドを実行します。

cd py3test      ←フォルダー移動

source bin/activate ←仮想環境の起動

実行すると上記のような画面となります。

 

⑤簡単なPythonプログラムの実行

Pythonを起動します。

python ←Pythonの起動

下記のプログラムを実行します。

print(‘test’)

※Python v3.5.3が起動します。

※問題なく実行できます。

⑥仮想環境を終了する。

仮想環境を終了させるためには、Pythonを終了させて、下記のコマンドを実行します。Pythonの終了はCtrl+Zで終了します。

deactivate

※もとのフォルダーの状態に戻ります。

 

⑦仮想環境の効果

PCに新たなソフトをインストールする時、手順通りに行っているのにうまくいかない事はありませんか?その多くの原因は別のソフトとの相性が悪く衝突が起こることにあります。1度インストールしたソフトはPCに全体に影響を与える為、衝突の原因になっているソフトをアンインストールしないとうまくインストールできないのです。しかし、どのソフトと衝突しているのかを調べるのはとても難しく、インストールを諦めてしまう方もいるのではないでしょうか。

仮想環境は、例えばライブラリをインストールした場合には、その環境にのみ適用され、他の環境には影響を及ぼしません。

例えば、仮想環境でインストールの必要なライブラリをimportします。

import pyttsx3

インストールしていないのでエラーとなります。

一旦Pythonを終了させて、ライブラリをインストールします。

pip install pyttsx3

その後、再度Pythonを起動してimport します。

今度はインストールしてもエラーとなりません。

では、一旦仮想環境を終了させて通常の環境で同様にimportしてみます。

エラーとなります。これで、他の環境に影響を及ぼしていないことがわかります。

仮想環境の作成は以上です。

※仮想環境で、pythonを起動する場合には今回はpythonバージョン3台の環境作成しているので、コマンドとしては「python」のみでバージョンを意識する必要はありません。

通常の環境では、バージョン3のpythonを起動する場合には「python3」と実行する必要があります。

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

5.3.3.口をつくる

ロボットにお話しをさせるための口を作ります。

※お話をするプログラムはすでに「ロボットの頭脳を作る」で作成済みです。

口と言ってもロボットにとっての口はスピーカーになるのですが、市販のスピーカー程高機能である必要もなく、また、小さいものが使い勝手がいいことから、Raspberry Piで利用できるスピーカーを自作します。

ただし、本方式はpwm制御を行うサーボモータと制御がバッティングを起こすことから同時に利用することができません。よって、今回用意するものは今後利用するための準備として作成します。(今回のロボットのプロトタイプではUSB接続タイプのスピーカーを用意して利用することとします。)

1)用意するもの

・スピーカー  ダイナミックスピーカー 8Ω0.3W66mmΦ NA202C

アンプ TPA2006使用 超小型D級アンプキット

ジャンパー線(オス/メス5本、オス/オス2本)

ブレッドボード

2)作成手順

[配線]

①スピーカに電線とジャンパー線のオス/オスを半田付けします。

 

➁アンプにPinを半田付けします。また、下記のように背面の➂の部分を半田付けします。

➂アンプをブレッドボードに差し、配線図通りにジャンパー線を利用して配線します。

 

3)Raspberry Piの設定

①下記コマンドでGPIOのmodeを変更します。

sudo gpio -g mode 13 pwm

sudo gpio -g mode 18 pwm

また、「gpio readall」のコマンドで、設定状態を確認します。

Modeの部分がそれぞれ、ALT0,ALT5となっていれば設定完了です。

➁音がなることを確認します。

音声ファイル等で音が鳴るか確認してください。

➂起動時にGPIOのmodeが自動的に変更されるように設定します。下記のコマンドにて、設定ファイルを変更して、起動時に自動的に上記の設定変更が行われるようにします。

sudo nano /etc/rc.local

④Raspberry piを再起動し、GPIOの設定を確認(gpio readall)。音がなることが確認できれば完了です。

※USBスピーカーへ戻した時、カード番号とデバイス番号が変わっている事があります。デバイスを戻した時は、aplay -lで確認し、下記のプログラムで設定しているカード番号、デバイス番号を修正してください。

・TextToSpeech_Jtalk.py

・TextTospeech_eSpeak.py

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

5.2.7.8.プログラムの作成(BrainAction)

音をモニタリングする大枠のプログラム(NagoRobo_Main.py)の実際の機能部分のクラス(BrainAction.py)を作成します。

[BrainAction.py]

1)今までに作成した機能をImportします。また、利用するうえでの初期処理/終了処理及びAPIを利用するうえでのキー情報を格納するプロパティを定義します。

※RaspberryPi Zeroは、Googleのライブラリが使用できないのでコメントアウトしてあります。

2)最初のアクションを行う機能を作成します。

3)継続アクションを行う機能を作成します。

※作成できたら、NagoRobo_Main.pyを起動/実行して実際に動かしてみましょう。例えば、「青森県の天気は?」と聞いて、天気が返ってきたらOKです。

※あとは、いろいろな会話のシナリオを充実させたり、できる機能を増やすことで自然で高機能な頭脳になっていくことになります。今後、機能を充実させていく対応は別セッションにて実施します。

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

5.2.7.7.プログラムの作成(Main)

①フローに基づいてプログラムを作成します。

[フロー図]

まずは、プログラムの大枠となるプログラム(NagRobo_Main.py)を作成します。具体的な機能の処理部分についてはクラス(BrainAction.py)を作成し、大枠となるプログラムから呼び出す形で作成します。

1)基本的なパラメータの設定

2)音のモニタリング

3)ある一定以上の音量の音が発生したら録音する。

4)録音したファイルを元に処理を行う。

 →ただし、最初のアクションなのか、継続アクションなのかを判断して処理する。

1)~3)までが①の処理となり、この処理を継続的に行いながら、録音が発生した場合に②以降の処理を行うようにプログラムを作成します。

➁プログラムの作成[NagoRobo_Main.py]

 

※このプログラムだけでは動かないので、テストする場合にはBrainActionのクラスの部分をコメントアウトして、音声ファイルが作成させるのかを確認しましょう。

 

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

5.2.7.6.プログラムの処理フローの見直し

①各機能とDialogflowを整備したうえでの見直し

各機能を作成し、その機能を呼び出すためのDialogflowの設定が完了したので、その対応内容に応じで処理フローの見直しを行います。

ポイントとしては以下の通りです。

①処理が1回で完結するものと、完結しないものが存在するのでフローを分離

➁ロボットとしての動作として音声ではなく、動作につながるフローの追加

➂定型の問い合わせでないものは、一旦Dialogflowのレスポンスをそのまま返して特に処理としては何もしないように分岐を修正

 

 

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

5.2.7.5.Dialogflowの設定

①Dialgflowの利用用途について

ユーザーからの問いかけに対して正確に動作するためには、ユーザーからの問いかけのフレーズがどの動作をリクエストしているのかを正確に把握する必要があります。しかし、実際には同じ意図であっても微妙にフレーズは異なります。この微妙なずれをDialogflowで吸収し、正確動作可能とします。

今回、Dialogflowに設定するIntents、Entity等の詳細について下記の表をもとに設定していきます。

設定の手順としては以下の手順にて設定します。(※AgentはDialogflowの章で作成したものを利用します。)

1)Entityの設定     

 ボキャブラリの設定と考えましょう 

2)Intentの設定(その1) 

 リクエストのバリエーションを設定します。

3)Intentの設定(その2)

 リクエストのバリエーションで少し複雑なものを設定します。

1)Entityの設定

まず、2つのEntitiesを登録します。

Entities  内容
area  天気予報の場所を判断するキーワード(ex 青森県、岩手県等)
action_self  ロボットの動作に係るキーワード(ex 前進、右、左)

Entitiesの登録方法としてはメニューから「Entities」を選択し、右上の「CREATE ENTITY」ボタンをクリックします。

Entityの画面が起動したら、一番上にEntityの名前を入力し、中段のEntityのデータを入力する欄に順番にEntityのデータを入力していきます。

本来のデータを左の「Enter refernce value」の欄に入力し、「Enter synonym」にその内容に類似した内容(同様の内容で、異なる表現)を入力していきます。入力するデータとして5.2.7.3の天気情報の章で作成した地域のファイル(yahoo_arealist.txt)のデータの数だけ入力します。

保存する場合には右上の「SAVE」ボタンで保存してください。

同様な形で「action_self」についても「終了」「前進」「右」「左」「後退」をreference valueとして登録し、synonymも合わせて順番に登録しておきます。

 

2)Intentsの設定(その1)

次に、実際のユーザーからの問いかけのフレーズを登録します。登録するフレーズ(Intent)としては以下の通りです。

Intent action and parameters  内容
Action_News news  ニュースの問い合わせ
Action_Self action_self  ロボットの動作の命令
Action_Translate translate  翻訳の依頼
Action_Weather weather  天気予報の問い合わせ
Hello    「こんにちは」などの挨拶フレーズ(前回作成済)
Who?    「誰?」「名前は?」などのフレーズ(前回作成済)

※HelloとWho?はDialogflowの5.2.5.1の章にて行っています。

メニューから「Intents」を選択し、右上の「CREATE INTENT」をクリックします。

具体的なIntentの登録は、Entityと同様に上段に、Intentの名前を入力し、中段のデータ入力の欄に順番の「Training phrases」の欄に類似した問い合わせのフレーズ、「Action and parameters」の欄に問い合わせフレーズを識別するためのデータを入力します。Action_Newsはparametersの設定はありませんが、Actionの設定が必要です。Actionの値でプログラム上でどのプログラムを実行すればよいか判断します。

「Responses」の欄にそれぞれの返答フレーズを入力します。「Action_News」「Action_Translate」については挨拶の登録と同様に単純に入力してください。

   

 

3)Intentの設定(その2)

「Action_self」を登録します。

Intentの登録の際に一部のデータをパラメータ化します。

「Training Phrases」の欄に「終了です。」と入力します。登録されるとフレーズの「終了」の部分がハイライトされ、下段に設定されたパラメータが表示されます。これは、Entityとして登録したaction_selfのリストに「終了」という単語が登録されていることから自動的にフレーズの一部がパラメータ化されます。設定されたパラメータが複数ある場合には、複数表示されます。

パラメータの設定が不要な場合には、「×」ボタンをクリックして削除します。今回はそのままにします。このパラメータ化によって、本来であれば、動作のバリエーションとして「前進です。」「後退です。」「右です。」「左です。」のような指示内容は異なるのですが、ロボットの動作として同一のものをこの1つの登録で表現することができます。また、それぞれのEntityには類似語も登録されていることから実質的にはこの1つの登録で×「Entity」数×「類似語」数の登録を行ったことと同じとなります。これによりフレーズの登録の効率化を実現することが可能です。これに準じで「終了してください。」「終了。」等のフレーズを登録することで相当量のフレーズを効率よく登録できます。また、Actionの設定を行ってください。プログラム上でActionの値を確認し、どのプログラムを実行すればよいか識別します。

次に、パラメータを設定した際の「Responses」を設定します。基本的にはリクエストされたことを復唱するようなレスポンスが望ましいのですが、問いかけのフレーズにパラメータが入っていることから、レスポンスにもパラメータを含めておく必要があります。その際には「わかりました。$action_selfします。」と登録することにより、問いかけられたフレーズのパラメータを受けて返答することが可能です。

テストしてみます。

 

 

「Action_weather」についても同様に「area」(地域)をパラメータとして、Actionにweatherを設定します。「Responses」についても同様にパラメータを意識して「$areaの天気をお知らせします。」と登録してください。

 

「Action_weather」についてはこれに加えて、もう少し工夫をします。それは地域が指定されなかった場合に、Dialogflowが地域を聞きなおしてくれる機能も合わせて設定します。

フレーズの一部をパラメータとして設定すると「Action and parameters」の欄にそのパラメータの設定が反映されます。この欄で左側の「REQUIRED」のチェックボックスにチェックします。そうすると「PROMPTS」欄に「Define prompts・・・」と表示されます。

「Define prompts・・・」をクリックすると「Prompts for “area”」の画面が表示されるので、「PROMPTS」の欄に「どちらの天気がお知りになりたいですか?」と入力して「Close」ボタンをクリックします。

この後、「Traning Phrases」に、単に「天気は?」と入力します。このように地域の情報がない状態でリクエストされる場合も想定したフレーズを登録しておきます。この状態で、テストをしてみましょう。保存したあとに「天気は?」と問いかけしてください。

その後、地域情報として「青森県」と答えると

 

と返答してくれることになります。

 

※Intents、Entityの設定方法についての説明は以上となります。上段の表を参考にその他の問い合わせフレーズやエンティティのバリエーションをについて登録を行ってください。

必ず設定後は、想定したレスポンスが返ってくるかをコンソールで確認するようにしてください。

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

5.2.6.2.eSpeak(日本語以外/クライアントライブラリ)

①音声合成のライブラリーについて

音声合成のライブラリーはいろいろと提供されています。大きくはクライアントライブラリーとして提供されているもの、サーバーを利用したサービスとして利用されているものさまざまです。

クライアントのライブラリーだけでもいくつか代表的なものが提供されていますが、残念ながら日本語対応しているものは多くありません。日本語対応しているものとしては前回(5.2.6.1.)でご紹介したものが代表的なものとなります。一方、外国語についてはいくつか選択肢があります。今回はその中で「eSpeak」をご紹介し、英語の発声に対応します。

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

sudo apt-get install espeak

➂音声データのリストを確認して利用する音声データを確定します。

espeak –voices(ハイフンは2つです。)

今回は「english」を利用することにします。

 

④プログラムを作成します。[TextToSpeech_eSpeak.py]

※英語で「This is a pen.」と聞こえたらOKです。

 

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

5.2.7.5.プログラムの骨子を作成する(その1)

1)処理の骨子を整理して、プログラムのアウトラインの作成

①一定の音量の声を録音するプログラムの作成[NagoRobo_Main.py]

・この処理は、マイクから音を拾い、一定音量以上となったら5秒間録音するプログラムを作成します。5秒間録音したら、後続処理に進み、その後処理が完了したら、再度マイクから音を拾うという状態に戻るプログラムです。

・録音した音声データをもとにアクションするクラスの作成[BrainAction.py]

大きな処理の動きとして、常に音をモニタリングし、音声が録音できた場合にアクションします。このアクションの処理を集約したクラスを作成します。まずはとりあえず外枠だけ作成しておきます。

 

 

5.2.7.4.翻訳する

1)日本語から英語への翻訳機能を作成します。

Google Cloud Translation APIを利用して翻訳機能を作成します。様々な言語への翻訳が可能ですが、今回はとりあえず日本→英語の翻訳を用意します。

2)Google Cloud Translation APIを利用できるように設定します。

「5.2.4.1.Googleのライブラリ(Cloud Speech)の利用準備」で設定した方法と同様にライブラリーの有効化処理を行ってください。

 

2)必要なライブラリーをインストールします。

sudo pip3 install –upgrade google-cloud-translate

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

3)プログラムの作成 [Translate_Google.py]

Helloと表示されればOKです。

 

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