はじめに
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 あたりが怪しいんじゃないかなー…、くらいしかわかりませんでした。
誰か分かる人いらっしゃいましたらお助け下さい。