音声認識によるPPTの操作スクリプト例
この例では、以前のRTM講習会で利用した音声認識によるパワーポイントの操作スクリプトについて述べます。
この例では、 '''ppt_mode''' と '''ppt_list_mode'''、 '''ppt_run_mode'''の3つの状態定義があります。
また、入出力のポートは、スクリプトファイルの最初に書く必要があり、''<general>タグ''の中に''<adaptor>タグ''(または''<agent>タグ'')で設定することができます。
下の例では、3つのデータポートと1つのTCPソケットの接続ポートが定義されています。現状では、TCPソケットポートからは、文字列のみ出力可能ですが、データポートの方は、TimedString, TimedWString, TimedFloat, TimedDouble, TimedShort, TimedLong, TimedOctet,TimedChar, TimedBooleanのデータ型に加えOpenRTM-aistの標準データ型のほぼすべてを設定することができます。
TimedString, TimedWString, TimedFloat, TimedDouble, TimedShort, TimedLong, TimedOctet,TimedChar, TimedBooleanのデータ型に関しては、少し特別な取り扱いをしています。(それぞれのデータ型に含まれるTime構造体をアクセスしないようにしています。)
各状態での振る舞いは、''<rule>タグ''で設定します。''<key>タグ''は、入力ポートからのデータまたは入力ポート名を設定します。
このデータまたは、データポートからの入力に応じて、''<message>タグ''(または''<command>タグ'')、''<script>タグ''、''<shell>タグ''で設定した動作を実行することになります。
''<key>タグ''に文字列が設定されている場合は、TimedStringのデータポートまたはTCPソケットから入力された文字列に対する応答を記述することになります。
''<rule>タグ''の属性''source''に''<adaptor>タグ''(または''<agent>タグ'')の名前(name属性値)が設定されると、そのデータポートに入力があった場合に、'''rtc_in_data'''というグローバル変数にデータがセットされます。このデータは、''<script>''タグで記入したプログラム内で利用可能になります。
また、''<script>タグ''で処理した結果を出力したい場合には、'''rtc_result'''というグローバル変数に結果を入力すれば、'''host''' という属性で指定したポートからデータを出力させることができます。
下記の例では、'''ppt_list_mode'''の''<key>(いち|に|さん|よん|ご|ろく|なな|はち|きゅう|じゅう) 番目</key>''というルールを参照していただければよいと思います。
<?xml version="1.0" encoding="UTF-8"?> <seatml> <general name="ppt_control"> <adaptor name="gesture" type="rtcin" datatype="TimedString" /> <adaptor name="longvalue" type="rtcin" datatype="TimedLong" /> <adaptor name="command" type="rtcout" datatype="TimedString" /> <adaptor name="ppt" type="socket" host="localhost" port="10030" /> </general> <state name="ppt_mode"> <rule> <key>(list|リスト)</key> <message adaptor="ppt">(openList)</message> <script sendto="ppt"> global current_item current_item=0 rtc_result="(select %d)" % current_item </script> <statetransition>ppt_list_mode</statetransition> </rule> <rule> <key>close</key> <message sendto="ppt">(close)</message > </rule> <rule> <key>(run|実行|再生)</key> <message sendto="ppt">(run)</message > <statetransition>ppt_run_mode</statetransition> </rule> </state> <state name="ppt_list_mode"> <rule> <key>(open|オープン)</key> <message sendto="ppt">(open)</message > <statetransition>ppt_mode</statetransition> </rule> <rule> <key>select</key> <script sendto="ppt"> global current_item current_item=0 rtc_result="(select %d)" % current_item </script> </rule> <rule> <key>next_item</key> <script sendto="ppt"> global current_item current_item += 1 rtc_result="(select %d)" % current_item </script> </rule> <rule> <key>prev_item</key> <script sendto="ppt"> global current_item current_item -= 1 rtc_result="(select %d)" % current_item </script> </rule> <rule> <key>(いち|に|さん|よん|ご|ろく|なな|はち|きゅう|じゅう) 番目</key> <script sendto="ppt"> global current_item items ={u"いち":0, u"に":1, u"さん":2, u"よん":3, u"ご":4, u"ろく":5, u"なな":6, u"はち":7, u"きゅう":8, u"じゅう":9} v = rtc_in_data.split(' ')[0] print v current_item = items[v] rtc_result="(select %d)" % current_item </script> </rule> <rule> <key>(ppt|スライド)</key> <statetransition>ppt_mode</statetransition> </rule> </state> </seatml>
資料