SEATを起動する前に、まずJuliusを以下のコマンドラインによって起動してください。
% julius -C seatsat.jconf
Juliusのインストールとセットアップについてはjuliushowtoを参照してください。
次にSEATを
% seat [scriptfile]
の形式で起動します。
例1
% seat config.xml
スクリプトファイルconfig.xmlを読み込んで起動します。
例2
% seat adaptor.xml script1.xml script2.xml
スクリプトファイルは任意の数に分けて読み込むことが可能です。 この例ではアダプタ定義部adaptor.xmlと2つのスクリプトファイルscript1.xmlとscript2.xmlを読み込んで起動します。
SEATは、アダプタを定義することによって、OpenRTMやソケット通信を利用して外部モジュールと連携することができます。アダプタ定義の例を示します。
<general name="sample"> <julius host="localhost" port="9000" code="EUC-JP" /> <agent name="control" type="rtcout" /> <agent name="talk" host="localhost" port="11000" code="shift-jis" /> </general>
以下、個々の定義について解説します。
<julius [option] />
以下のオプションが指定可能です。
| host | Juliusを立ち上げたホストのIPアドレス | 必須 |
|---|---|---|
| port | Juliusとの通信に利用するポート | 必須 |
| code | Juliusとの通信に利用する文字コード | 任意(デフォルト”EUC-JP”) |
Juliusのモジュールモードでの起動についてはjuliushowtoを参照してください。
<agent [option] />
以下のオプションが指定可能です。
| name | アダプタを区別するID | 必須 |
|---|---|---|
| type | アダプタの種類 | 任意(デフォルト”socket”) |
| host | ソケットサーバを立ち上げたホストのIPアドレス | type==“socket”の場合必須 |
| port | ソケットサーバとの通信に利用するポート | type==“socket”の場合必須 |
| code | 各アダプタの通信に利用する文字コード | 任意(デフォルト”無変換”) |
typeには、”socket”以外にも”rtcout”が指定でき、その場合、OpenRTMを用いた出力ポートが生成されます。 type==“rtcout”で生成されたポートは、RTSystemEditorなどのGUIを使って、容易に他モジュールに接続することができます。
スクリプトは、複数の状態からなります。 状態の中にはルールを書きます。 ルールの条件部が真となるとルールのコマンド部が起動します。
スクリプトの例
<state name="main" dict="juliusdict/main.jgram"> <rule> <key>ロボット操作モード[へ変更]</key> <statetransition>robotcontrol</statetransition> <command host="talk"> (talk "ロボット操作モードへ変更") </command> </rule> </state> <state name="robotcontrol" dict="juliusdict/robotcontrol.jgram"> <rule> <key>1歩前進</key> <key>1歩前に進んで</key> <key>1歩前へ</key> <command host="talk">(talk "1歩前に行きます") </command> <command host="control">(robot hwalk :set-target-pos 0.2 0 0)</command> </rule> </state>
このスクリプトでは、”main”と”robotcontrol”の2つの状態が定義されています。 main状態で「ロボット操作モードへ変更」という入力を受けるとrobotcontrol状態へ移行します。 robotcontrol状態で「一歩前に進んで」という入力を受けると、ロボット操作サーバへ一歩前へ進むコマンドを送信します。
オプションの説明
<state [option]>
オプションは以下のものがあります。
| name | 状態を区別するID | 必須 |
|---|---|---|
| dict | この状態で利用する文法モデル | 必須 |
文法モデルは、上のスクリプト例の場合:
[SEATを起動したフォルダ]/juliusdict/main.jgram [SEATを起動したフォルダ]/juliusdict/robotcontrol.jgram
のファイルが読み込まれます。
Juliusの文法モデルの作成についてはjuliushowtoを参照してください。
nameが以下の値の場合、特殊な制御が行われる。
| name=“all” | 状態の遷移によらずルールと辞書が全ての状態で有効になる |
|---|---|
| name=“start” | 起動時に最初に選択される状態 |
オプションの説明
<rule> <key>[phrase]</key> <command>[command]</command> <statetransition>[name]</statetransition> </rule>
オプションは以下のものがあります。
| phrase | ルールの一致条件 | 最低一つは必須 |
|---|---|---|
| command | ルールが一致した場合に実行されるコマンド | 任意 |
| statetransition | 状態を遷移させるコマンド | 任意 |
phrase, commandともに複数指定することができます。phraseはどれか一致すると真になるOR条件で判定されます。ルールが一致すると複数指定されたコマンドはすべて実行されます。
phraseの指定には以下の形式が利用できます。
| [subphrase] | subphraseがあってもなくても一致する |
|---|---|
| (subphrase1|subphrase2) | subphrase1かsubphrase2のどちらかがあった場合に一致する |
*例1*
一歩前に進んで[ください]
「一歩前に進んで」「一歩前に進んでください」のどちらにも一致します。
*例2*
(一歩前|二歩前|三歩前)に進んで
「一歩前に進んで」「二歩前に進んで」「三歩前に進んで」のどちらにも一致します。
多入力機能の説明
keyタグには以下のオプションを指定することができます。(バージョン1.1.0以上で有効)
<key [option]>[phrase]</key>
| source | コマンドを受信するアダプタのID | 必須 |
|---|
sourceから受信したコマンドがphraseに一致するか判断します。
例えば以下のように使うことができます。
*例1*
<general name="sample1"> <agent name="socket1" host="localhost" port="11000" /> <agent name="socket2" host="localhost" port="12000" /> </general> <state name="start"> <rule> <key source="socket1">hello</key> <command host="socket2">received hello from socket1</command> </rule> <rule> <key source="socket2">hello</key> <command host="socket1">received hello from socket2</command> </rule> </state>
説明:ポート11000で接続したsocket1から入力「hello」があった場合、socket2に対して「recieved hello from socket1」と出力、ポート12000で接続したsocket2から入力「hello」があった場合、socket1に対して「recieved hello from socket2」と出力します。
*例2*
<rule> <key>ハロー</key> <key source="stdin">hello</key> <command host="stdout">hello!</command> </rule>
説明:音声入力「ハロー」と、標準入力からのキー入力「hello」のどちらにも一致して、標準出力に「hello!」と出力します。(”stdin”“stdout”はSEATにデフォルトで用意されたアダプタです)
オプションの説明
<command [option]>[command]</command>
オプションは以下のものがあります。
| host | コマンドを送信するアダプタのID | 必須 |
|---|
[command]で指定される内容が、hostで指定されるサーバに対して送信されます。
オプションの説明
<statetransition>[name]</statetransiton>
オプションは以下のものがあります。
| name | 遷移する状態のID | 必須 |
|---|
pushdown automatonの説明
statetransitionタグには以下のオプションを指定することができます。(バージョン1.1.0以上で有効)
<statetransition [option]>[name]</statetransiton>
| func | “push”か”pop” | 任意 |
|---|
func=“push”と指定した場合、現在の状態を保存し、[name]で指定される状態に遷移します。 func=“pop”と指定した場合、前回pushによって保存された状態に戻ります。
例えば以下のように使うことができます。
*例*
<state name="confirm" dict="confirm.jgram"> <rule> <key>はい</key> <commmand host="loopback">confirm-yes</command> <statetransition func="pop" /> </rule> <rule> <key>いいえ</key> <commmand host="loopback">confirm-no</command> <statetransition func="pop" /> </rule> </state> <state name="start" dict="selectAB.jgram"> <rule> <key>A[を選択]</key> <command host="loopback">enter-state</command> <statetransition func="push">handleA</statetransition> </rule> <rule> <key>B[を選択]</key> <command host="loopback">enter-state</command> <statetransition func="push">handleB</statetransition> </rule> </state> <state name="handleA"> <rule> <key source="loopback">enter-state</key> <command host="talk">Aでよろしいですか?</command> <statetransition func="push">confirm</statetransition> </rule> <rule> <key source="loopback">confirm-yes</key> <command host="talk">Aが選択されました</command> <statetransition func="pop" /> </rule> <rule> <key source="loopback">confirm-no</key> <command host="talk">Aが選択されませんでした</command> <statetransition func="pop" /> </rule> </state> <state name="handleB"> <rule> <key source="loopback">enter-state</key> <command host="talk">Bでよろしいですか?</command> <statetransition func="push">confirm</statetransition> </rule> <rule> <key source="loopback">confirm-yes</key> <command host="talk">Bが選択されました</command> <statetransition func="pop" /> </rule> <rule> <key source="loopback">confirm-no</key> <command host="talk">Bが選択されませんでした</command> <statetransition func="pop" /> </rule> </state>
解説:AかBの選択を入力しその選択を確認します。状態”confirm”はサブルーチンのようにして、状態”handleA”と状態”handleB”から呼ばれます。(アダプタ”loopback”はSEATにディフォルトで用意されています)