Julius for Windows

目次


新着情報

[2003/8/25]
バージョン3.3p4_jl2-1のWindows版とLinux版をリリースしました.

はじめに

Juliusとは,大語彙連続音声認識システムです. 開発は,京都大学や奈良先端科学技術大学院大学などで行われています. Juliusの公式サイトは,大語彙連続音声認識システムJuliusです. このページでは,私,坂野が独自に作成したパッチや,パッケージを公開しています. 私は,主に,JuliusをWindowsに対応させたり,ライブラリ化する作業を行っています.

なお,ここで公開しているファイルは, UNIX版Juliusを使用したことのない方や,単に音声認識を試したいだけの方には, 使用するのは難しいと思われます. このような方には, JuliusのGUI版であるJulius GUIの方をお勧めします.


Windows版について

Julius Windows版(コマンドライン版)は,拙作の spAudio ライブラリを使用して,Juliusを Windows上で動作するようにしたものです. UNIX版 Juliusのほぼ完全な移植で(以下で説明するJuliuslibは使用していません), コマンドプロンプトやMS-DOSプロンプトなどのコマンドライン上で動作します. 使用方法はUNIX版と全く同じなため,UNIX版の使用方法を全く知らない方には,使用は難しいと思います. 良く質問がありますが,実行ファイル(.exeファイル)をダブルクリックしただけでは何も起きません.

なお,このコマンドライン版は,マイク以外の入力での動作確認はしていません.


Juliuslibについて

Juliuslibは,Juliusをライブラリ化したものです.比較的低レベルな制御が可能なことと, 容易に扱えることを目標に作りました.WindowsではDLLになっています. 現在のバージョンでは,ソースはコマンドライン版と共通になっています.

これまでJuliusを使ったアプリケーションを作るには,Juliusのmain関数を 解析して,それを改造していく,というやり方しかなかったわけですが, Juliuslibを用いれば,少ない関数だけでJuliusを使ったアプリケーションを作成することができます. また,できるだけ機種依存が少ないように,音声入力部分や スレッドに関する部分などは除いて実装していますので,様々な環境で 動作させることができると思われます(と言っても,現在のバージョンでは Juliusがコンパイルできる環境でないといけませんが).

京都大学の方ではSAPI化も進んでいるので,ライブラリ化にどれほど意味が あるのかは分かりませんが,個人的には,Windowsだけで動くアプリケーションには あまり興味がないので作ってみました. また,個人的な感想として,SAPIは簡単に扱えるとは言えないと思いますので, そういう意味では価値があるのではないでしょうか? また,SAPIを使用したアプリケーションでは,WindowsにSAPI関連のファイルがインストールされてないと動作しませんが, Juliuslibの場合は単体でも動作するという特徴もあります.

例として,コマンドライン版Juliusとほぼ同等の機能を持つ コマンドラインアプリケーションのソースを以下に示します. Juliusで始まる名前の関数がJuliuslibのものです. なお,ここでは,音声入力のためにオリジナルのJuliusに付属するライブラリlibsentを使っています.

#include <sent/speech.h>        /* for audio input functions and MAXSPEECHLEN */
#include <juliuslib.h>

boolean julius_cb(Julius Julius, JuliusCallbackReason call_reason,
                  char *string, void *call_data)
{
    switch (call_reason) {
      case JULIUS_CB_1PASS_STARTED:
        break;
        
      case JULIUS_CB_1PASS:
      case JULIUS_CB_1PASS_FINISHED:
        if (strlen(string) > 0) {
            printf("\r%s", string);
            fflush(stdout);
        }
        break;

      case JULIUS_CB_FINISHED:
        if (strlen(string) > 0) {
            printf("\n%s\n", string);
            fflush(stdout);
        }
        printf("\n");
        fflush(stdout);
        fprintf(stderr, "<<< please speak >>>\n");
        break;

      default:
        break;
    }

    return TRUE;
}

int main(int argc, char *argv[])
{
    int ret = 0;
    long offset;
    JuliusConfig config;
    Julius julius;
    short speech[MAXSPEECHLEN];
    long nread, nsent;
    
    JuliusInitConfig(&config);
    JuliusParseOptions(argc, argv, &config);
    
    if (adin_mic_standby() == FALSE) {
        fprintf(stderr, "mic device init failed\n");
        ret = 1;
    } else {
        if (adin_mic_start() == TRUE) {
            if ((julius = JuliusOpen(&config, julius_cb, NULL)) != NULL) {
                printf("\n");
                printf("\t******************************************************************\n");
                printf("\t* NOTICE: Please speak \"mic test\" (or any short term) at first,*\n");
                printf("\t*         and don't care about the result.                       *\n");
                printf("\t* see README.MIC for details.                                    *\n");
                printf("\t******************************************************************\n");
                printf("\n");
                fflush(stdout);
                fprintf(stderr, "<<< please speak >>>\n");

                offset = 0;
                for (;;) {
                    if (offset < MAXSPEECHLEN / 2) {
                        if ((nread = adin_mic_read(speech + offset, MAXSPEECHLEN - offset)) < 0) {
                            fprintf(stderr, "adin_mic_read error\n");
                            break;
                        }
                    } else {
                        nread = 0;
                    }
                    
                    if ((nsent = JuliusSend(julius, speech, offset + nread)) < 0) {
                        fprintf(stderr, "JuliusSend error\n");
                        break;
                    }

                    offset = offset + nread - nsent;
                    if (offset > 0) {
                        memmove(speech, speech + nsent, offset * sizeof(short));
                    }
                }
        
                JuliusClose(julius);
            } else {
                fprintf(stderr, "cannot open recognition engine\n");
                ret = 1;
            }
            adin_mic_stop();
        } else {
            fprintf(stderr, "cannot initialize mic device\n");
            ret = 1;
        }
    }
    
    return ret;
}

こんな感じで,比較的短いソースでJuliusを使ったアプリケーションを作ることができます. 使用方法などの詳しい説明は,アーカイブに含まれるドキュメントを御覧下さい.


GUI版について

もともとは,Juliuslibのテストとして作成しました. Juliusを手軽に試してみるためにも良いと思います. 拙作のマルチプラットホームライブラリ spAudiospComponentを使っているため,様々な環境で動作します. また,コマンドライン版の使い方が難しくて使用を断念した人にもGUI版をお勧めします.

リアルタイムに波形が表示されるため,マイクが正常に動作しているかの確認などはしやすいと思います. また,波形を切り出す閾値もリアルタイムで調節できます. Julius GUIの公式ページはこちらです.


更新履歴

現在のバージョンではコマンドライン版は,Juliuslibと共通のソースコードを使用しているため, Juliuslibの更新履歴のみを示しています.

Library Version 1.3.0 (3.3p4)
 * 認識エンジンクローズ時に誤ったmemsetをしていたバグを修正.
 * jconfファイルのパラメータの値を使っていないものがあったので追加.
 * 上の変更に伴いJuliusConfigにパラメータを追加.
 * 零交差のパラメータをconfigファイルの値を使用するようにした.
 * julianにも対応.

Library Version 1.2.0 (3.3p4)
 * エンジンを3.3ベースに(DLLは1.0とバイナリ互換です).
 * RealTimePipeLine (realtime-1stpass.c)のバグ修正.

Library Version 1.0.0 (3.1p2_sp4)
 * JuliusConfigのメンバを変更し,Juliusに関するほとんどのパラメータを制御可能に
   (これにより,0.9のDLLとの互換性がなくなりました).
 * アライメントに関する情報を得るコールバック(JULIUS_CB_ALIGN)とそれに関する関数を追加.
 * 複数の候補を得るためのコールバック(JULIUS_CB_CANDIDATE)とそれに関する関数を追加.
 * DLLのexportが変だったのを修正.
 * 第2パス終了後の入力音声バッファー内容が捨てられていたJuliusSendのバグを修正.

Library Version 0.9.0 (3.1p2_sp3)
 * ライブラリの最初のバージョン.

ダウンロード

コマンドライン版,ライブラリ

ここでは,コマンドライン版とライブラリのバイナリ及びソースがダウンロードできます. UNIX版Juliusを使用したことのない方や,単に音声認識を試したいだけという方には,これらのファイルではなく,Julius GUIの方をお勧めします.

データ 1

実行キットからデータファイルだけを取り出して,パッケージ化しました. ソースには実行キットそのものが含まれています.コマンドライン版をLinuxでRPMを用いて インストールする場合には先にインストールしておく必要があります. このデータは,言語モデルを新聞のデータベースから言語モデルを作成しているため,新聞に良く出てくる単語しか認識できません. コンピュータ関係の単語を認識させたい人は下のデータ 2をダウンロードして下さい.

データ 2(Webページなどから学習)

奈良先端大の西村竜一氏が配布しているデータを私がパッケージ化したものです. Webページなどに掲載されている文から学習した言語モデルを使用しているため, コンピュータ用語などが認識できるようになります. データ 1よりもさらにファイルサイズが大きくなっているので注意して下さい.

GUI版

Julius GUIのページからダウンロードして下さい.



counter since Jul 12 2001

Last modified: "2003-08-25 22:17:20 banno"

banno@itakura.nuee.nagoya-u.ac.jp