Julius 4.2
マクロ定義 | 関数 | 変数
plugin/adin_oss.c

オーディオ入力プラグインのひな形 [詳細]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "plugin_defs.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/soundcard.h>

ソースコードを見る。

マクロ定義

#define PLUGIN_TITLE   "A/D-in plugin for Julius"
 このプラグインファイルの説明文字列.
#define INPUT_OPT   "myadin"
 このプラグインを使用して音声入力を行う際に,Juliusの "-input" オプション に与えるべき文字列.

関数

int initialize ()
 読み込み時の初期化(任意)
int get_plugin_info (int opcode, char *buf, int buflen)
 プラグイン情報取得(必須)
void adin_get_optname (char *buf, int buflen)
 音声入力選択用のオプション文字列を返す(必須)
int adin_get_configuration (int opcode)
 入力の扱いに関するパラメータ設定を返す(必須)
boolean adin_standby (int sfreq, void *dummy)
 デバイスを初期化する(必須)
boolean adin_open (char *pathname)
 入力音声ストリームを開く(必須)
int adin_read (SP16 *buf, int sampnum)
 デバイスからサンプルを読み込む(必須)
boolean adin_close ()
 入力ストリームを閉じる(必須)
boolean adin_terminate ()
 中断要求用フック(任意)
boolean adin_pause ()
 停止要求用フック(任意)
boolean adin_resume ()
 認識再開要求用フック(任意)
char * adin_input_name ()
 入力ファイル・デバイス名を返す関数(任意)

変数

static int audio_fd
static int freq

説明

オーディオ入力プラグインのひな形

このファイルは,オーディオ入力プラグインを作成する際に定義すべきプ ラグイン関数について解説している.オーディオ入力プラグインは, Julius に新たな音声入力デバイスを追加する."-input" に新たな選択肢 が追加され,実行時に Julius に対してそれを指定することで,このプラ グイン経由で音声を取り込み認識することができる.

オーディオ入力プラグインで取り込むべきデータのフォーマットは 16bit で あること.さらに,サンプリングレートを adin_standby() 呼び出し時に 与えられるレートに合わせること.

Common functions that can be defined in any type of plugin:

A/D-in plugin functions:

Required:

Optional:

作者:
Akinobu Lee
日付:
Thu Aug 7 14:28:37 2008
Revision:
1.3

adin_oss.c で定義されています。


マクロ定義

#define PLUGIN_TITLE   "A/D-in plugin for Julius"

このプラグインファイルの説明文字列.

adin_oss.c76 行で定義されています。

参照元 get_plugin_info().


関数

int initialize ( )

読み込み時の初期化(任意)

起動時,Julius がこのプラグインを読み込む際に最初に呼ばれる. -1 を返すと,このプラグイン全体が読み込まれなくなる. 実行可能性のチェックに使える.

戻り値:
0 on success, -1 on failure.

adin_oss.c114 行で定義されています。

int get_plugin_info ( int  opcode,
char *  buf,
int  buflen 
)

プラグイン情報取得(必須)

このプラグインに関する情報を返す.与えられた opcode によって動作する.

  • 0 の場合,このプラグインファイルの名称を与えられたバッファに格納する

この関数は,Julius がこのプラグインを読み込んだ直後に呼ばれる.

引数:
opcode[in] 要求動作コード (現在 0 のみ実装)
buf[out] 値を格納するバッファ
buflen[in] buf の最大長
戻り値:
エラー時 -1, 成功時 0 を返す.エラーとして -1 を返した場合, このプラグイン全体は読み込まれない.

adin_oss.c156 行で定義されています。

void adin_get_optname ( char *  buf,
int  buflen 
)

音声入力選択用のオプション文字列を返す(必須)

このプラグインを入力として選択する際に,"-input" オプションで指定す べき文字列を格納して返す.返す文字は,システムにすでにあるものや, 他のプラグインが使用しているものと同じでないこと. (もし同じだった場合システム側が優先される)

この関数は,起動時のオプション解析時に何度か呼ばれる.

引数:
buf[out] 値を格納して返すバッファ
buflen[in] buf の最大長

adin_oss.c201 行で定義されています。

int adin_get_configuration ( int  opcode)

入力の扱いに関するパラメータ設定を返す(必須)

Julius がこの入力プラグインをどう扱うべきかについて,設定パラメータを 返す.与えられた以下の opcode ごとに,値を返す.

opcode = 0: リアルタイム認識を行うかどうかのデフォルト値

1 を返すと,Julius は入力に対して特徴抽出と認識処理を平行して行う リアルタイム認識を行う.0 の場合,いったん入力を終端(あるいは区切り) まで受け取ってから,特徴抽出を行い,その後認識を開始する. リアルタイム処理では,CMN やエネルギー平均など,発話全体を用いた 特徴量の正規化が近似される.

通常,マイク入力などリアルタイムな結果が欲しい場合は 1, ファイル入力などオフライン認識の場合は 0 を返すことが多い.

なお,ここの値は,この入力が規定するデフォルト値であり, Juliusの実行時オプション "-realtime", "-norealtime" でも変更できる. オプションが指定された場合はその指定が優先される.

opcode = 1: 無音区間検出による入力区切りのデフォルト値

Julius は入力音声に対して振幅と零交差による入力判定を行い,振幅が一 定レベル以下の部分をスキップし,そこで区切って入力とすることができ る.この無音での自動区切りのデフォルトを,返値 1 で有効, 0 で無効 とできる.

通常,マイクなどの直接入力では 1,1発話ごとの音声ファイルでは 0 を 返すことが多い.

なお,ここの値は,この入力が規定するデフォルト値であり, Juliusの実行時オプション "-cutsilence", "-nocutsilence" でも変更できる. オプションが指定された場合はその指定が優先される.

opcode = 2: 音声入力をスレッド化するかのデフォルト値

音声入力取り込み部を別スレッドにするかどうかを選択する. 音声認識の速度が遅く,音声データの取りこぼしが発生する場合に有効である. ただし,現在のJuliusでは,EOF による認識終了を正しく扱えないので, マイク入力などの入力長が有限でない入力についてのみスレッド化を有効に すべきである.

通常,マイク UDP などでは 1 にし,ファイルや TCP/IP ソケットでは 0 にする.

引数:
opcode[in] 要求動作コード (現在 0 のみ実装)
戻り値:
opcode ごとに要求された値を返す.

adin_oss.c311 行で定義されています。

boolean adin_standby ( int  sfreq,
void *  dummy 
)

デバイスを初期化する(必須)

この関数は起動時に一回だけ呼ばれる.ここではデバイスのチェックや ソケットの用意といった,音声入力のための準備を行うのに使う.

FALSE を返した場合,Julius は終了する.

JuliusLib: この関数は j_adin_init() で呼ばれる.

引数:
sfreq[in] サンプリングレート
dummy[in] ダミーデータ(未使用)
戻り値:
成功時 TRUE,失敗時 FALSE を返す.

adin_oss.c406 行で定義されています。

boolean adin_open ( char *  pathname)

入力音声ストリームを開く(必須)

入力音声ストリームを新規に開く.通常,デバイスやファイルのオープン, ネットワーククライアントからの接続などをここで行う.

FALSE を返したとき,Julius は認識ループを抜ける.

JuliusLib: この関数は j_open_stream() 内で呼ばれる.

引数:
pathname[in] 開くファイルあるいはデバイス名,NULL ならデフォルト
戻り値:
成功時 TRUE,失敗時 FALSE を返す.

adin_oss.c445 行で定義されています。

int adin_read ( SP16 buf,
int  sampnum 
)

デバイスからサンプルを読み込む(必須)

この関数は入力ストリームから音声サンプルを読み込む.

バッファに格納して返す音声データの形式は 16bit, 1 チャンネルであること.

sampnumbuf に格納することのできる最大のサンプル数である. 返り値として,実際に読み込まれたサンプル数,あるいは以下で説明する エラーコードを返す.

この関数は認識中に何度も呼ばれ,ここで読まれたデータが Julius によっ て 認識処理される.読み込んだ分の処理が終了すると,次の入力を読み込 むためにこの関数が再度呼ばれる.

この関数内での I/O blocking については以下の注意が必要である:

  • 長時間のブロックは避けること(sampnum は要求サンプル数ではな くbuf に格納可能な最大数である).この関数内でブロックすると認 識処理全体がブロックする.読み込みが長時間ブロックしないよう,数百 サンプル程度だけ読み込んで返すか,あるいは最初にバッファ内にあるブ ロックせずに読み込み可能なデータサンプル数を取得し,その分だけ読み 込むようにするのがよい.
  • non-blocking モードを用いる場合, 0 を返さないこと. バッファにデータが存在しないとき,0 を返すと Julius はサンプル 無しのためまた即座にこの関数を呼び出す.これがビジーウェイトを 発生させ,CPUロードがあがってしまう.バッファにデータが無いとき, 即座に 0 を返さず,数十msec でよいのでこの関数内で待つ ことが望ましい.

返り値は,実際に読み込んだサンプル数を正の値として返すか,あるいは ADIN_EOF, ADIN_SEGMENT, ADIN_ERROR のどれかを返す.ADIN_EOF はスト リームが終端まで達したことを表す,これを返すと,Julius は現在の認識 処理を終了させ,ストリームを閉じる.ADIN_ERROR はこの関数内で深刻な エラーが生じた場合に返す.これが返された場合,Julius はその場で異常 終了する.

ADIN_SEGMENT を返すことで,Julius に現在の認識を現時点で区切ること を要求することができる.現在の認識処理はこの時点でいったん区切られ, そこまでの認識結果が確定・出力されたあと,次の認識処理が始まりこの 関数が呼ばれる.ADIN_SEGMENT は ADIN_EOF と動作が似ているが, ADIN_EOF が adin_close(), adin_open() を呼んでストリームを終了させ るのに対して,ADIN_SEGMENT はこれらを呼ばずに入力を続行する.この機 能は,たとえばネットワーク経由で音声データを受信しているときに,送 信側から音声認識のON/OFFやVADをコントロールしたい場合などに 使うことができる.

引数:
buf[out] 得られたサンプルを格納するバッファ
sampnum[in] buf 内に格納できる最大サンプル数
戻り値:
実際に読み込まれたサンプル数,あるいは end of stream 時に ADIN_EOF, Julius に区切り要求を出すときには ADIN_SEGMENT, エラー時はADIN_ERROR を 返す.

adin_oss.c588 行で定義されています。

boolean adin_close ( )

入力ストリームを閉じる(必須)

現在のストリームを閉じる.この関数は,入力ストリームが終端(EOF) に達したとき(すなわち adin_read() が ADIN_EOF を返したとき)に 呼ばれる.デバイスを閉じる,ファイルを閉じる,あるいはネットワーク接続を 切断するのに使うことができる.

正常終了としてTRUEを返したとき,Julius は adin_open() に戻って 他のストリームを開こうとする. FALSE を返したときは,Julius は 認識ループを抜ける.

JuliusLib: この関数は j_recognize_stream() の最後で呼ばれる.

戻り値:
成功時 TRUE,失敗時 FALSE を返す.

adin_oss.c648 行で定義されています。

boolean adin_terminate ( )

中断要求用フック(任意)

この関数を定義すると,Julius は中断要求を受け取った際にこの関数を呼び出す. これを使って,Julius の中断・再開と同期した入力同期処理を実装することが できる.(例:入力送信元に対して送信中断要求を出すなど)

中断要求は,Julius がアプリケーションやクライアントより受け取る 認識中断の要求である.具体的には,Julius がモジュールモードで動作して いる時に TERMINATE コマンドをクライアントから受け取ったときや, JuliusLibを組み込んだアプリケーションが j_request_terminate() を 呼んだときに発生する.

中断要求を受け取ると,Julius は現在の認識処理を中断する. 認識途中であった場合,その入力を破棄して即時中断する. 処理の再開は,RESUME コマンドか j_request_resume() の呼び出しで行われる.

この関数は中断要求を Julius が受け取った時点で呼ばれる. 実際に処理が中断した後で呼ばれるのではないことに注意されたい.

戻り値:
成功時 TRUE, エラー時 FALSE を返す.

adin_oss.c701 行で定義されています。

boolean adin_pause ( )

停止要求用フック(任意)

この関数を定義すると,Julius は停止要求を受け取った際にこの関数を呼び出す. これを使って,Julius の中断・再開と同期した入力同期処理を実装することが できる.(例:入力送信元に対して送信中断要求を出すなど)

停止要求は,Julius がアプリケーションやクライアントより受け取る, 認識の一時停止の要求である.具体的には,Julius がモジュールモードで動作して いる時に PAUSE コマンドをクライアントから受け取ったときや, JuliusLibを組み込んだアプリケーションが j_request_pause() を 呼んだときに発生する.

停止要求を受け取ると,Julius は現在の認識処理を中断する. 認識途中であった場合,その認識が終わるまで待ってから中断する. 処理の再開は,RESUME コマンドか j_request_resume() の呼び出しで行われる.

中断要求 (adin_terminate) との違いは,認識途中に要求を受けたときの動作が 異なる.中断要求では強制中断するが,停止要求ではその認識が終わるまで 待ってから停止する.

この関数は停止要求を Julius が受け取った時点で呼ばれる. 実際に処理が停止した後で呼ばれるのではないことに注意されたい.

戻り値:
成功時 TRUE, エラー時 FALSE を返す.

adin_oss.c757 行で定義されています。

boolean adin_resume ( )

認識再開要求用フック(任意)

この関数を定義すると,Julius は停止状態からの認識再開要求の際に この関数を呼び出す.

認識再開要求は,Julius がモジュールモードで動作して RESUME コマンドを クライアントから受け取ったときや,JuliusLibを組み込んだアプリケーション が j_request_resume() を呼んだときに発生する.この再開要求が発生 すると,Julius は停止していた認識を再開する.

注意:この関数は,実際に停止したときに呼ばれるのではなく,Julius が 要求を受け取った時点で,そのたびに呼ばれる.複数回呼ばれることや, すでに動作中である場合にさらにこのコマンドを受け取ったときにも呼ば れることがあることに注意されたい.

戻り値:
成功時 TRUE, エラー時 FALSE を返す.

adin_oss.c804 行で定義されています。

char* adin_input_name ( )

入力ファイル・デバイス名を返す関数(任意)

戻り値:
入力ファイルあるいはデバイス名の文字列へのポインタ

adin_oss.c826 行で定義されています。