JuliusLibのソースは、パッケージ julius - Julius - OSDNからダウンロードできるソースの、julius-*.*.*\libjulius\にあります。
ディクテーション実行キットのモデルを利用する場合はjconfの-charconvオプションを削除しないと、「ERROR: m_options: wrong argument: "-charconv"」として実行に失敗します。このオプションはjuliusアプリケーションのもので、必要ならば実装する必要があります。
Windowでは、julius-*.*.*\msvc\JuliusLib.slnにあるVisual Studioのソリューション ファイルからコンパイルできます。Windows - Microsoft Visual C++ - 第2章 インストール
ファイルを開いたときに「日本語 (シフト JIS) のエンコードでファイル *** を読み込む際に、いくつかのバイトが Unicode 文字に置換されています。ファイルを保存すると、元のファイル コンテンツが保持されません。」とエラーとなるときには、文字コードを変換します。
julius-simple/julius-simple.cに、JuliusLibの使用法のサンプルがあります。
#include <julius/juliuslib.h>
#define MAXBUFLEN 4096
static char outbuf[MAXBUFLEN];
int main()
{
char* jconffile = "sample.jconf";
// 全体のパラメータ構造体を新たに割り付ける
Jconf* jconf = j_jconf_new();
// jconfファイルからパラメータを読み込み、jconf内の各設定インスタンスに値を格納する
if (j_config_load_file(jconf, jconffile) == -1)
return -1;
// jconf設定パラメータを最終的に決定する
if (j_jconf_finalize(jconf) == FALSE)
return -1;
// エンジン インスタンスを、新たにメモリ割り付けする
Recog* recog = j_recog_new();
recog->jconf = jconf;
// 全てのモデルを読み込み認識の準備を行なう
if (j_load_all(recog, jconf) == FALSE)
return -1;
// 全てのロードされたモデルと設定からエンジン インスタンスを最終構成する
if (j_final_fusion(recog) == FALSE)
{
j_recog_free(recog);
return -1;
}
// 関数をコールバック レジストリに登録する
callback_add(recog, CALLBACK_RESULT, result_pass2, NULL);
// 設定で選択された A/D-in デバイスを初期化し認識の準備を行う
if (j_adin_init(recog) == FALSE)
return -1;
// 音声入力ストリームを開く
// (入力ソースはjconfの代わりに、この関数の第2引数でも指定できる)
if (j_open_stream(recog, NULL) < 0)
return -1;
// 入力ストリームの認識を行う
if (j_recognize_stream(recog) == -1)
return -1;
// エンジン インスタンスを開放する
j_recog_free(recog);
return 0;
}
// 第2パスの認識結果の出力
static void result_pass2(Recog* recog, void* dummy)
{
RecogProcess* recogProcess = recog->process_list;
WORD_ID* seq = recogProcess->result.sent->word;
int seqnum = recogProcess->result.sent->word_num;
WORD_INFO* winfo = recogProcess->lm->winfo;
if (seq != NULL)
{
for (int i = 0; i < seqnum; i++)
{
printf("%s", charconv(winfo->woutput[seq[i]]));
}
printf("\n");
}
}
// 文字コードの変換
char* charconv(char* instr)
{
unsigned int from_cp = 65001; // 変換前のコードページ
unsigned int to_cp = 932; // 変換後のコードページ
static wchar_t unibuf[MAXBUFLEN];
if (MultiByteToWideChar(from_cp, 0, instr, -1, unibuf, MAXBUFLEN) <= 0)
return instr;
if (WideCharToMultiByte(to_cp, 0, unibuf, -1, outbuf, MAXBUFLEN, NULL, NULL) <= 0)
return instr;
return outbuf;
}
jconfファイルの内容を文字列としてj_config_load_string()へ渡すこともできますが、これはコマンド引数を処理する関数のため、コメントを一切含めてはなりません。
JuliusLibを使用したアプリケーションが予期せず終了するときには、終了コードを確認します。そしてそれが1ならば、jlog_set_output()で指定されている場所にあるログを確認します。