凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Juliusを途中で終了させる

はじめに

Julius は j_recognize_stream を実行するとぐるぐるとループに入ってしまって処理が戻って来ません。なので普通に実行してしまうと Ctrl + C で終了させなければならなくなります。しかし Boost.Thread を使ってマルチスレッドで実行すればそんなことも解決します。
本内容は、rtiさん作成の Julius-Plus を参考にしています(というかまんま)。

コード

前々回のコードの当該部を下記のように修正します。

// Recognition loop
boost::thread thr([&]() {
	int ret = j_recognize_stream(recog);
	if (ret == -1) return -1;
});

// Exit if Enter key pressed
std::string line;
getline(std::cin, line);

j_close_stream(recog);
thr.join();
j_recog_free(recog);

これで Enter キーを押下すれば終了します。
…がセグフォって落ちます。
対症療法的には、rti さんが対策されているように、

recog->jconf = NULL;
j_recog_free(recog);

とすればOKです(中身解放してないですが。。)。
どこが原因か調べてみたのですが、全体のパラメータ構造体を開放してくれる j_jconf_free 内の opt_release あたりが怪しいんじゃないかなー…、くらいしかわかりませんでした。
誰か分かる人いらっしゃいましたらお助け下さい。