複数のアプリを連携させて動作させる方法にクライアントサーバー方式というものがあります。そこでは、クライアントアプリとサーバーアプリがソケットという機構を使って交信します。
今回は、音声認識アプリ(サーバー)が出力する音声認識結果を受けとるクライアントアプリを作ってみました。2012/10/23に書いたクライアントの簡易版です。
今回作成したクライアントは、windows上で動きます。プログラムはネット上にあったソケットプログラムをjulius用に修正した素朴なものです。
==
(Visual Studio C++ 2010を利用する場合をイメージしています)
1.新規に[空のプロジェクト]を追加する。
2.ソースファイルを追加する。
1)[プロジェクト]-[新規項目の追加][C++ファイル(.cpp)]を選択する。
3.リンカにソケット通信用のライブラリを追加する。
1)[プロジェクト]-[xxxのプロパティ]を選択する。
※xxxには、プロジェクト名が入ります。
2)画面左側のツリーから[構成プロパティ]-[リンカ]-[コマンドライン]を選択する。
3)追加のオプションに以下を追加する。
ws2_32.lib
/* Windows用Juliusクライアントプログラム
JuiusClient.cpp (ws2_32.libをリンクすること)*/
#include <stdio.h>
#include <winsock2.h>
int main(void ){
SOCKET s; //ソケット
//接続するサーバの情報
struct sockaddr_in dest;
//接続するサーバのIPアドレス
char destination[] = “127.0.0.1”;
char buffer[4096];
//ソケット通信の準備
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
//接続先(サーバ)のアドレス情報を設定
memset(&dest, 0, sizeof(dest));
//ポート番号はサーバプログラムと共通
dest.sin_port = htons(10500);
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(destination);
//ソケットの生成
s = socket(PF_INET, SOCK_STREAM, 0);
//サーバへの接続
if(connect(s, ( struct sockaddr *) &dest, sizeof (dest))){
printf( “%sに接続できませんでした\n” , destination);
return -1;
}
printf(“%sに接続しました\n”, destination);
for( int i=0; i<50; i++){ //50行表示
//サーバからデータを受信
recv(s, buffer, 4096, 0);
for(int j=0; j<4096; j++){
if(buffer[j]==’.’ ) {buffer[j+1]=’\0′; break;}
}
printf(” %s\n\n”, buffer);
}
scanf(“%s”,buffer); //強引に停止させている
// Windows でのソケットの終了
closesocket(s);
WSACleanup();
return 0;
}
===注
(コピペで全角になる字は、直してください)
このプログラム、私のPCでは問題なく動きますが、他のPCで試すと音声認識結果が表示ません。その時は
for(int j=0; j<4096; j++){
if(buffer[j]==’.’ ) {buffer[j+1]=’\0′; break;}
}
を
buffer[300]=’\0′;
だけにすると、とりあえず動きます。理由は、分かりません。分かったら教えてください。
(11/2記:完成版は2012/11/2にアップしました)
===
味気ない技術情報ですみません。卒研が少し追い込まれているもので。
昨日朝、カーテンを開けたらブラキオサウルスが遊びに来ていてビックリしました。
実物は例によって、もっと大きく見えます。