音声認識エンジンJuliusの認識結果出力に関して
現在、大学で音声認識とロボットとの連動における開発を行っています。
認識した言葉によってロボットの動きを変化させようと試みています。
具体的に、連動部分についてですが、以下の手順を理想としています。
Julius起動
↓
認識結果をcsvもしくはtxtファイルに出力
(ex:file.csvに「おはよう」を認識したら「1」、「こんにちは」を認識したら「2」を出力させる)
↓
認識した言葉によってそれぞれcsvファイルに0/1を返す
(ex:file.csvが「1」のときcsv1.csvに「1」・csv2.csv~csv10.csvに「0」を返す
同様にfile.csvが「2」のときcsv2.csvに「1」・csv1.csv,csv3.csv~csv.10.csvに「0」を返す)
↓
Excelのマクロを使ってロボットのシーケンス制御と連動
連動の関係でcsvファイルへの出力が必要であり、
ロボットの動きと1対1対応をさせたいため、それぞれの単語用にcsvファイルを用意し
それぞれ認識した単語に対応するファイルのみに「1」を返したいと思っています。
Juliusの認識結果を最初のfile.csvに「1」や「2」を出力することはできたのですが、
その後if文で場合分けをしようにもエラーがでてしまいます。
おそらく文字列の「1」や「2」だからC言語でエラーになるのかと推測します。
そこでポインタの型変換を試みたのですが、
最終的な出力結果はなぜか「0」になってしまいます。
csvの出力結果によって場合分けを行い指定の数字を出力させるには
どうしたらよいでしょうか?
ちなみに開発環境はWindowsXPです。
JuliusはMicrosoftVisualC++2008でビルドし、
コマンドプロンプトで認識エンジンを起動しています。
最後にJuliusに認識結果の出力に関するプログラムと
自身で追記したプログラムを載せるので参考にしていただければと思います。
C言語はまだ始めたばかりで初心者なので
何かご存知の方いらっしゃいましたらアドバイスお願いいたします。
julius/output_stdout.c
static void
//ttyout_pass2(NODE *hypo, int rank, Recog *recog)
result_pass2(Recog *recog, void *dummy)
{
int i, j;
int len;
char ec[5] = {0x1b, '[', '1', 'm', 0};
WORD_INFO *winfo;
WORD_ID *seq;
int seqnum;
int n, num;
Sentence *s;
RecogProcess *r;
boolean multi;
HMM_Logical *p;
SentenceAlign *align;
int c;
int *csv;
FILE *csv1;
FILE *csv2;
<省略>
/* output all confirmed words */
for(i=0;i<confwordnum;i++) {
if (len + strlen(winfo->woutput[confword[i]]) > SPTEXTWIDTH) {
for(j=len;j<writelen;j++) printf(" ");
printf("\n");
for(j=i;j<confwordnum;j++) confword[j-i] = confword[j];
confwordnum -= i;
len = 0;
i = 0;
writelen = 0;
}
<省略>
csv = fopen("file.csv", "w+");
csv1 = fopen("file1.csv", "w");
csv2 = fopen("file2.csv", "w");
if(csv1 == NULL){
printf("failed to open csv1 file\n");
}else {
printf("succeed to open csv1 file\n");
}
if(csv2 == NULL){
printf("failed to open csv2 file\n");
}else {
printf("succeed to open csv2 file\n");
}
for (i=0;i<seqnum;i++) {
fprintf(csv, "%s\0", winfo->woutput[seq[i]]);
/*文字列からint型(整数型)への変換と出力*/
c = atoi(csv);
printf("%d\n", c); //出力結果:0\n0\n0\n0\n
fprintf(csv1, "%d", c); //出力結果:0
}
fclose(csv);
fclose(csv1);
fclose(csv2);
<省略>
お礼
補足
ボイスレコーダーの音声データではなく、音声認識の文字出力先を知りたいです。