![[PukiWiki] [PukiWiki]](image/Concept_logo.jpg) 
 Tutorial?
ここではSIGVerseで音声認識を行う方法を説明します。
※NIIサーバではSIGVerseのバージョン101104以降で正常に動作します。また、音声認識を行うためには、SIGVerseのインストール時にJulius(音声認識を行うソフト)やdictation-kitの場所を指定する必要があります。指定方法はこちら
ここではあらかじめ用意されているサンプルの音声データ(waveファイル)を音声認識してみたいと思います。
音声データを受け取り、音声認識を行うエージェントのコントローラを作成します。
$ cd ~/sigverse-<version>/bin/NewWorld $ emacs soundRecog.cpp
soundRecog.cpp
#include <Controller.h>
#include <ControllerEvent.h>
#include <RawSound.h>
#include <Logger.h>
#include <Text.h>
class AgentController : public Controller
{
public:
  //音声データを受け取った時に呼出される関数onRecvSoundの利用を宣言します。
  void  onRecvSound(RecvSoundEvent &evt);
};
void AgentController::onRecvSound(RecvSoundEvent &evt)
{
  //音声データを取得します。
  RawSound * sound = evt.getRawSound(); 
  // 音声認識結果をテキストで取得します。
  Text * text = getText(*sound);
  if (text) { 
    // 音声認識結果を表示します。
    const char * str = text->getString();
    LOG_MSG(("text : %s", str));
    // 必要なくなったらテキストデータをdeleteします。
    delete text;
  }
}
extern "C"  Controller * createController ()
{
  return new AgentController;
}
Makefileを修正します。
$ emacs Makefile
オブジェクトファイルの指定のところをsoundRecog.soを指定します。
#オブジェクトファイルの指定 OBJS = soundRecog.so
コンパイルします。
$ make
$ cd .. $ emacs xml/soundRecog.xml
<?xml version="1.0" encoding="utf8"?>
<world name="VisTest2">
  <gravity x="0.0" y="-9.8" z="0.0"/>
<!--音声データ受信エージェントRobot-niiの設定-->
  <instanciate class="Robot-nii.xml"> 
        <set-attr-value name="name" value="robot_000"/>
        <set-attr-value name="language" value="c++"/> 
<!--音声データ受信者のコントローラ指定-->
        <set-attr-value name="implementation"
value="./NewWorld/soundRecog.so"/>
<!--動力学演算をfalseに設定-->
        <set-attr-value name="dynamics" value="false"/>
<!--エージェントの位置(x,y,z)-->
       <set-attr-value name="x" value="0.0"/>
       <set-attr-value name="y" value="60.0"/>
       <set-attr-value name="z" value="-60.0"/>
</instanciate>
これで準備完了です。
まずSIGVerseを起動します。
$ ./sigserver.sh -p 9001 -w soundRecog.xml $
次にJuliusを起動します。エンターキーを押してコマンドを続行します。
$ ./sigjsp.sh -p 9001
sigjsp.shというシェルスクリプトでJuliusを起動します。また、シミュレーションサーバが起動しているポート番号を-pオプションで指定してJuliusが起動したことをシミュレーションサーバに知らせます。
以下のようなメッセージが表示されればJuliusは正常に起動しています。正常に起動しない場合はJuliusの設定を参照ください。
Stat: adin_tcpip: waiting connection... =================================== julius adinnet port connect ok! Stat: server-client: connect from 127.0.0.1 Stat: adin_tcpip: connected =================================== *************************************** *** julius successfully started *** *************************************** ******************************************************* connect to SimServer (localhost:9111) ok ******************************************************* clerkName (socio.iir.nii.ac.jp) send COMM_REQUEST_PROVIDE_SERVICE ok waiting for connection ... (accept sock: 7) [SYS] socio.iir.nii.ac.jp:7500 : service provider [SYS] 127.0.0.1 connected
SIGVerse,Juliusが起動している状態で、クライアント側でSIGViewerを起動し、サーバに接続します。接続が完了するとロボット型エージェントが立っているのが見えると思います。
次にSIM_STRL_CMDがSTARTとなっている状態で、"send"ボタンを押してシミュレーションを開始し、右上にあるCommandタブをクリックします。一番上の入力欄はgeneralとvoiceを選択できるようになっています。ここではvoiceを選択します。次に"送信対象選択"ボタンをクリックしてロボット型エージェントをクリックします。次に"Send Voice"ボタンをクリックします。
送信する音声データを選択するダイアログが表示されるので、SIGViewerをインストールしている場所、デフォルトでは
C:\Program Files\SIGViewer_<version>\SIGViewer\release
にあるsample.wavを選択して、音声データを送信します。 すると以下のようなメッセージが表示され、 「貧乏参考ください」という音声認識結果が表示されると思います。
connection accepted. (sock=8) waiting for connection ... (accept sock: 7) connection accepted. (sock=8) waiting for connection ... (accept sock: 7) [MSG] robot_000(127.0.0.1) text : 貧乏参考ください。
音声データ(sample.wav)を聞いていみると「リンゴを三個ください」と言っているので、少し間違って認識されているのがわかります。
※SIGVerseを終了してもJuliusだけが起動しつづていることがありますので注意してください。以下のコマンドで起動中のプロセスを確認できます。
$ ps aux | grep <username>
Julius起動時にSIGVerseのインストール先の以下の設定ファイルが読み込まれます。見てみましょう。
$ emacs /home/<usrname>/sigverse-<version>/share/sigverse/etc/sigjsp.conf
デフォルトでは以下のようになっています。
# ************************************************************ # sigjsp configuration file # ************************************************************ # ====================================================== # SimServer hostname and port number # ====================================================== SERVER=localhost PORT=7000 # ====================================================== # Port number that sigjsp waiting for connection # ====================================================== SERVICE_PORT=7500 # ====================================================== # julius port number # ====================================================== JULIUS_MODULE_PORT=10500 JULIUS_ADINNET_PORT=5530 # ====================================================== # julius path (not directory, path to executable) # ====================================================== JULIUS_PATH=/usr/local/bin/julius # ====================================================== # julius config file # # [remark] # when relative path is specified, actual path is # calculated from current directory. # (ex) # JULIUS_CONFIG_FILE=fast.jconf # $ pwd # /home/somebody # $ sigjsp # ---> sigjsp searches for /home/somebody/fast.jconf # ====================================================== JULIUS_CONFIG_FILE=/usr/local/share/dictation-kit-v4.0/fast.jconf # ====================================================== # some wait time to finish starting julius (in msec) # ====================================================== # DELAY_TIME_FOR_START_JULIUS=3000
ここでは以下の設定が行えます。
SIGVerseではJuliusをサーバモードで立ち上げるため、シミュレーションサーバのポート番号以外に3つのポート番号が設定を行う必要があります。これらのポート番号をデフォルトの値から他のユーザーと重複しにくい番号に変更しておくことをお勧めします。
また、これらのポート番号や設定ファイルはsigjsp.shの実行時に指定することもできます。何も指定しなければ上記の設定ファイルで指定した値になります。
% sigjsp.sh [-p <number>] [-sp <number>] [-mp <number>] [-ap <number>] [-e <path>] [-C <config.jconf>]
OPTION : -p <number> : シミュレーションサーバのポート番号 -sp <number> : Juliusサービスプロバイダのポート番号 -mp <number> : Juliusモジュールモードポート番号 -ap <number> : adinnetポート番号 -e <path> : Juliusの場所 (デフォルト: /usr/local/bin/julius) -C <config.jconf;> : Juliusの設定ファイルの場所
Juliusの設定ファイルについての設定方法はJuliusのマニュアル等を参照してください。
次にマイクで録音した音声データをSIGVerseで音声認識してみたいと思います。