日本語音声 English voice無声 (no audio)


handcrafting

音声ロボット 会話 工房

中級教室

Give us a moment. 設定中 初回10数秒かかる場合があります。
dialogue AI

Performが次の会話へつなぎ、知的で結末のある会話を作り出す。

dialogue AIdialogue AI 人の会話はつながっている、ロボット会話でどう繋ぐのか。 日常会話は前後の会話が繋がっており、前の会話を踏まえて話されるのが、知能的な会話。これを文脈に基づく会話、専門用語はコンテクト会話、と呼びます。これができないと、酒に酔ったろれつの回らない人との会話に。

中級教室では、初級で紹介した二つの会話保管庫を引き続き使い、つながった表現をする方法を学びます。

中級教室

ステップ4 文脈会話とPerform


文脈会話を言い換えると、次に話す内容が繋がっており、制限を受けている事です。つまり、工房では、人の選べる会話内容を絞る事に他ならない。その制限された会話を、Performと呼ばれる命令で、proc_storeから呼び込みます。
形式
["人",["ロボ会話","Perform : proc 名"]],
ロボ会話は後続(文脈)会話と[]で結合されている。ロボ会話は複数個でもよい

次のルパンとの会話を例にとり、Performを学びます。
例 4 

["可愛い子ちゃん見っけ!","どこ、どこ?","私のこと?","有難う、いつも言われるの"],


["Tell me your name. あなたの名前を教せて。",["You tell me yours first. 最初に貴方の名前を教えて","Perform:Lupin Talk1"]],

(作動はステップ5の「Lupin Talk1」の登録を待って)

["I'm Lupin. How may I call you? ルパンです。貴女は何と呼べばいい?","Hi. Lupin. Nice to meet you. Call me Alice. やー、ルパンさん、お会いできましたね。アリスと呼んで","SVC2: /put/ data_acquire(name, Lupin)"],


["Proc: Story of fox and my father"],



 ルパンの2番目の会話、「名前を教せて」に、アリスが「"You tell me yours first.最初に貴方の名前を教えて"」の返事と共に、Perform命令で「Lupin Talk1」と命名された(Proc名)つなぎの会話を準備させています。アリスの返答後、このProc名から会話が取り込まれます。
このPerform 命令は左[(かっこ)と右](かっこ)で、「"You tell me yours first.最初に貴方の名前を教えて"」の返答に結び付けられています、すなわち、左かっこと右かっこで閉じられています。
flow_controlに追加をしてください、しかし、「作動」はまずproc_storeに「Proc: Lupin Talk1」を追加、その後にします
"SVC2: /put/ data_acquire(name, Lupin)"はシステム命令で、「name」と呼ぶ識別符号(キー)で、「Lupin」の名前を記憶。 Procの 「Story of fox and my father」は既にロボットに登録されているので、取り込みだけしてください。

註 「書き込み」ボタンは下の会話の流れ作業窓に、手入力作業を省いて、設定(挿入)します。独自の文を記入する時は、入力例を参考にしてください。1個づつ、又は複数個同時に記入してもよい。
1会話文は配列の1行に指定、一番の要素が人の会話文、人がクリックできる会話文、要素2以降はロボットが戻す返答文になります。返答が複数個指定されると、ロボットが無作為に一つ選びます。
["要素1","要素2","要素3"],
約束事 要素は2個以上、[]で必ず囲み、「,(コンマ)」で区切ります。(複数会話が続けて定義される時は、”]”に","が続きます)

最後の要素が "註: catch caught caught 捕まえる " などの様に、「註:」で始まっていれば、吹き出し会話の最後尾に「註」として表示される。「:」アルファベット文字。



Flow Control(会話の流れ) 作業窓



「追加」ボタンは作業窓の会話定義をシステムに設定します。
「作動」ボタンはシステムを作動させ、入力した会話文を表示します。ProcやPerformが完結していれば、いつでも
「シーン表示」ボタンはflow_controlのシーン配列全体を表示します。
「型検査」ボタンは引用符「"」、コンマ「,」、かっこ「[ ]」の型を確認します。
「シーン更新」ボタンはflow_controlのシーン配列全体を更新します。
註 シーンの内容を編集するには、まずそのシーンを表示し、編集窓で編集後、更新します。

ステップ5 「Proc: 会話の一群」の登録

ステップ2で既にProcの開発規則は学習しています。
形式
[[Proc 名],
[会話の行],
 ・ ・ ・
[会話の行]],


例5

[["Lupin Talk1"],


["My name is Lupin. Now you can tell me yours. 俺は、ルパン。さあ、おせーて。",["My name is Alice. Where is Fujiko. 私はアリス。富士子様はどこ?","Perform:Lupin Talk2"]],


["I'm Lupin. You're Alice, aren't you? I heard about from Fujiko. 俺はルパン、君はアリスだろう?富士子から聞いている。","I met Fujiko, in the Kalacurii Kingdom's Prison. She was caught by the Kingdom's police. 富士子さんには、カラクリ王国の監獄で会いました。彼女は、王室の警察に捕まったのでした。"]],



「"Lupin Talk1"」のProcをproc_storeにステップ2で学習した方法で登録しします。1行目のアリスの返答には、次のPerformが指定されています。この会話は、「Lupin Talk2」に続きます。このように、必要に応じて、会話が掘り下げて行けます。[Proc: Lupin Talk2"]は既に、Proc_Storeに定義済み、入力の必要はありません。

註 この二つの会話(行)はProc名前の 「 [ 」と最後の行に続く「 ] 」で一まとめになります。Proc毎に初めと終わり[ ]は指定しなければならない。
 「書き込み」ボタンは下の倉庫作業窓に、手入力作業を省いて、設定(挿入)します。



Proc_Store(倉庫) 作業窓



「追加」ボタンは作業窓の会話定義をシステムに設定します。
「倉庫表示」ボタンはProc_storeの全配列内容を表示します。
「倉庫更新」ボタンはProc_storeの全配列内容を更新します。
「倉庫削除」ボタンはProc_storeの全配列内容を全部削除します。
「proc 表示」ボタンはProc_storeの1 proc 内容を表示します。(作業窓内にproc名を指定)
「proc 更新」ボタンはProc_storeの1 proc 内容を更新します。

註 追加できれば、作動してみます。 このように、他の人が準備したProcなどが使えるのは便利。
 proc_storeの内容を編集するには、まず表示し、編集窓で編集後、更新します。

ステップ6 条件会話文


条件文は、状況によって、返事の選択がされます。その内の一つ、記憶(記録)が有るかどうか。この例では、名前を知っているか、いないかで、返事が変わります。システムSVCを次の様に実行します。
["SVC1: /getInsert/ data_acquire(name)","「Yes 会話」","「No 会話」"],
SVC1 タイプ1
getInsert 記憶データを取り込む指示、3つ要素で構成、data_acquireの倉庫から、「name]と呼ぶ、データを呼び出す。nameはキーと呼ばれる認識表、任意名で格納時に付けた認識表。
Yes 会話 データが見つかれば、返す会話
No 会話 データが見つからない時、返す会話

例 6 次の条件会話をflow_controlに追加します。

["Do you know my name? I'm kind of famous. 俺の名前知ってる? 多少は知られた顔なんだけど。",["SVC1: /getInsert/ data_acquire(name)","Of course I do. Your name is &data. 勿論、あなたの名前は&data。",["I don't know your name, a small time theif who doesn't know how to properly introduce oneself. 知らないわ、礼儀正しく自己紹介も出来ない、こそ泥なんて。","Perform: My name is"]]],


註  data_acquireの倉庫に記録されたデータ名「name」を取り出します。見つかれば、「Yes 会話」の指定場所に取り込む、そうでなければ「No 会話」を戻す。「No 会話」に括りつけられた"Perform: Name"のProc名 Nameは、もしあなたがProc_Storeに定義していなければ、システムの定義から取り込みます。ここではシステムに定義されており、それを使います。
 ステップ3の作業窓に戻り、「追加」と「作動」を続けてクリックします。

Performが指定したProcは次の様に作成・保存されています。
[["My name is"],
["I'm <Mario>. What is yours? 俺は<マリオ>だけど、あなたの名前は?","私はアリス。","SVC2: /putfromHuman/ data_acquire(name,<([^<>]+))","SVC2: /putfromHuman/ data_acquire(name,<[^<>]+)"],
["I'm <Mario>. 俺は<マリオ>。","Hi, . I'm Alice. <Mario> さん、私はアリス。","SVC2: /putfromHuman/ data_acquire(name,<([^<>]+))","SVC2: /putfromHuman/ data_acquire(name,<[^<>]+)"],// save mario's name
["My name is <Merry>. 私にの名は<メリー>。","Hi, . I'm Alice. <Merry> さん、私はアリス。","SVC2: /putfromHuman/ data_acquire(name,<([^<>]+))","SVC2: /putfromHuman/ data_acquire(name,<[^<>]+)"]],// save mario's name
註 putfromHuman SVC2命令は data_acquire倉庫に、name識別子(キー)で、<>内に指定去れたデータ(英語会話)、又は<>のデータを(日本語会話)記憶します。
類似の命令に["SVC2: /put/ data_acquire(name,data1)"]があります。data1のデータをnameで格納。例 ["SVC2: /put/ data_acquire(age, 21)"] ageキーで、21を設定。



ステップ 7 シーン(主題)の切り替え


会話のシーン(主題)を切り替えます。例えば、サッカーや映画館などに行った場合、会話の主体が変わります。シーンの切り替えはphase_control配列に設定された定義を使います。
シーンを分けなくて一つのシーンで会話を全て終わらせても良いのですが、一度に表示される会話が煩雑になります。会話し易くする為に、内容でシーン毎にまとめ分けます。  次の phase 命令を使います。

様式
"SVC3: /phase/ phase_control(scene名)"
phase システム命令、シーンを切り替えます。
phase_control シーン定義を格納した、倉庫名
scene名 キー(識別子

便宜上、phase_controlは次の様に暫定的に設定されています。flow_control(開始、終了)
"scene1":"flow_control(Hello,Handicraft)"
"scene2":"flow_control(Handicraft,Goodbye)"
"scene3":"flow_control(Scene 2,)"
"scene4":"flow_control(Stage 2,)"
"scene5":"flow_control(Stage 3,)"

次の例は「ルパンとアリス」の会話から「ルパンと富士子」の会話シーンに切り替えます。
例 7

["I'm shocked to hear you met her in Kalacurii Kingdom. 君がカラクリ王国で富士子に会ったとは驚きだ。","Uha, I feel Fujiko nearby close. なんだか、富士子さん、近くに感じられる","SVC2: /put/ store_property(robot_name,富士子)","SVC3: /phase/ phase_control(scene5)"],


註、scene5にはシーン「Stage 3」(Proc)がしてあります。 アりスの「"Uha, I feel Fujiko close nearby. はっ、富士子さんが近くに感じられる"」の後、富士子とルパンの会話主題り切り替わります。
phase_control配列に、 phase_control(Proc名1、Proc名2)の形式でシーンを定義、Proc名1からどのProc名2までを1シーンと見なす指定。指定された会話がシーンに取り込まれます。「"SVC2: /put/ store_property(robot_name,富士子)"」で、ロボットの名前を富士子に変えています。


flow_controlに追加後、ロボットと会話として見ましょう。また、独自の会話を追加下さい。

主題 に会話を追加する

中級クラスでは、便宜上、control_flow は暫定的に次の様に分割・設定されており、主題管理に使います。
これらの主題への追加は、次のラジオボタンと呼ばれる、ボタンにチェックマークを入れます。会話単位レベルで追加が可能になります。
但し、作業窓に於いて、[[[で始まる会話定義は、ラジオボタンの指示にも関わらず、control_flow全体を置き換える、[[は主題単位で置き換えるので、知識ができるまでは、使用は避けてください。

終わりに

学習曲線は立ち上がりが重いと思われ、絵画作成の手法を用いるのが良いのではないでしょうか。つまり、好きな題材を選び、まずデッサンで構図を決め、細部を詰めて行く工程。コンピュータ用語ではプロトタイピング、まず素・大枠を作動させて流れを作り、徐々に詳細を詰めて、改良して行く。大枠では、会話内容にも気にしない。

このクラスでは、文脈会話の為のPerform、記憶や回想の為のSVC の呼び出し、条件会話の為のSVCを学習しました。
最後まで、お付き合いありがとうございました。ネットの読者にもご紹介頂ける作品ができましたら、是非お寄せ下さい。いつか皆で、わいがやと、会話人格を作れる日が来ますように。ご質問、ご要望、コメントを歓迎します。

あなたの会話ロボット、で あなたのブラウザ下に保存。保存ロボットの作動専用ページはI,ロボットで開きます。dialogue AI

ヒント
会話の開発は作動を頻繁に繰り返しながら、一歩々進めます。急がば回れです。javascriptの配列の定義は、非常に繊細、少しでもミスがあるとたちまちだんまりとなります。かっこ、コンマ、クオーテーションマークなどのミスは、容易に起きるが、思い込みがあって、自分に腹が立つほど見つけにくい。作動で確認しながら、進めれば、ミスの範囲が狭められて、効率は何倍にも上ります。

配列の考え方

あなたアリス(返事)配列
私が好き?- はい
- いいえ
- 分からない
["私が好き","はい","いいえ","分からない"]

話しを繋ぐ。例では、「はい」と「いいえ」の返事の時、次の会話と結合している

私が好き?- はい
- いいえ
- 分からない
["私が好き?",["はい","Perform: 続き"],[いいえ","Perform: 続き"],"分からない"]
復元 保存ロボット定義を復元します、


© MindTree