JuliusLib

導入

JuliusLibのソースは、パッケージ julius - Julius - OSDNからダウンロードできるソースの、julius-*.*.*\libjulius\にあります。

ディクテーション実行キットのモデルを利用する場合はjconfの-charconvオプションを削除しないと、「ERROR: m_options: wrong argument: "-charconv"」として実行に失敗します。このオプションはjuliusアプリケーションのもので、必要ならば実装する必要があります。

Visual C++でのコンパイル

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()で指定されている場所にあるログを確認します。