#include <julius/julius.h>
#include <pthread.h>
マクロ定義 | |
#define | TMP_FIX_200602 |
Define this if you want to output a debug message for threading | |
関数 | |
void | adin_setup_param (ADIn *adin, Jconf *jconf) |
音声切り出し用各種パラメータをセット | |
static void | adin_purge (ADIn *a, int from) |
テンポラリバッファにある処理されたサンプルをパージする. | |
static int | adin_cut (int(*ad_process)(SP16 *, int, Recog *), int(*ad_check)(Recog *), Recog *recog) |
音声入力と音検出を行うメイン関数 | |
static int | adin_store_buffer (SP16 *now, int len, Recog *recog) |
A/D-in スレッドにてトリガした入力サンプルを保存するコールバック. | |
static void | adin_thread_input_main (void *dummy) |
A/D-in スレッドのメイン関数. | |
boolean | adin_thread_create (Recog *recog) |
バッファを初期化して A/D-in スレッドを開始する. | |
static int | adin_thread_process (int(*ad_process)(SP16 *, int, Recog *), int(*ad_check)(Recog *), Recog *recog) |
スレッドモード用メイン関数 | |
int | adin_go (int(*ad_process)(SP16 *, int, Recog *), int(*ad_check)(Recog *), Recog *recog) |
入力処理を行うトップ関数 | |
boolean | adin_standby (ADIn *a, int freq, void *arg) |
デバイス依存の初期化関数を呼び出す. | |
boolean | adin_begin (ADIn *a) |
音の取り込みを開始するデバイス依存の関数を呼び出す. | |
boolean | adin_end (ADIn *a) |
音の取り込みを終了するデバイス依存の関数を呼び出す. | |
void | adin_free_param (Recog *recog) |
音取り込み用ワークエリアのメモリを開放する. |
音声入力デバイスからの音声データの取り込み,および 音の存在する区間の検出を行ないます.
有音区間の検出は,振幅レベルと零交差数を用いて行ないます. 入力断片ごとに,レベルしきい値を越える振幅について零交差数をカウントし, それが指定した数以上になれば,音の区間開始検出として 取り込みを開始します. 取り込み中に零交差数が指定数以下になれば, 取り込みを停止します. 実際には頑健に切り出しを行なうため,開始部と 停止部の前後にマージンを持たせて切り出します.
また,オプション指定 (-zmean)により DC offset の除去をここで行ないます. offset は最初の ZMEANSAMPLES 個のサンプルの平均から計算されます.
音声データの取り込みと並行して入力音声の処理を行ないます. このため, 取り込んだ音声データはその取り込み単位(live入力では一定時間,音声ファイル ではバッファサイズ)ごとに,それらを引数としてコールバック関数が呼ばれます. このコールバック関数としてデータの保存や特徴量抽出, (フレーム同期の)認識処理を進める関数を指定します.
マイク入力や NetAudio 入力などの Live 入力では, コールバック内の処理が重く処理が入力の速度に追い付かないと, デバイスのバッファが溢れ,入力断片がロストする場合があります. このエラーを防ぐため,実行環境で pthread が使用可能である場合, 音声取り込み・区間検出部は本体と独立したスレッドで動作します. この場合,このスレッドは本スレッドとバッファ speech を介して 以下のように協調動作します.
adin-cut.c で定義されています。
#define TMP_FIX_200602 |
Define this if you want to output a debug message for threading
Enable some fixes relating adinnet+module
adin-cut.c の 116 行で定義されています。
音声切り出し用各種パラメータをセット
設定を元に切り出し用のパラメータを計算し,ワークエリアにセットします.
adin | [in] AD-in work area | |
jconf | [in] configuration data |
adin-cut.c の 138 行で定義されています。
参照元 adin_setup_all().
static void adin_purge | ( | ADIn * | a, | |
int | from | |||
) | [static] |
テンポラリバッファにある処理されたサンプルをパージする.
a | [in] AD-in work area | |
from | [in] Purge samples in range [0..from-1]. |
adin-cut.c の 209 行で定義されています。
参照元 adin_cut().
static int adin_cut | ( | int(*)(SP16 *, int, Recog *) | ad_process, | |
int(*)(Recog *) | ad_check, | |||
Recog * | recog | |||
) | [static] |
音声入力と音検出を行うメイン関数
ここでは音声入力の取り込み,音区間の開始・終了の検出を行います.
スレッドモード時,この関数は独立したAD-inスレッドとしてデタッチされます. (adin_thread_create()), 音入力を検知するとこの関数はワークエリア内の speech[] にトリガしたサンプルを記録し,かつ transfer_online を TRUE に セットします. Julius のメイン処理スレッド (adin_go()) は adin_thread_process() に移行し,そこで transfer_online 時に speech[] を 参照しながら認識処理を行います.
非スレッドモード時は,メイン処理関数 adin_go() は直接この関数を呼び, 認識処理はこの内部で直接行われます.
スレッドモードはマイク入力など,入力が無限で処理の遅延がデータの 取りこぼしを招くような live input で用いられます. 一方,ファイル入力 やadinnet 入力のような buffered input では非スレッドモードが用いられます.
引数の ad_process は,取り込んだサンプルに対して処理を行う関数を 指定します. リアルタイム認識を行う場合は,ここに第1パスの認識処理を 行う関数が指定されます. 返り値が 1 であれば,入力をここで区切ります. -1 であればエラー終了します.
引数の ad_check は一定処理ごとに繰り返し呼ばれる関数を指定します. この 関数の返り値が 0 以下だった場合,入力を即時中断して関数を終了します.
ad_process | [in] function to process triggerted input. | |
ad_check | [in] function to be called periodically. | |
recog | [in] engine instance |
adin-cut.c の 290 行で定義されています。
A/D-in スレッドにてトリガした入力サンプルを保存するコールバック.
now | [in] triggered fragment | |
len | [in] length of above | |
recog | [in] engine instance |
adin-cut.c の 900 行で定義されています。
参照元 adin_cut().
static void adin_thread_input_main | ( | void * | dummy | ) | [static] |
A/D-in スレッドのメイン関数.
dummy | [in] a dummy data, not used. |
adin-cut.c の 934 行で定義されています。
参照元 adin_thread_create().
boolean adin_thread_create | ( | Recog * | recog | ) |
バッファを初期化して A/D-in スレッドを開始する.
recog | [in] engine instance |
< Thread information
adin-cut.c の 956 行で定義されています。
参照元 j_adin_init(), と j_adin_init_user().
static int adin_thread_process | ( | int(*)(SP16 *, int, Recog *) | ad_process, | |
int(*)(Recog *) | ad_check, | |||
Recog * | recog | |||
) | [static] |
スレッドモード用メイン関数
この関数は A/D-in スレッドによってサンプルが保存されるのを待ち, 保存されたサンプルを順次処理していきます. 引数や返り値は adin_cut() と 同一です.
ad_process | [in] function to process triggerted input. | |
ad_check | [in] function to be called periodically. | |
recog | [in] engine instance |
adin-cut.c の 1015 行で定義されています。
入力処理を行うトップ関数
スレッドモードでは,この関数は adin_thead_process() を呼び出し, 非スレッドモードでは adin_cut() を直接呼び出す. 引数や返り値は adin_cut() と同一である.
ad_process | [in] function to process triggerted input. | |
ad_check | [in] function to be called periodically. | |
recog | [in] engine instance |
adin-cut.c の 1185 行で定義されています。
boolean adin_standby | ( | ADIn * | a, | |
int | freq, | |||
void * | arg | |||
) |
デバイス依存の初期化関数を呼び出す.
a | [in] A/D-in work area | |
freq | [in] sampling frequency | |
arg | [in] device-dependent argument |
adin-cut.c の 1214 行で定義されています。
参照元 adin_setup_all().
boolean adin_begin | ( | ADIn * | a | ) |
音の取り込みを開始するデバイス依存の関数を呼び出す.
a | [in] A/D-in work area |
adin-cut.c の 1237 行で定義されています。
boolean adin_end | ( | ADIn * | a | ) |
音の取り込みを終了するデバイス依存の関数を呼び出す.
a | [in] A/D-in work area |
adin-cut.c の 1259 行で定義されています。
void adin_free_param | ( | Recog * | recog | ) |
音取り込み用ワークエリアのメモリを開放する.
recog | [in] engine instance |
adin-cut.c の 1280 行で定義されています。
参照元 j_recog_free().