【LIVA】【Ubuntu server14.04】Juliusを使いたい(Juliusセッティング完了編)
~前回のあらすじ~
JuliusをセットアップしたらOSSとしてセットアップされたためにいろいろ頑張ったけどダメだったよ。
1.configureでALSAを指定してみる
そもそもOSSとしてではなくALSAで実行できればいいのではないかと、原点に立ち戻ります。Juliusのオンラインマニュアルを見ると「 --with-mictype=」で変更が可能の模様。
$ ./configure --with-mictype=alsa
(略)
configure: error: no ALSA header!
configure: error: ./configure failed for libsent
ダメでした・・・。
色々探ってみると、海外の掲示板にて同様の状態になっている書き込みを発見し、
「HAHAHA,俺もHPから落としたソースコードからconfigureしたらダメだったけど、CVSで落とした奴だったらうまくいったぜ!」
という書き込みを見かけたため、今度はCVSで落としてみました。
$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
$ ./configure --with-mictype=alsa
(略)
****************************************************************
Julius/Julian libsent library rev.4.3.1:- Audio I/O
primary mic device API : alsa (Advanced Linux Sound Architecture)
available mic device API : alsa
supported audio format : various formats by libsndfile ver.1
NetAudio support : no
- Language Modeling
class N-gram support : yes
- Libraries
file decompression by : zlib library
- Process management
fork on adinnet input : no
Note: compilation time flags are now stored in "libsent-config".
If you link this library, please add output of
"libsent-config --cflags" to CFLAGS and
"libsent-config --libs" to LIBS.
****************************************************************
うまくいきました!
というわけで、make後、juliusを実行してみます。
$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic
(略)
ALSA lib pcm_direct.c:998:(snd1_pcm_direct_initialize_slave) unable to install hw params
ALSA lib pcm_dsnoop.c:629:(snd_pcm_dsnoop_open) unable to initialize slave
Error: adin_alsa: cannot open PCM device "default" (Input/output error)
failed to begin input stream
エラー内容が変わりました。が、起動はせず・・・。
2.ALSADEVの設定
環境変数ALSADEVにハードウェアを設定しなければいけないらしく、もしかしたらそれが原因かと思い、設定します。
$ sudo arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: PCH [HDA Intel PCH], デバイス 0: ALC282 Analog [ALC282 Analog]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
arecord -lでALSAで認識しているデバイスが取得できます。
今回使用しているUSBマイクはカード0。LIVAでもともとあるオーディオ端子はカード1です。
USBマイクを環境変数ALSADEV設定するには
export ALSADEV="plughw:0,0"
と設定します。0,0はそれぞれ「カード番号,サブデバイス番号」を意味します。
で、実行した結果
Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Error: adin_alsa: cannot set PCM hardware parameters (Input/output error)
途中まではうまくいきましたが、やはりダメ・・・。
3.そしてJulius起動へ
エラー原因は結局わからず。しかし解決方法はわかりました。
USBマイクを外してもう一度接続します。
そうするとなぜかエラーが出ません。
しかし、一度Juliusを終了し、もう一度Julius起動すると同じエラーが出ます・・・謎。
$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic
(略)
Stat: capture audio at 16000Hz
Stat: adin_alsa: current latency time: 21 msec
Stat: adin_alsa: current latency (21ms) is shorter than 32ms, leave it
Stat: "default": Device [USB Audio Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>
Warning: strip: sample 0-340 is invalid, stripped
Warning: strip: sample 0-340 is invalid, stripped
Warning: strip: sample 0-340 is invalid, stripped(以下延々とWarningが発生)
念願の<<< please speak >>>がでました。
ただし、Warningが発生しているため、これを出ないように-nostripオプションを設定します。(Warningの原因は謎・・・)
【追記】
「MM-MCUSB22」というUSBマイクはマイク自体にミュートボタンが付いているのですが(会議用マイクだからね)、ミュート状態だとエラーが出るようです。ミュートを解除したらWarningが出なくなりました。
$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic -nostrip
(略)
Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:0,0": Device [USB Audio Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>
起動出来ました!
音声入力してみます。
※ 「こんにちは。今日はいい天気でした。」を言った場合。「今日はいい天気でした」は何回か発言しなおしてみたら以下のとおり。
pass1_best: 今日 は 、
sentence1: こんにちは 。
pass1_best: 今日 も あり 天気 でし た 。
sentence1: 今日 も いい 天気 でし た 。
pass1_best: 距離 的 でし た 。
sentence1: 今日 は いい 天気 でし た 。
「 距離 的 でし た 。」→「今日 は いい 天気 でし た 。」への文章解釈は驚愕ですが、結構認識してくれますね。