1)Docomoの音声認識APIを利用して、録音した音声を文字データに変換するプログラムを作成します。
①録音した音声データ「voice.wav」も合わせて用意します(前章で何か録音したデータをそのまま利用します。)。
②プログラムを記述します。[VoiceToText_docomo.py]

③赤枠の空欄には前章で申請したAPIキーを入力してください。
④プログラムを実行します。
sudo python3 VoiceToText_docomo.py

※文字化したデータが表示されます。
1)Docomoの音声認識APIを利用して、録音した音声を文字データに変換するプログラムを作成します。
①録音した音声データ「voice.wav」も合わせて用意します(前章で何か録音したデータをそのまま利用します。)。
②プログラムを記述します。[VoiceToText_docomo.py]

③赤枠の空欄には前章で申請したAPIキーを入力してください。
④プログラムを実行します。
sudo python3 VoiceToText_docomo.py

※文字化したデータが表示されます。
1)docomo Developer supportにて音声認識APIの申請を行う。
Docomoの音声認識APIの申請を行う手順を説明します。下記のURLへアクセスしてください。APIキーの申請をするにはまずは、アカウント登録が必要となります。
https://dev.smt.docomo.ne.jp/
[アカウント登録]







[APIキーの申請]
アカウント登録が完了するとAPIキーの申請ができるようになります。






以上で、APIキーの申請は完了しました。
①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.1.)でご紹介したものが代表的なものとなります。一方、外国語についてはいくつか選択肢があります。今回はその中で「eSpeak」をご紹介し、英語の発声に対応します。
➁ライブラリのインストール
sudo apt-get install espeak
➂音声データのリストを確認して利用する音声データを確定します。
espeak –voices(ハイフンは2つです。)
今回は「english」を利用することにします。

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

※英語で「This is a pen.」と聞こえたらOKです。
[処理フロー]

・クラスBrainActionの処理のアウトラインを作成する。
BrainActionは録音された音声データをインプットデータとして動きます。その後➁~⑩までの処理を行うことになります。
1)処理の骨子を整理して、プログラムのアウトラインの作成

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


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

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です。
1)天気の情報の取得
基本的にはニュースの取得と同様ですが、地域を指定して情報を取得できるようにします。
2)Yahooの天気の情報を取得します。
情報を取得する際にURLにエリアコードが必要となることから、エリアコードのリストを作成します。メモ帳にて以下のようにリストを作成します。
ファイル名 yahoo_arealist.txt

※保存の際に、「UTF-8」の形式で保存してください。
3)プログラムの作成[GetWeather.py]

・北海道の天気が取得できたらOKです。
1)ニュースの見出し
インターネットにはいろいろなニュースサイトがあります。そのいずれかのニュースサイトから、その時のニュースの見出しを取得する機能を作成します。
2)ライブラリーのインストール
sudo pip3 install feedparser
3)プログラムの作成[GetNews.py]

これを実行してNHKのニュースが表示されればOKです。
※今後、いろいろなデータ取得は検討します。
1)会話の処理イメージの整理
今までに部品として会話に必要な処理を整理してきました。ここでは、その部品をどのようにつなげることで会話的な処理になるのかを整理します。また、単純な雑談的な会話を実現することは少し難しいので、具体的に依頼した処理を実現するような機能も含めて整理します。
2)会話の処理のフロー
会話の処理のイメージは以下のような感じで進めます。

①~④、⑨、⑩についてはこれまでに作成してきた部品をもとにして対応します。⑥~⑧については新しい機能として処理を作成します。
※青の処理はローカルの処理。オレンジの処理はサーバー等にリクエストして処理を行っているものになります。
では、まず、⑥~⑧の機能を作成します。