2010年6月30日水曜日

StreamSR : 学習とは

ここでいう学習とは、写像 f:X→Y (X : ビーム幅 , Y : スループット)
を推定することである。

認識処理はビーム幅に対する線形時間+固定時間で行うことができる(と思われる): Ax+B
すなわち、ビーム幅に対するスループットは 1/(Ax+B) で表され、目的はこのAとBの値を推定することになる。

StreamSR : TCPポートメモ

sa07:6270..6279 : 認識音声入力の 0 ~ 9 番
sa07:62710..62799 : 認識音声入力の 10 ~ 99 番
sa07:6280 : ビーム幅セット入力
sa07:6281 : 学習音声入力(予定)

認識音声入力のポート番号について
spade上で "stcp://sa07.sc.cs.titech.ac.jp:627@i/"
というURIで入力源を指定しているため、 @i の桁数が変わるとポート番号が飛ぶようになっている。

pythonのように "stcp://sa07.sc.cs.titech.ac.jp:%d/" % (50300 + @i)
などのように実装できればこういう問題は起こらないのだが……

DONE & TODO

DONE:
・入力(認識音声、ビーム幅セット)をTCP経由で行えるように変更
・TCP送信スクリプトも実装
→ 入力データレートを可変にできるようになった
・UDOP_SpeechDecoderにビーム幅変更機構を実装

TODO 学習関連:
・入力(学習音声)の実装
・学習時の入力のデータ区間の設定
→ Punctuate用の特別なユーザIDを設定するなど
→ これにより、学習入力データレートを計測
・を計測する機能の実装
・「ビーム幅とスループットのペアを記録」「スループットを入力、ビーム幅を出力」するUDOPの実装

2010年6月25日金曜日

Julius : システム立ち上げ後にビーム幅を変更

(2010-06-30 free_nodes を fsbeam_free に修正、動作検証)

int specified = tuple.get_beam();
for ( FSBeam *r = m_recog->process_list; r; r = r->next ) {
fsbeam_free(&(r->pass1));
r->config->pass1.specified_trellis_beam_width = specified;
r->trellis_beam_width = set_beam_width(r->wchmm, specified);
}


ビーム幅が動くことを確認

コーパス

素直に古井研に借りましょう

Stream SR の拡張性に関する疑問

現在の方針で、ビーム幅の実行時動的変化機構の実装を進めても、これが研究のcontributionに繋がるとは考えにくい。

この機構でできることは
・学習データを用いた最適なビーム幅の設定
・認識負荷増大時、ビーム幅を落とす
などである。
このうち前者は普通、認識実行中に並列して行うということはなく、
システム立ち上げ後、認識実行前にあらかじめ行っておく、という使い方が想定されるが、
これはシステム立ち上げ前に「静的に」利用者がビーム幅を設定するのと大差がない。
利用者側で学習データと簡単なスクリプトを用意して
認識精度(Acc,Cor,Sub,Ins,Del)、実行時間(RTF)を調べて、適切な値を設定してもらえばよいだけの話である。

査読付き論文に通すからには、もう少しcontributionの明確な研究を行うべきだと思うし、
それができないなら無理に論文を通すべきとも思えない。

Julius : ビーム幅動的変更できない?

or 動的変更をするためには、Julius のソースコード自体を変更しないといけない

根拠 :
Juliusにおける初期化(or最初の認識を実行?)後、
ビーム幅(Recog.trellis_beam_width)の値を変更しても
ノードの再確保(malloc_nodes)が実行されない

get_back_trellis_initを呼び出しなおしても、nodes_mallocedがTRUEとなっているため
malloc_nodesが呼び出されない。

(その他、確認できていないところで関連するパラメータの再設定が行われない可能性も。未確認)

参照 :
beam.c:1834: malloc_nodes(d, wchmm->n, r->trellis_beam_width * 2 + wchmm->startnum);
<- pass1.c:234: if (get_back_trellis_init(mfcc->param, p) == FALSE) {
in pass1.c:112:decode_proceed(Recog *recog)