Using JuliusRTC and SEAT (Cpp) for Windows
OpenHRIは音声対話に関する複数のフリーソフトを使いやすくまとめたRTC群です。
ここでは音声認識RTC JuliusRTCと、対話制御RTC SEATの使用方法を説明します。
OpenHRIのインストール方法や各フリーソフトの解説はこちらをご覧ください。
1. はじめに
OpenHRIの音声認識RTC JuliusTalkRTCと対話制御RTC SEATを使用して音声対話システムを構築します。
ここでは、「音声で指定された色のボールを、ロボットが取得する」というシナリオでシステムを設計します。
作成するRTCは以下のようになります。
-
Controller
音声によって指定されたボールの色に合わせて、コンソールの表示するテキストを切り替えます。
また、どの色のボールを取得するのか発話させるために、テキストデータを出力します。
7. おわりに
OpenHRIの中の、JuliusとSEATを使って、音声対話システムを作成しました。
本来、音声認識は高度な内容ですが、OpenHRIを使用することで簡単に実現することができました。
また、今回はその恩恵がわかりにくかったですが、SEATを使うことで音声対話の状態遷移を管理することができます。
本来はもっと複雑な対話のシナリオを記述することができますので、参考文献[1]を参考にして、ぜひ挑戦してみてください。
参考文献
-
「対話知能モジュール:音声認識,seat, soarについて」, 『Suehiro's Wiki』<http://www.taka.is.uec.ac.jp/~suehiro/cgi-bin/moin_main.cgi/OpenHRI/>(2014/06/15アクセス)
それではコードを解説します。
基本的には、上記のコードはほぼテンプレートだと思ってください。
-
7行目
root属性にcommandを設定することで、デフォルトの音声認識文法が8-15行目のcommandとなります。
-
8-14行目
rule idがcommandのときに、有効化される音声認識文法です。
-
10-12行目
以下の音声を認識するよう設定します。
あかのぼーるをとってください
あおのぼーるをとってください
みどりのぼーるをとってください
以上で、sample.xmlのコーディングは終了です。
コードが入力し終わったら、JuliusRTCの実行ファイルが保存されているフォルダにsample.xmlを保存してください。
64bitのWindowsでは、デフォルトでは以下の場所に保存します。
C:\Program Files (x86)\
6. 動作確認
音声と合成を行うので、マイクとスピーカーが必要となりますので、PCにマイクとスピーカーを接続してください。
まず、ネームサービスとRT System Editorを実行します。
次に、作成したControllerと、PortAudioInput、JuliusRTC、SEAT、OpenJTalkRTC、PortAudioOutputを実行します。
PortAudioInput、JuliusRTC、SEAT、OpenJTalkRTC、PortAudioOutputは64bitのWindowsでは、以下の場所にあります。
また、JuliusRTCとSEATは起動時にXML形式のファイルを指定する必要がありますので、コマンドプロンプトから実行します。
コマンドプロンプトは以下のように起動できます。
■Windows 7の場合
スタートメニュー > 全てのプログラム > アクセサリ > 全のプログラム > コマンドプロンプトとクリックすれば起動できます。
キー操作だけで行うなら、Winキー > cmd > Enterキー と順にキー入力すれば起動できます。
■Windows 8/8.1
Winキー + x > c と順にキー入力すれば起動できます。
他の、RTCは各実行ファイルをダブルクリックして起動してください。
-
OpenJTalkRTC
C:\Program Files (x86)\OpenHRIVoice\openjtalkrtc.exe
-
PortAudioInput
C:\Program Files (x86)\OpenHRIAudio\portaudioinput.exe
-
PortAudioOutput
C:\Program Files (x86)\OpenHRIAudio\portaudiooutput.exe
-
Julius
C:\Program Files (x86)\OpenHRIVoice\juliusrtc.exe
起動方法
2. 音声合成システムの構成
人間が音声で支持した色のボールを拾うロボットシステムを構築します。
構築するシステムは以下のようになっています。
* 実際にロボットは動かしませんが、Controllerからロボットに指示することで、そのようなシステムが実現できます。
-
PortAudioInput
マイクのような音声入力デバイスから音声データを取得して出力します。
-
JuliusRTC
受け取った音声データを解析して、XML形式の解析データとして出力します。
-
SEAT
SEATは対話シナリオを簡易にプログラムすることができるRTCです。
今回は、XML形式の解析データを受け取り、その内容に合わせたテキストデータを出力させます。
-
Controller
入力されたテキストデータに合わせて、表示するテキストを切り替えます。
また、どの色のボールを取得するのか発話させるために、テキストデータを出力します。
-
OpenJTalkRTC
受け取ったテキストデータを音声データに変換して出力します。
-
PortAudioOutput
受け取った音声データをスピーカーのような音声出力デバイスから出力し、音を鳴らします。


マイクに向かって、以下のセリフを発話を入力してみください。
あかのぼーるをとってください
あおのぼーるをとってください
みどりのぼーるをとってください
入力された音声に応じて、Controllerのコンソール上の表示と、音声合成されるセリフが変わることがわかると思います。
* 音声認識の精度を上げるために、なるべく静かなところで動作確認を行い、雑音が入らないよう注意して下さい。
OpenJTalkRTCには、character、format、rateというコンフィグレーションが設定されています。
characterはデフォルトではmaleになっていますが、femaleに変更することで女性のような発話に変更することができます。
それではコードを解説します。
基本的には、上記のコードはほぼテンプレートだと思ってください。
-
3-6行目
speechinとspeechoutというTimedString型の二つのポートを設定しています。
-
7行目
name属性にOPENという名前を与えます。
SEATは対話の状態に合わせた状態遷移を管理することができます。
ここでは、OPENという一つの状態のみを扱います。
-
9-19行目
状態がOPENのときの処理を記述します。
-
8-11行目
speechinポートから「あかのボールをとってください」というテキストデータが入力された場合は、
speechoutポートに「あかのボールをとります」というテキストデータを出力します。
-
13-16行目
speechinポートから「あおのボールをとってください」というテキストデータが入力された場合は、
speechoutポートに「あおのボールをとります」と出力します。
-
16-18行目
speechinポートから「みどりのボールをとってください」というテキストデータが入力された場合は、
speechoutポートに「みどりのボールをとります」と出力します。
以上で、sample.seatmlのコーディングは終了です。
コードが入力し終わったら、SEATの実行ファイルが保存されているフォルダにsample.seatmlを保存してください。
64bitのWindowsでは、デフォルトでは以下の場所に保存します。
C:\Program Files (x86)\
5. Controller RTC
Controller RTCを作成します。
テンプレートを以下に従って設定てください。
-
モジュール名
Controller
-
ベンダ名
あなたの名前
-
モジュールカテゴリ
Hobby
-
実行周期
1000
-
アクションコールバック
onInitialize
onExecute
-
データポート
・string_outポート
ポート名(OutPort) string_out
データ型 TimedString
変数名 string_out
表示位置 RIGHT
・string_inポート
ポート名(OutPort) string_in
データ型 TimedString
変数名 string_in
表示位置 LEFT
-
言語
C++
プロジェクトの設定が終わったら、Controller.cppに以下のコードを記述します。
以下のコードは抜粋となります。生成したテンプレートに当てはめて下さい。
それではソースコードを解説します。
-
3-25行目
InPortに音声データが入力された場合、それに合わせたテキストデータをコンソール上に出力します。
また、受けたとった音声データをそのままOutPortから出力します。
-
5-6行目
InPortのデータを読み込み、std::stringクラスに格納します。
-
8-21行目
取得した文字列データを比較して、ボールの色にあわせて処理を切り替えます。
また、Windows上では文字をShift-JIS形式で扱うので、そのままでは取得したUTF-8形式の文字列と比較できません。
そこで、音声合成システムのときに使用したconvert_ShiftJIStoUTF8関数を使用して文字列の形式を変換します。
この関数の説明はここをごらんください。
-
8-11行目
「あかのぼーるをとります」というテキストデータの場合は、「目標は赤のボールです」とコンソール上に出力します。
-
13-16行目
「あおのぼーるをとります」というテキストデータの場合は、「目標は青のボールです」とコンソール上に出力します。
-
18-21行目
「みどりのぼーるをとります」というテキストデータの場合は、「目標は緑のボールです」とコンソール上に出力します。
-
23-24行目
InPortから取得した音声データを、OutPortから出力します。
以上で、Controllerのコーディングは終了です。
コードが入力し終わったら、ビルドを行ってください。
3. JuliusRTCのセットアップ
JuliusRTCには音声認識文法が必要となります。
以下のようなsample.xmlというXML形式のファイルを作成してください。
この形式はW3C-Speech Recognition Grammarという形式に準拠しています。
詳しくは、Speech Recognition Grammar Specification Version 1.0をご覧ください。
ファイル作成時には、必ずUTF-8形式でファイルを保存してください。
メモ帳で作成する場合は、名前を付けて保存を行うときに、右下の文字コードをANSIからUTF-8に変更するだけです。
4. SEATのセットアップ
SEATには音声対話や指令によるロボットの制御を記述したスクリプトを設定する必要があります。音声認識文法が必要となります。
以下のようなsample.seatmlというXML形式のファイルを作成してください。
先ほどと同様、ファイル作成時には、必ずUTF-8形式でファイルを保存してください。
メモ帳で作成する場合は、名前を付けて保存を行うときに、右下の文字コードをANSIからUTF-8に変更するだけです。
全RTCが起動できたら、各RTCを以下のように接続して、Activateしてください。
chdir C:\Program Files (x86)\OpenHRIVoice
Juliusrtc.exe sample.xml
-
SEAT
C:\Program Files (x86)\SEATSAT\SEAT.exe