Step5: 対話システムを外部に接続しよう

対話システムを外部のコンポーネントに接続してみましょう。

対話マネージャへ与えるスクリプトを以下のように編集してください。

sample2.seatml

<?xml version="1.0" encoding="UTF-8"?>
<seatml>
  <general name="sample">
    <agent name="speechin" type="rtcin" datatype="TimedString" />
    <agent name="speechout" type="rtcout" datatype="TimedString" />
    <agent name="commandout" type="rtcout" datatype="TimedString" />
  </general>
  <state name="OPEN">
    <rule>
      <key>こんにちは</key>
      <command host="speechout">こんにちは</command>
      <command host="commandout">hello</command>
    </rule>
    <rule>
      <key>さようなら</key>
      <command host="speechout">バイバイ</command>
      <command host="commandout">bye</command>
    </rule>
  </state>
</seatml>
SEATコンポーネントを起動している端末をCtrl+Cなどで停止させて、編集したスクリプトファイルを引数に与えて再度起動します。
% seat sample2.seatml

再起動した対話マネージャは出力ポートがひとつ増えています。

../_images/step5_02.png

このポートに外部のコンポーネントを接続することで、対話システムからコマンドを出すことができるようになります。

例えば、以下のスクリプトに示されるコンポーネントを接続してみましょう。

ConsoleOut.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
import OpenRTM_aist
import RTC
 
consoleout_spec = ["implementation_id", "ConsoleOut",
                  "type_name",         "ConsoleOut",
                  "description",       "Console output component",
                  "version",           "1.0",
                  "vendor",            "sample",
                  "category",          "example",
                  "activity_type",     "DataFlowComponent",
                  "max_instance",      "10",
                  "language",          "Python",
                  "lang_type",         "script",
                  ""]
 
class ConsoleOut(OpenRTM_aist.DataFlowComponentBase):
    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        self._data = RTC.TimedString(RTC.Time(0,0),"")
        self._inport = OpenRTM_aist.InPort("in", self._data)
    def onInitialize(self):
        # Set OutPort buffer
        self.registerInPort("in", self._inport)
        return RTC.RTC_OK
 
    def onExecute(self, ec_id):
        while self._inport.isNew():
            data = self._inport.read()
            print "command : %s" % data.data
        time.sleep(0.1)
        return RTC.RTC_OK
 
def MyModuleInit(manager):
    profile = OpenRTM_aist.Properties(defaults_str=consoleout_spec)
    manager.registerFactory(profile,
                            ConsoleOut,
                            OpenRTM_aist.Delete)
    comp = manager.createComponent("ConsoleOut")
 
def main():
    mgr = OpenRTM_aist.Manager.init(sys.argv)
    mgr.setModuleInitProc(MyModuleInit)
    mgr.activateManager()
    mgr.runManager()
 
if __name__ == "__main__":
    main()

このコンポーネントは受け取ったコマンドを端末に表示します。マイクに「こんにちは」「さようなら」と発話することで、音声による応答があると同時に、スクリプトに追加したコマンドが表示されるか確認して下さい。

対話マネージャへのスクリプトを変更することにより、応答メッセージの追加はもちろん、任意のデータタイプのポートを作成し情報を送出できます。この機能を用いることで、例えば外部の車輪型機構コントローラに接続し、「前進」「後退」などの台詞でコントロールするといったことが実現できます。

外部への接続のより具体的な例は「 ワールドシミュレータの使い方 」を参照してください。