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
再起動した対話マネージャは出力ポートがひとつ増えています。
このポートに外部のコンポーネントを接続することで、対話システムからコマンドを出すことができるようになります。
例えば、以下のスクリプトに示されるコンポーネントを接続してみましょう。
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()
このコンポーネントは受け取ったコマンドを端末に表示します。マイクに「こんにちは」「さようなら」と発話することで、音声による応答があると同時に、スクリプトに追加したコマンドが表示されるか確認して下さい。
対話マネージャへのスクリプトを変更することにより、応答メッセージの追加はもちろん、任意のデータタイプのポートを作成し情報を送出できます。この機能を用いることで、例えば外部の車輪型機構コントローラに接続し、「前進」「後退」などの台詞でコントロールするといったことが実現できます。
外部への接続のより具体的な例は「 ワールドシミュレータの使い方 」を参照してください。