NEDO 次世代ロボット知能化技術開発プロジェクト 音声対話システムマニュアル ( 別冊 ) 1.0 版 独立行政法人産業技術総合研究所 株式会社セック
改版履歴 版数改版日改版内容備考 1.0 2012/02/29 初版作成 -i-
目次 1 総則... 1 1.1. 目的...1 1.2. 適用範囲...1 1.3. 関連文書等...1 1.3.1. 適用文書...1 1.3.2. 関連文書...1 1.3.3. 参考文書...1 1.4. 定義...2 1.4.1. 用語...2 1.4.2. 座標系...2 1.5. ライセンス...2 2 システム構成... 3 2.1. システム概要...3 2.2. 使用条件...3 2.3. ハードウェア仕様...3 3 コンポーネント仕様 (SOARRTC)... 4 3.1. インタフェース仕様...4 3.1.1. データポート...4 3.1.2. サービスポート...4 3.1.3. コンフィギュレーション...4 3.1.4. 設定ファイル...4 3.1.5. その他ファイル...4 3.2. プロダクションルール...5 3.2.1. 基本文法...5 3.2.2. メモリイメージ...5 3.3. 実行 ( 基本操作 )...6 3.3.1. コンポーネントの起動...6 3.3.2. SoarDebuggerへの接続...6 3.3.3. スクリプトの実行...7 4 使用例... 8 -ii-
4.1. 使用例一覧...8 4.2. HELLOWORLD...8 4.2.1. スクリプト...8 4.2.2. 実行...9 4.3. 最大値取得...10 4.3.1. スクリプト...10 4.3.2. 実行... 11 4.4. 最大値取得と割り込み対応...12 4.4.1. スクリプト...12 4.4.2. 実行...13 表目次表 1-1 適用文書一覧...1 表 1-2 関連文書一覧...1 表 1-3 参考文書一覧...1 表 1-4 音声対話システム用語一覧...2 表 2-1 動作環境...3 表 3-1 SoarRTC: インポート一覧...4 表 3-2 SoarRTC: アウトポート一覧...4 表 4-1 Soarシステム使用例一覧...8 表 4-2 SamplePatternGeneratorRTCのダウンロードURL... 11 図目次図 2-1 イメージ...3 図 3-1 init-sore 直後のメモリイメージ...5 図 4-1 Hello Wordのメモリイメージ...9 図 4-2 Hello Word 実行後のSoar Debugger 画面...9 -iii-
1 総則 1.1. 目的本書は 音声対話システムの別冊として OpenHRI に含まれる SoarRTC の使用方法につい て 記述した文書である 1.2. 適用範囲本書は OpenHRI に含まれる SoarRTC を用いたシステムに対して適用する 1.3. 関連文書等 1.3.1. 適用文書本書の適用文書を表 1-1 に示す 表 1-1 適用文書一覧 No 文書名版数発行元 1 コミュニケーション知能コンポーネント共通規格 第 1 版 NEDO 次世代ロボット知能化技 術開発プロジェクト コミュニケー ション知能 SWG 1.3.2. 関連文書 表 1-2 関連文書一覧 No 文書名版数発行元 1 音声処理モジュール群マニュアル 1.0 独立行政法人産業技術総合研究所 株式会社セック 2 音声対話システムマニュアル 1.0 独立行政法人産業技術総合研究所 株式会社セック 3 The Soar User s Manual 9.1 John E. Laird and Clare Bates Congdon User interface sections by Karen J. Coulter Electrical Engineering and Computer Science Department University of Michigan 4 The Soar 9 Tutorial August 27, 2008 John E. Laird University of Michigan 1.3.3. 参考文書 表 1-3 参考文書一覧 No 文書名 版数 発行元 1 Web OpenHRI Webサイト (http://openhri.net/) - 独立行政法人産業技術総合研究所 -1-
1.4. 定義 1.4.1. 用語 表 1-4 音声対話システム用語一覧 No 用語説明 1 AIST 独立行政法人産業技術総合研究所 ( 産総研 ) 2 RTM RT ミドルウェア 3 RTC RT コンポーネント 4 OpenHRI 産総研にて開発された音声認識 音声合成 対話制御など ロボット のコミュニケーション機能の実現に必要な各要素を実現するコンポ ーネント群 5 Soar プロダクションシステムエンジン 1.4.2. 座標系音声対話システムでは 座標は取り扱わない 1.5. ライセンス OpenHRI のライセンスは Eclipse Public License (EPL) である http://www.eclipse.org/legal/epl-v10.html EPL は コードの改変や再配布 営利利用を許可するオープンソースライセンスであるが 場合によっては改変内容をライセンス元に開示する必要がある OpenHRI が内部で用いている Julius や Open JTalk などのそれぞれのソフトウェアについては 各々のライセンスに従う なお 本書は クリエイティブ コモンズ表示 2.1 ライセンス (http://creativecommons.org/licenses/by-sa/2.1/jp/) の下に提供される -2-
2 システム構成 2.1. システム概要 Soar はプロダクションシステムエンジンである プロダクションシステムは 人工知能を実 現するための処理系のひとつで 振る舞いの規則である条件部 (IF) とアクション部 (Then) から構成される プロダクションルールの記述に従ってメモリ上に格納されたデータを更新し 推論 ( これまで の検索を考慮し 次の行動を決定 ) することにより 徐々にゴールに近い状態を取るよう検索を繰り返していく 推論の深さ浅さを自由にコントロールできるため ルールの記述次第では人間と同様の経験による推論や投機的な推論も実現可能となる 問題空間 : システムがりうる状態の集合 CBA CAB ACB ゴール BCA BAC ABC 図 2-1 イメージ 2.2. 使用条件システムの動作環境を表 2-1 に示す 表 2-1 動作環境 No. 要求環境備考 1 OS Linux Ubuntu 10.04 以上を推奨 2 Windows WindowsXP 3 ミドルウェア OpenRTM-aist 1.0.0-RELEASE (Python) 4 ツール RT-SystemEditor RTC の操作に必要となる 5 Soar Java Debugger Soar の操作に必要となる 2.3. ハードウェア仕様 SoarRTC は特定のハードウェアに依存するものではない -3-
3 コンポーネント仕様 (SoarRTC) 3.1. インタフェース仕様 3.1.1. データポート (1) インポート SoarRTC で定義するインポートについて表 3-2 に記述する SoarRTC では インポート接続時に新たなインポートが増設される ポート名は inport0 inport1 inport2 inportn(n: 数値 ) となる 表 3-1 SoarRTC: インポート一覧 ポート名型インタフェース型説明 1 inport0 Any,TimedString RTC Soar への入力データ 接続時に増設 される (2) アウトポート SoarRTCで定義するアウトポートについて表 3-2に記述する SoarRTC では アウトポート (outport で始まるポート ) が接続時に新たなアウトポートが増設される ポート名は outport0 outport1 outport2 outportn(n: 数値 ) となる 表 3-2 SoarRTC: アウトポート一覧 ポート名型インタフェース型説明 1 command TimedStroutg RTC コマンドデータ 2 outport0 Any,TimedStroutg RTC 出力データ 接続時に増設される 3.1.2. サービスポート SoarRTC はサービスポートを定義しない 3.1.3. コンフィギュレーション SoarRTC はコンフィギュレーションを定義しない 3.1.4. 設定ファイル SoarRTC 独自の設定ファイルはない rtc.conf のみ使用する 3.1.5. その他ファイル SoarRTC は プロダクションルール ( スクリプト ) に従って動作する プロダクションルールを記載したスクリプトファイル名の拡張子は.soar となる -4-
3.2. プロダクションルール 3.2.1. 基本文法 Soar のプロダクションルールの基本文法をエラー! 参照元が見つかりません に示す リスト 3-1 Soar スクリプト ( 基本文法 ) sp { ルール * 名前 ( 条件 ) ( 条件 ) # 条件部とアクション部の境界 ( アクション ) ( アクション ) 3.2.2. メモリイメージ S1 1 ^superst t ^type ^io nil state I1 ^output-link ^input-link I3 I2 凡例識別子 ^ 属性値 図 3-1 init-sore 直後のメモリイメージ -5-
3.3. 実行 ( 基本操作 ) SoarRTC を動作させる場合の基本操作について記述する 3.3.1. コンポーネントの起動 (1) Ubuntu 1. ネームサーバを起動する 2. RTSystemEditor を起動する 3. SoarRTC を起動する 4. SoarDebugger を起動する リスト 3-2 soarrtc と soardebugger の起動 $ soarrtc $ soardebugger (2) Windows 1. ネームサーバを起動する 2. RTSystemEditor を起動する 3. SoarRTC を起動する [ スタートメニュー ] -[OpenHRI]-[dialogmanager] -[SoarRTC] を起動する 4. SoarDebugger を起動する SoarSuite を解凍したフォルダ内の SoarJavaDebugger.bat を起動する 3.3.2. SoarDebugger への接続 1. SoarDebugger のメニューの [Kernel]-[Connect to remote Soar] を選択する 2. 警告画面が表示されるが OK を押下する -6-
3. Remote Soar Kernel Connection ダイアログで以下を設定し OK を押下する IP アドレス :127.0.0.1 ポート番号 :12121( デフォルトのまま ) 3.3.3. スクリプトの実行 1. Inist-Soar を押下する 2. Source を押下する ファイル選択ダイアログが表示されるので スクリプトファイルを選択する 3. Run を押下する -7-
4 使用例 4.1. 使用例一覧対話制御コンポーネントを利用した音声対話システムのサービスを表 4-1 に記述する 表 4-1 Soar システム使用例一覧 No 名称説明 1 Hellow World HelloWorld を SoarDebugger の画面へ出力する 2 最大値取得入力ポートより入力された値の中から最大値を出力する 3 最大値取得と割り込み対応 入力ポートより入力された値の中から最大値を出力し 割り込み があった場合に Emergency と音声で伝える 4.2. HelloWorld HelloWorld を SoarDebugger の画面へ出力する 4.2.1. スクリプトリスト 4-1 は HellowWorld のスクリプト例である 本例では "propose*hello-world" と "apply*hello-world" の 2 つのプロダクションルールで構成される リスト 4-1 Soar スクリプト (hello.soar) sp {propose*hello-world # hello-world proposeフェーズ (state <s> ^type state) # メモリ <s> のtypeの値がstateである場合 ( 初期状態 ) (<s> ^operator <o> +) # メモリ <s> 直下に (<o> ^name hello-world) # hello-worldという名前のオペレータを登録する sp {apply*hello-world (state <s> ^operator <o>) (<o> ^name hello-world) (write Hello World ) (halt) # hello-world applyフェーズ # メモリ <s> 直下に # hello-worldという名前のオペレータがある場合 # Hello World を出力する 文字列は" " で囲む # 停止する ^type state s ^operator o ^name hello-world -8-
図 4-1 Hello Word のメモリイメージ 4.2.2. 実行 3.3 実行 ( 基本操作 ) に従い 実行する スクリプトによる出力 図 4-2 Hello Word 実行後の Soar Debugger 画面 -9-
4.3. 最大値取得 RT コンポーネントと接続し 各入力ポートより入力された値の中から最大値を取得し 出力 する 4.3.1. スクリプト最大値取得のスクリプト例をエラー! 参照元が見つかりません に示す 本例では 以下の 4 つのプロダクションルールで構成される propose*print-value: 入力データを取得するためのルール propose*remove*old-print-value: 同一 RTC の同一ポートからの最新値を取得するためのルール elaborate*bigger-value: ソート機能を実現するためのルール apply*print-value: コンソールへの出力するためのルール リスト 4-2 Soar スクリプト (maxvalue.soar) sp {propose*print-value # print-value proposeフェーズ (state <s> ^io.input-link.data <d>) # 入力データの (<d> ^datatype RTC.TimedLong # データ型がRTC.TimedLongである場合 ^data <v> ^time <t> ^port <p>) (<s> ^operator <o> +) # メモリ <s> 直下の <o> に次のオペレータを登録する (<o> ^name print-value # 名前 :print-value ^data <v> # データ : 入力データの値 ( 数値 ) ^time <t> # 時間 : 入力データの時刻情報 # コンポーネント : 入力元 RTC 名 ^port <p>) # ポート : 入力元 RTCの出力ポート名 sp {propose*remove*old-print-value # remove*old-print-value proposeフェーズ (state <s> ^operator <o1> # メモリ <s> 直下の ^operator <o2>) # オペレータについて (<o1> ^name print-value # 名前がprint-value ^port <p> ^time <t1>) (<o2> ^name print-value # コンポーネント名が <o1><o2> で同じ ^port <p> # ポート名が <o1><o2> で同じ ^time < <t1>) # 時刻情報が <o1> より古い場合 (<s> ^operator <o2> -) # 時刻情報が古い方 (<o2>) を削除する sp {elaborate*bigger-value # bigger-value elaborateフェーズ (state <s> ^operator <o1> + # メモリ <s> 直下の ^operator <o2> +) # print-valueという名前のオペレータについて (<o1> ^name print-value ^data <v1>) (<o2> ^name print-value ^data < <v1>) # データの値が <o1> より小さい場合 -10-
(<s> ^operator <o1> > <o2>) # <o2> よりも <o1> を優先する sp {apply*print-value # print-value applyフェーズ (state <s> ^operator <o>) # メモリ <s> 直下の (<o> ^name print-value # print-valueという名前のオペレータがある場合 ^data <v> ^port <p>) (write Max value <v>, Component <c>, Port <p>) # Max value 最大値( 最優先のprint-valueオペレータの値 ) # Component 最大値の入力元 RTC 名 # Port 最大値の入力元 RTCのポート名を出力する 4.3.2. 実行 (1) SamplePatternGeneratorRTC (a) 取得表 4-2のURLよりダウンロードし ファイルを展開する 表 4-2 SamplePatternGeneratorRTCのダウンロードURL ダウンロードファイル https://github.com/yosuke/ XableRTC/zipball/master (b) 起動 Ubuntu リスト 4-3に示すコマンドを実行する リスト 4-3 SamplePatternGeneratorRTCの起動 $ cd [SamplePatternGeneratorRTCの展開フォルダ] $ python SamplePatternGeneratorRTC Window SamplePatternGeneratorRTC.py をダブルクリックする (2) コンポーネントの起動 3.3 実行 ( 基本操作 ) に従い 実行する スクリプト実行前に RTSystemEditor にて SamplePatternGeneratorRTC の適当な数の出力ポートと SoarRTC の入力ポートを接続し アクティベートしておくこと -11-
4.4. 最大値取得と割り込み対応 RT コンポーネントと接続し 各入力ポートより入力された値の中から最大値を取得し 出力 する データ内容が emergency であった場合 最優先で処理を行う 4.4.1. スクリプト割り込み対応のスクリプト例をに示す 本例では 以下の 3 つのプロダクションルールで構成される propose*emergency: 入力データを取得し emergency データのを最優先処理するためのルール propose*remove*old-emergency: 同一 RTC の同一ポートからのデータが最優先であることを確認するためのルール apply*print-emergency: コンソールおよびコマンドポートへ出力するためのルール リスト 4-4 Soar スクリプト (emergency.soar) sp {propose*emergency # emergency proposeフェーズ (state <s> ^io.input-link.data <d>) # 入力データの (<d> ^datatype RTC.TimedString # データ型がRTC.TimedString ^data emergency # データ内容がemergencyである場合 ^time <t> ^port <p>) (<s> ^operator <o> + >) # メモリ <s> の <o> に最優先でオペレータを登録する (<o> ^name emergency # 名前 :emergency ^data Emergency # データ :"Emergency" ^time <t> # 時間 : 入力データの時刻情報 # コンポーネント : 入力元 RTC 名 ^port <p>) # ポート : 入力元 RTCの出力ポート名 sp {propose*remove*old-emergency # remove*old-emergenc proposeフェーズ (state <s> ^io.input-link.data <d> # 入力データと ^operator <o>) # オペレータについて (<d> ^datatype RTC.TimedString # データ型がRTC.TimedString ^data <> emergency # データ内容がemergencyでない場合で ^time <t> ^port <p>) (<o> ^name emergency # emergencyという名前のオペレータの ^time < <t> # 時間が入力データよりも古い場合 ^port <p>) (<s> ^operator <o> -) # オペレータから当該データを削除する sp {apply*print-emergency # print-emergency applyフェーズ (state <s> ^operator <o> ^io.output-link <ol>) # emergencyという名前のオペレータがある場合 (<o> ^name emergency) (write Emergency!!! ) # Emergency!!! と出力する (<ol> ^rtcout <o> ) # 出力ポートにオペレータ内容を出力する -12-
4.4.2. 実行 (1) コンポーネントの起動 3.3 実行 ( 基本操作 ) に従い 実行する スクリプト実行前に以下のコンポーネントを起動し RTSystemEditor にて 各 RTC を接続 し アクティベートしておくこと SoreRTC SamplePatternGeneratorRTC FestivalRTC PortAudioOutput/PulseAudioOutput -13-