Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add sample code of dialogflow #317

Merged
merged 12 commits into from
Dec 31, 2021
Merged

Conversation

k-okada
Copy link
Member

@k-okada k-okada commented Dec 27, 2021

@MiyabiTane @a-ichikura 以下のようなサンプルプログラムを作ってみました.
google speech や google NLPのキーを持っていれば,

catkin b dialogflow_task_executive
roslaunch dialogflow_task_executive demo.launch google_cloud_credentials_json:=${HOME}/Downloads/eternal-byte-236613-4bc6962824d1.json

でサンプルが動くと思います.出力が見づらいですが以下のような処理になっています.プログラムはsamples/client.l です.

で, @mqcmd196 @sktometometo に質問ですが,使い方,これであっているのかな?
https://dialogflow.cloud.google.com/?authuser=1#/editAgent/eternal-byte-236613/
のTutorialにサンプルのIntent を作って,色々皆の簡単な例を追加してくれると良いんですが,
@MiyabiTane が考えていることをイメージして https://dialogflow.cloud.google.com/?authuser=1#/agent/eternal-byte-236613/editIntent/6d3f1ed4-8056-41c4-8f6f-d642283a6b38/ をつくってみましたが,「上」「下」「右」「左」に飾って,という言葉から「上」「下」「右」「左」をEntity @direction として作りましたが,「ちょっと右に動かして」とかやると,「ちょっと」「だいぶ」「きもち」みたいなEntity 書いていくのかなぁ,とか思って,そういうもの(?)
となると,まずは自分の考えているドメインの文法をBNFで定義しよう,みたいなことになるのかな?とか思ったり...
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95

[ INFO] [1640606055.911258104]: wait for response ... 
[ INFO] [1640606056.911419304]: action     : lets
[ INFO] [1640606056.911641117]: query      : 一緒に映画見よう
[ INFO] [1640606056.911705989]: response   : 
[ INFO] [1640606056.911769226]: parameters : ((event . movie))
[ INFO] [1640606056.911826559]:     speech : 0.0
[ INFO] [1640606056.911892010]:     intent : 0.71403
[ INFO] [1640606056.912111144]: wait for response ... 
[ INFO] [1640606057.911105121]: wait for response ... 
[ INFO] [1640606058.911362294]: action     : 
[ INFO] [1640606058.911512026]: query      : 壁紙がきれいだったよ
[ INFO] [1640606058.911575280]: response   : 
[ INFO] [1640606058.911635973]: parameters : ((any . \u58c1\u7d19) (emotion . beautiful))
[ INFO] [1640606058.911783177]:     speech : 0.0
[ INFO] [1640606058.911894969]:     intent : 0.752
[ INFO] [1640606058.912230044]: wait for response ... 
[ INFO] [1640606059.911331389]: wait for response ... 
[ INFO] [1640606060.911407749]: action     : lets
[ INFO] [1640606060.911564621]: query      : 一緒に飾り付けしよう
[ INFO] [1640606060.911640843]: response   : 
[ INFO] [1640606060.911727896]: parameters : ((event . decorate))
[ INFO] [1640606060.911860643]:     speech : 0.0
[ INFO] [1640606060.911969613]:     intent : 1.0
[ INFO] [1640606060.912382082]: wait for response ... 
[ INFO] [1640606061.911261508]: wait for response ... 
[ INFO] [1640606062.911358447]: action     : 
[ INFO] [1640606062.911493392]: query      : 風船を右に置いて
[ INFO] [1640606062.911554499]: response   : 
[ INFO] [1640606062.911608430]: parameters : ((direction . right) (decoration . baloon))
[ INFO] [1640606062.911668930]:     speech : 0.0
[ INFO] [1640606062.911733155]:     intent : 0.675384
[ INFO] [1640606062.911810041]: cell* ROSEUS_EXIT(context*, int, cell**)
[ INFO] [1640606062.911858347]: exiting roseus 0

@mqcmd196
Copy link
Member

で, @mqcmd196 @sktometometo に質問ですが,使い方,これであっているのかな?
https://dialogflow.cloud.google.com/?authuser=1#/editAgent/eternal-byte-236613/

@k-okada リンクをクリックしてみたところ,IAM permission 'dialogflow.fulfillments.get' on 'projects/eternal-byte-236613' denied. と権限関連で見えないっぽいのですが,@mqcmd196 @a-ichikura @MiyabiTane @sktometometo のGoogleアカウントに閲覧(+ 編集)権限をいただけないでしょうか

@k-okada
Copy link
Member Author

k-okada commented Dec 27, 2021

以下みたいになっているはずだけど,この左側にBaxterからTutorial-old まで並んでいるけど,これ見えるのと見えないのがある?

Dialogflow - Google Chrome 2021_12_27 21_32_43

@mqcmd196
Copy link
Member

はい,自分のアカウントでは
Screenshot from 2021-12-27 21-43-52 となっていて,dialogflowアカウントでは
Screenshot from 2021-12-27 21-44-05
となっています.Fetch1075などのエージェント名のプルダウンボタンの右にある歯車みたいなアイコンをクリックして,Shareというタブに移動するとユーザを追加できるかと思います.

@mqcmd196
Copy link
Member

Screenshot from 2021-12-27 21-51-58
ですね

@k-okada
Copy link
Member Author

k-okada commented Dec 27, 2021 via email

@knorth55
Copy link
Member

FYI:
I made a useful PR to load credential JSON from yaml file, and project_id can be set from credential JSON.
#313

@mqcmd196
Copy link
Member

@k-okada 同じエラーで見えてないです... Fetch1075のページに飛んでからプルダウンを開いてみましたが,そこにも岡田先生が作ったと思われるエージェントはありませんでした.

@mqcmd196
Copy link
Member

73B2だと[email protected]....アカウントを共用利用することになっているので,そちらを追加するのはどうでしょうか

@k-okada
Copy link
Member Author

k-okada commented Dec 28, 2021 via email

@mqcmd196
Copy link
Member

mqcmd196 commented Dec 28, 2021

見えました,ありがとうございます.確認しましたが使い方はこれで大丈夫だと思います.@a-ichikura @MiyabiTane が使うときはもう少し馴れ馴れしいロボットになる?と思われるので,Intents の Default Fallback Intentの Responsesをフランクな表現にしたほうがいいかもしれない?

@k-okada
Copy link
Member Author

k-okada commented Dec 28, 2021

Responsesをフランクな表現

なるほど,そうしておいてください.

で,実際にどういう場面で使い物になるか,という話だけど,あらかじめ許容内容がかなり決められると,曖昧性を許容して理解してくれそうだけど,少し,自由度を持たそうとすると結構大変じゃないかなと思ったんだけど正しいだろうか?
たとえば今 fetch/spot で理解している文法をbnf とかで書き出せたりするのかな.

@MiyabiTane
Copy link
Contributor

MiyabiTane commented Dec 29, 2021

@k-okada デモ作成ありがとうございます。BNF記法勉強してDecorateのインテントを変更しようと思います。

初歩的質問で申し訳ないのですが、dialogflowの仕組みとして、文章が入力されると、まずどのインテントがふさわしいかを選び(帰り値:action、その確信度intent_score)、そのインテントに登録されたEntityに基づいた判定を行い、その結果を返しているという理解で正しかったでしょうか?

だとすると@a-ichikuraが使いたいintentと私が使いたいintentは一緒にしてしまった方がエージェントの応答が確実にされる(分けてしまうとインテントの割り振り時点で失敗する可能性がある)と思ったのですが、どうでしょうか?
すみません、判定に用いているのはentitiiesなので分けて良い気がしてきました。

@MiyabiTane
Copy link
Contributor

@k-okada いくつかの会話例を考えて、それをカバーするようなBNFを作ってみました。
https://gist.github.com/MiyabiTane/e5af75f9d8b29afed7c1b553eb912f33

また、dialogflowのDecorateインテントを更新しました。

@k-okada
Copy link
Member Author

k-okada commented Dec 29, 2021 via email

@MiyabiTane
Copy link
Contributor

intentが機能にあたるという理解ができました、ありがとうございます。
飾り付け用にエージェントを作成して使おうと思います。

こだわりポイントができたらそこに辞書を使うことも考えてみようと思います、ありがとうございます。
https://cloud.google.com/dialogflow/es/docs/entities-export

@k-okada k-okada merged commit 5738b8f into jsk-ros-pkg:master Dec 31, 2021
@k-okada k-okada deleted the sample_dialogflow branch December 31, 2021 05:54
@Affonso-Gui
Copy link
Member

@MiyabiTane @k-okada
昨日岡田先生とDialogFlow上で可変長のentityの扱いがもっと解析的な手法(decision tree等)とどう違うのかを検討していました。

結論から言えばDialogFlowが思った以上に柔軟で、それでも問題なく扱えると思います。

例えば上げている例で

<clear_object> ::= <attribute><object>
<attribute> ::= <color> + の | <shape> | <mood>

を追加して、

decorate_bot

のような遷移図を想定した時に、clear_object と clear_direction を requiredにして、例えばdirectionのpromptを以下のように設定して置くとできます。(<amb_direction> があれば1、なければ2が返ってきます)

amb_direction

Attributeに関しては実際の場面だとオブジェクト依存になるから、そこは Session Entity を使えばできる気がします https://cloud.google.com/dialogflow/es/docs/entities-session

@k-okada
Copy link
Member Author

k-okada commented Jan 7, 2022

@Affonso-Gui このツリーの絵はどうやって作ったのかな?
あと,僕もクリアにわかっていないけど会話って,雑談ん・おしゃべり的なところから,目的志向のものまでバリエーションがあって,このdialogflow + prompt で,答えを得るようなタイプは結構目的志向かな.とおもいました.
で研究室でロボットに会話させようと思っている人は考えてみると結構いて
@a-ichikura
@MiyabiTane
@Kanazawanaoaki
@tkmtnt7000
@sktometometo
みたいに雑談→目的 な重みになっているのかなともいました.

で,僕の提案は,会話にまつわる記述方法を以下のようにクリアに定義できるようにしてからプログラム化することで,論文・発表の図・説明に役に立つし,その記述でできるのは何で,出来ないのは何だから,自分はこう変えました,という説明につながるかな,と思っています.
https://gist.github.com/MiyabiTane/e5af75f9d8b29afed7c1b553eb912f33
https://user-images.githubusercontent.com/20625381/148481451-752ebf97-56a4-430d-98af-d5dfcb5d4873.png

で,雑談的なものだと,もう少しリアクティブ・ランダムな反応の記述が必要でbehaviortree とか使えないのかな?と思った次第です > @Affonso-Gui

@Affonso-Gui
Copy link
Member

@k-okada このツリーは考えただけでlibreofficeで簡単に描いているだけですが、prologで実装しようとすればこの感じなんでしょうか。

object(baloon).
object(flag).
object(flowers).
color(red).
color(white).
color(black).
clear_direction(up).
clear_direction(down).
clear_direction(right).
clear_direction(left).
amb_direction(here).
amb_direction(there).
suggestion(maybe).
suggestion(perhaps).
clear_object(X,Y) :- color(X), object(Y).

ask_object('What object?').
ask_which('Which one?').
ask_place('Where do you want to move it?').
ask_specs('Could you be more specific?').
answer_ok('Sure!').
answer_agree('I agree!').

chat(X) :- ask_object(X).
chat(X,Y) :- object(Y), ask_which(X).
chat(X,Y,Z) :- clear_object(Y,Z), ask_place(X).
chat(X,Y,Z,A) :- clear_object(Y,Z), amb_direction(A), ask_specs(X).
chat(X,Y,Z,A) :- clear_object(Y,Z), clear_direction(A), answer_ok(X).
chat(X,Y,Z,A,B) :- clear_object(Y,Z), clear_direction(A), suggestion(B),
                   answer_agree(X).

実行例:

?- chat(X).
X = 'What object?'.

?- chat(X,red,flag,here).
X = 'Could you be more specific?' .

?- chat(X,red,flag,right,maybe).
X = 'I agree!'.

@Affonso-Gui
Copy link
Member

確かにdialogflowは根本的に目的思考なので、もっとhuman-likeなbotを作成するならdialogflowをtask executiveとしたもっと大きな構造を定義しても良いと思います。で、その時にチャットだけでなく、よりmulti-modalな情報、環境の変化や割り込みイベントを考慮したい場合にはbehavior tree のreactivityが役に立つと思います。ランダム/確率的手法はデフォでは behavior treeに含まれていないが、いくつかのextensionでそれがカバーされています (chap 4. in https://arxiv.org/pdf/1709.00084.pdf )。

例えばバッテリーが低ければチャージ、人を発見したら挨拶、話しかけられたら応答、暇だったら見回り、みたいなエージェントをこういう風に書けたりします。因みにこれはgroot(https://github.com/BehaviorTree/Groot )でかいていて、最近roseus対応もしています jsk-ros-pkg/jsk_roseus#681

chatbot_ex
chatsequence

ファイル: https://gist.github.com/Affonso-Gui/ca139af8ccafbce960e314ffa2f41cbd

Comment on lines +4 to +10
if($ENV{ROS_DISTRO} STREQUAL "indigo")
message(WARNING "following requirements.txt syntax is not support on 14.04")
message(WARNING "google-api-core[grpc]==1.31.5 # via google-cloud-language")
find_package(catkin)
catkin_package()
return()
endif()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@k-okada Because of these lines, PR2 cannot run dialogflow_task_executive...
PR2 is still Indigo...

@knorth55
Copy link
Member

This PR drops Indigo dependencies....

@MiyabiTane
Copy link
Contributor

@k-okada
FacialExpressionという新しいエージェントを作成してみたのですが、Tutorialエージェントの
eternal-byte-236613-4bc6962824d1.jsonに相当するファイルはどこからダウンロードできますでしょうか?(project_idのみを変更してもTutorialエージェントが呼ばれてしまいます)

作成したエージェントはこちらです↓
https://dialogflow.cloud.google.com/?authuser=1#/agent/facialexpression-rpwe/intents
よろしくお願い致します

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

@MiyabiTane 対応するので僕にそのプロジェクトの権限をください

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

あとdialogflowアカウントにも権限を付与してください

@MiyabiTane
Copy link
Contributor

@mqcmd196
ご対応ありがとうございます!!
岡田先生にも権限を付与しておきました
以下のように設定したのですが、見えていますでしょうか??

Screenshot from 2022-06-05 14-18-10

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

@MiyabiTane
Copy link
Contributor

MiyabiTane commented Jun 5, 2022

@mqcmd196
私側の問題かもしれないので今調べていますが、エラーになってしまいました

[ERROR] [1654407928.494665]: 403 IAM permission 'dialogflow.sessions.detectIntent' on 'projects/facialexpression-rpwe/agent' denied.

@MiyabiTane
Copy link
Contributor

project_idも正しく指定してみましたがダメそうでした
以下実行コマンドです

$ roslaunch dialogflow_task_executive demo.launch google_cloud_credentials_json:=/home/tork/ros/json/facialexpression-rpwe-a770ca404204.json project_id:=facialexpression-rpwe

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

@MiyabiTane
もしかしたら僕が作り方間違えてたかも,
https://drive.google.com/file/d/15nlmkkxdRp5PoWNq1TV4bGpNJ9vMgBst/view?usp=sharing を使ってみてください

@MiyabiTane
Copy link
Contributor

@mqcmd196
ファイルがゴミ箱にあります、と出てきて、もう一度リンクを確認して頂けますでしょうか...??

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

@MiyabiTane
Copy link
Contributor

@mqcmd196
ごめんドライブの中自分で探せばよかったんやな
新しい方のjsonも同じエラーです、何度もすみません...

@mqcmd196
Copy link
Member

mqcmd196 commented Jun 5, 2022

@MiyabiTane
何度もごめん,こっちをつかってください
https://drive.google.com/file/d/1NFO6SFLls1CN3fH5byAIk1W5ntGoHhyE/view?usp=sharing

@MiyabiTane
Copy link
Contributor

@mqcmd196 行けました!ありがとうございます!!

@MiyabiTane
Copy link
Contributor

@a-ichikura @kochigami
テキスト▷表情生成モデル(dialogflowリンク)です。もしよろしければ使ってみて下さい!

  1. jsonファイルをダウンロード▷https://drive.google.com/file/d/1NFO6SFLls1CN3fH5byAIk1W5ntGoHhyE/view?usp=sharing
  2. 以下コマンド実行
catkin b dialogflow_task_executive
roslaunch dialogflow_task_executive demo.launch google_cloud_credentials_json:=${HOME}/Downloads/facialexpression-rpwe-01533d0109c5.json project_id:=facialexpression-rpwe

action: 分類結果, intent_score: 確か度

Happy😀▷'yorokobi': ['嬉しい']
Relieved😌▷'yasu': ['安心']
Astonished😲▷'odoroki': ['びっくり']
Cry😭▷'aware': ['悲しい']
Angry😠▷'ikari': ['怒る']
Flushed😳▷'haji': ['恥ずかしい']
Fearful😱▷'kowa': ['怖い']
Love😍▷'suki': ['好き']
unpleasant😓▷'iya': ['嫌い']
Smirking😏▷感情対応なし
Squinting😝▷感情対応なし
Boring😪▷感情対応なし

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants