- ベストアンサー
音声認識エンジンJuliusの認識結果出力に関して
- 音声認識エンジンJuliusの認識結果をcsvファイルに出力し、ロボットの動きと連動させる開発を行っています。
- Juliusの認識結果によって動きを変化させるため、認識した言葉に対応するファイルにのみ「1」を返す処理を行っています。
- しかし、ポインタの型変換を行っても出力結果が「0」になってしまいます。エラーの原因と解決策を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
比較が上手くいかないのは、文字列型と数値型の比較をしているからです。 直すならば、 if (atoi(winfo->woutput[seq[i]]) == 1) のようにするか、辞書の変更をやめて if (strcmp(winfo->woutput[seq[i]], "おはよう") != 0) のようにするといいでしょう。 しかし、このように単語と数値を対応させるプログラムを作るというのは、対応に追加や変更があったときに、変換プログラムと Excel のマクロの両方を変更しなければいけないので、あまり上手い方法ではないです。 シーケンス制御は Excel のマクロでやるのならば、単語と動作の対応付けはマクロの中だけでやってしまうべきです。それならばこんな余計なことで悩む必要はありません。
その他の回答 (2)
- myuki1232
- ベストアンサー率57% (97/170)
Julius について軽く調べてきましたが、 winfo->woutput[seq[i]] には例で言うところの「おはよう」や「こんにちは」が入っているのではありませんか? だとすれば、それらの単語に対してどういう数値を割り当てるかを、自分で書かなくてはなりません。 あるいは、詳しく書かれていないので不明ですが、それらの処理は Excel のマクロ上でやってしまえば、いくつも csv ファイルを用意しなくても可能でしょう。
補足
説明不足で申し訳ないです。 おっしゃるとおりです。 winfo->woutput[seq[i]] はJuliusの単語辞書とリンクしていて デフォルトだと「おはよう」や「こんにちは」と出力されるのですが、 if文で場合分けしたいので文字列のままだと扱えないと考え 単語辞書の該当箇所を数値に変更させました。 マクロをあまりよく理解していないので調べてみます。 よろしければ、if(winfo->woutput[seq[i]] == 1)のように 数値によって場合分けする処理がなぜうまくいかないか教えていただけますか。
- myuki1232
- ベストアンサー率57% (97/170)
数値と文字列とファイルの違いを憶えて下さい。 あなたのプログラムの、変数 csv はファイルポインタ型であるべきです。 プログラム中の file1.csv というファイル名は csv1.csv とは違うのでしょうか? 以下、同じものとして書きます。 動作的には、 file.csv への出力と csv*.csv への出力をひとつのプログラムでやるならば、ファイルの読み込みと文字列の変換は不要です。winfo->woutput[seq[i]] (か何か)をそのまま使って出力すればいいです。
補足
ご指摘ありがとうございます。 file.csvとcsv1.csvは同一のものでした。 書き間違えていました。 すみません。 if(winfo->woutput[seq[i]] == 1){ fprintf(csv1, "1"); fprintf(csv2, "0"); … }else if(winfo->woutput[seq[i]] == 2){ … といったかんじで条件文をつくり winfo->woutput[seq[i]] の値によって場合分けしたいのですが、 if(winfo->woutput[seq[i]] = 1)の条件だとビルドはできても file1.csvやfile2.csvには何も出力されないです。 なので、一度file.csvファイルを読み込んで型変換が必要なのかなと思っていたのですが、 的外れなことをしていたのでしょうか?
お礼
丁寧なご回答ありがとうございます。 おかげで無事に課題をクリアできました。 マクロとの兼ね合いも考えましたが とりあえず今はこのプログラムでいこうと思います。 ありがとうございました。