[[Tutorial]] #contents *音声認識 [#t40318dd] ここではSIGVerseで音声認識を行う方法を説明します。 ※NIIサーバではSIGVerseのバージョン101104以降で正常に動作します。また、音声認識を行うためには、SIGVerseのインストール時にJulius(音声認識を行うソフト)やdictation-kitの場所を指定する必要があります。指定方法は[[こちら>SIGVerseのインストール(NIIサーバ)]] **音声データ(waveファイル)の音声認識 [#pc99087f] ここではあらかじめ用意されているサンプルの音声データ(waveファイル)を音声認識してみたいと思います。 ***コントローラ作成 [#m6feace7] 音声データを受け取り、音声認識を行うエージェントのコントローラを作成します。 $ 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; } ***コンパイル [#gdda3ca6] Makefileを修正します。 $ emacs Makefile オブジェクトファイルの指定のところをsoundRecog.soを指定します。 #オブジェクトファイルの指定 OBJS = soundRecog.so #ref(makefile_sound) コンパイルします。 $ make ***世界ファイル作成 [#l5f5ce8b] $ 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,Juliusの起動 [#q211f39e] まずSIGVerseを起動します。 $ ./sigserver.sh -p 9001 -w soundRecog.xml $ 次にJuliusを起動します。エンターキーを押してコマンドを続行します。 $ ./sigjsp.sh -p 9001 sigjsp.shというシェルスクリプトでJuliusを起動します。また、シミュレーションサーバが起動しているポート番号を-pオプションで指定して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 ***SIGViewerから音声データの送信 [#jac958b8] SIGVerse,Juliusが起動している状態で、クライアント側でSIGViewerを起動し、サーバに接続します。接続が完了するとロボット型エージェントが立っているのが見えると思います。 次にSIM_STRL_CMDがSTARTとなっている状態で、"send"ボタンを押してシミュレーションを開始し、右上にあるCommandタブをクリックします。一番上の入力欄はgeneralとvoiceを選択できるようになっています。ここではvoiceを選択します。次に"送信対象選択"ボタンをクリックしてロボット型エージェントをクリックします。次に"Send Voice"ボタンをクリックします。 #ref(sound_1.jpg) 送信する音声データを選択するダイアログが表示されるので、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)を聞いてい見ると"リンゴを三個ください"と言っていますので、少し間違って認識されているのがわかります。