気の向くままに辿るIT/ICT
webzoit.net
ソフトウェア

Julius

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
フリーソフト・オープンソースを活用しよう。

Julius

Julius

2018/09/19

 32ビットOSサポートが怪しくなったJuliusを導入・検証するためだけに64ビットマシンながら32ビットOS(FreeBSD/Debian Stretch)を使い続けていた自身も、これとマルチブートする格好で64ビットOSのDebian Stretch amd64をインストールするに至りました。

 というわけで早速、LinuxにJuliusを導入していきます。

Juliusの使い方

 http://julius.osdn.jp/によるとJuliusとは、数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持つ音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンとのこと。

必要な開発環境

$ su -
...
# apt install libi2c-dev git-dev gcc make
# visudo
...
# exit
$

 インストールしたばかりでDebianがまっさらだったため、Juliusをインストールする前に、これらのインストールとsudoersファイルの編集・設定が必要でした。

Juliusのインストール

$ mkdir tmp/app
$ cd tmp/app
$ git clone https://github.com/julius-speech/julius
$ cd julius
$ ./configure
$ make

 Juliusをインストールするにあたり、まず、任意のtmp/appディレクトリを作って移動。

 手作業でダウンロード・展開しても良いですが、ここでは、git cloneしてJuliusを取得、./configure、make。

$ sudo make install

 ここでsudo make installとしてインストールしてもよいのですが、公式ドキュメントには、必ずしもインストール(make install)しなくても使えると書いてあった気がします。

 が、make installしておいたほうが、後が楽かと。

Julius関連キットのダウンロードと展開

$ mkdir julius-kits
$ cd julius-kits
$ git clone https://github.com/julius-speech/dictation-kit
$ git clone https://github.com/julius-speech/grammar-kit
$ git clone https://github.com/julius-speech/segmentation-kit

 Juliusを機能させるためには、外部キットが必要となり、これらをまとめて格納しておくべく、任意のjulius-kitsディレクトリを作成、移動します。

 冒頭のリンク先には次のキットがあるとあるので、これらを展開します(インストール不要)。

 気づかず展開したSpeech Segmentation Toolkit v4.3.1ですが、改めて見るとWindows onlyと書いてあるものの、後述の通り、ほんの少しの修正でLinuxでもサンプルの実行はできました。

 また、dictation-kitについては、git cloneせず、ダウンロード・展開するのが賢明かもしれません。

 git-lfsをインストールという話もありますが、後から入れたからか、その後、最初からやり直しても、自身にはできませんでした。

 当初、dictation-kitのみサンプル実行に失敗、一見ディレクトリ階層も普通に見えたものの、そうではなかったようでdictation-kit-v4.4.zipをダウンロード、julius-kitsディレクトリに展開し直したところ、あっさり、サンプル実行できました。

 リンク先も異なるため、これに起因する可能性も否めませんが...。

 更にJulius音声認識パッケージによれば、日本語自動口述筆記キットには、次のキットも追加になったようです。

 これらもリンク先からダウンロードしてjulius-kitsディレクトリに展開します。

 展開してみると.exeばかりなので、これらもWindows onlyかも?と思いつつ、やってみたら、後述のようにLinuxでも、ちゃんと機能しました。

 なお、いずれも、今日時点で最新のバージョンです。

マイクを使う準備

sudo modprobe snd-pcm-oss
sudo sh -c "echo snd-pcm-oss >> /etc/modules"

 https://alsa.opensrc.org/Snd-pcm-ossによれば、snd-pcm-oss moduleは、古いOSSのデバイス/dev/dspと/dev/audioをエミュレートするALSAのOSSエミュレート用カーネルモジュールであり、他のOSSデバイスは、snd-seq-ossとsnd-mixer-ossモジュールによってエミュレートされるとのこと。

 これを実行してマシンを再起動するとマイクが[/dev/dsp*]に割り当てられるようになりました。

 ALSAはOSSの置き換えを目的としたものである一方、仕組みが異なるので、これについては、ALSAがOSSエミュレーションすることで、いずれにしても/dev/audioや/dev/dspが使われると理解して良さげ。

$ sudo reboot

 というわけでUSBマイクを認識してもらうため、ここでパソコンを再起動する必要があります。

[追記:2018/09/24]

 今日、気づいたタイミングとしては、Arduino IDE 1.8.7を入れ、ユーザーを各種グループに追加、マシン再起動後、今日一度めとなるJuliusを実行してみると/dev/dsp*がなく、sudo modprobe -c | lessで確認してみるとカーネルモジュールsnd-pcm-ossがblaklist化されており、/etc/modprobe.d/osspd.confとしてこれが含まれ、再度、sudo modprobe snd-pcm-ossすることで有効になり、/dev/dsp*も現れるものの、以後もblacklistに入ってる模様で再起動する度に有効化する必要がありますが、恒久化させるにしてもブラックリストに入った原因によっては不安が残るところ...。

 Debianの気まぐれか?ここにきて、たまたま、不要と判断されたのか?はたまた、apt-update/apt-upgradeによって状況が変わったのか?それともArduino IDEの設定と何かが干渉したのか?Arduino IDE用にユーザーを追加したグループから改めて外して再起動してみるもblacklistに載ったまま...、一度載ると自動でwhitelist?化されないものなのか、それとも他に起因するのか...。

 とりあえず、blacklist対象となる/etc/modprobe.d/osspd.confをホームディレクトリ内に移動(mv)、退避して再起動したところ、whitelist化され、/dev/dsp*も表示され、更にArduino IDE用にユーザーをグループに追加し直して再起動したところ、何もせずとも/dev/dsp*は表示されているので、そのままにしてありますが...、原因はわからずじまい...。

USB接続マイクの確認と環境変数設定

$ lsusb
$ less /proc/asound/modules
$ ls /dev/dsp*
$ man julius
$ arecord -l
$ export ALSADEV="plughw:1,0"
$ export AUDIODEV=/dev/dsp1

 前述の設定後、パソコンを再起動したら、USBマイクが認識されるかをチェックし、必要な設定を行っていきます。

 ここでは、USB接続のマイク内蔵Webカメラを使用することにしました。

 まず、マイクをパソコンに接続します。

 接続したら、マイクとしては、あまり意味はありませんが、USB機器として認識されたことをlsusbで確認。

 続いて/proc/asound/modulesの中身を確認、そこに[snd_usb_audio]があれば、USB音響機器が認識されていると考えられます(左の数値は優先順)。

 ここでman juliusしてみるとJuliusが参照する環境変数についても書いてあります。

 前述の通り、LinuxのOSSやOSSエミュレーションを持つALSAにおいて音響機器は、デバイスとして/dev/audioや/dev/dspなどに割り当てられるようです。

 そこで[ls /dev/dsp*]してみると/dev/dsp、/dev/dsp1の2つあり、先のマイクは、後者でしょう。

 マイクをパソコンから外すと[ls /dev/dsp*]してみると/dev/dsp1はなく、/dev/dspのみとなる、[less /proc/asound/modules]の方も[snd_usb_audio]がなくなるので、これらはUSB接続の1つめのマイクであることがわかります。

 よって/dev/dsp1を環境変数AUDIODEVに設定し、とりあえず、exportしておきます。

 存在しない場合もある/etc/modprobe.d/alsa-base.confで優先順を変更する方法もあるらしいですが、Julius以外のことを考えるとJuliusが参照する環境変数AUDIODEVに利用しているマイクのデバイス名を設定しておく方がスマートである気がします。

 マイクをパソコンやラズパイに接続したら-lオプション付きでarecordコマンドを実行するとカード番号とデバイス番号と共にUSB接続したマイクが認識されているはずです(わかりにくければ、接続前と接続後のコマンド実行結果を比較してもよい)。

 そのカード番号とデバイス番号をJuliusが参照する環境変数ALSADEVにセットすべく、ダブルクォートでくくってplughw:1,0(arecordのオプション値と同様)を指定すればよいようなので、これを、とりあえず、exportしておきます。

 arecordコマンドは、ALSA用のコマンドであり、少なくとも最新のカーネルであれば、Linuxには標準で入っています。

 尚、頻繁に使うようなら、AUDIODEVやALSADEVのexportは、~/.profileや~/.bashrcなど適切な環境設定ファイルに追記しておけば、都度、exportする手間がなく、よいでしょう。

grammar-kitのサンプル実行

$ cd grammar-kit/SampleGrammars/fruit
$ julius -C testmic.jconf -nostrip -charconv SJIS UTF-8
...
<<< please speak >>>
...

 ここまでの設定でfruitに限らず、grammar-kitのサンプルを使うことができました。

 感動を覚えるほど、ちゃんと認識してくれますが、感度が良すぎるのか、よほど静かな場所でしゃべらないと雑音も拾ってしまう模様。

 なお、Test.shも用意されていますが、Juliusをインストールしないで使う場合を想定してか、bin/linux/juliusを使っており、julius含め、そこにあるファイルは、ことごとく実行権限がないため、shなどを前置するか、実行権限を付与するか、そうでなければ、make installの結果、特に設定しなければデフォルトでインストールされる/usr/local/bin/juliusを使う必要があります。

segmentation-kitのサンプル実行

$ cd ../../../segmentation-kit
$ perl ./segment_julius.pl
./wav/sample.wav
enter filename->.....enter filename->1 files processed
Result saved in "./wav/sample.lab".
$

 また、segmentation-kitのサンプルも実行可能です。

$ less wav/sample.lab
0.0000000 0.2425000 silB
0.2425000 0.3325000 ky
0.3325000 0.5725000 o:
0.5725000 0.6925000 w
0.6925000 0.7725000 a
0.7725000 0.8925000 i
0.8925000 0.9925000 i
0.9925000 1.0825000 t
1.0825000 1.1825000 e
1.1825000 1.2825000 N
1.2825000 1.4025000 k
1.4025000 1.4525000 i
1.4525000 1.5125000 d
1.5125000 1.6125000 a
1.6125000 2.0525000 silE
wav/sample.lab (END)

 segmentation-kitは、wavディレクトリに同名の.wavファイルと.txtファイルを配置、前者は音声データ、後者は、音声をひらがな表記したものとしUTF-8で保存したもので、segment_julius.plを実行するとwavディレクトリ内にそれらファイルと同名の.labファイルが保存され、中身には、分割した語句が書かれるとのこと。

$ less segment_julius.pl
...
## julius executable
if ($^O =~ /MSWin/){
  $juliusbin=".\\bin\\julius-4.3.1.exe";
} else {
#  $juliusbin="./bin/julius-4.3.1";
  $juliusbin="/usr/local/bin/julius";
}
...
$

 ただし、Linuxで使う場合、segment_julius.plの49行めのelse文の実行ファイルを修正する必要がありました。

 当該パス上にWindows用のjulius-4.3.1.exeはあるものの、Linux用の実行ファイルjulius-4.3.1(juliusも)が存在しないため。

 自身は、冒頭でJuliusをmake install(パスはデフォルト)したため、/usr/local/bin/juliusを使うことにしました。

 って気づいてみれば(https://github.com/julius-speech/segmentation-kitページを見ると)、Speech Segmentation Toolkit v4.3.1は、Windows onlyと書いてありました。

 もしかして、結果が違う?ここでは、区切られた語句が縦に並んでましたが、もしかして改行コードの違いとかで横並びとか?それくらいなら別に構いませんが。

 知らない方が幸せ?ってことも、やっぱり、あるんですね...。

dictation-kitのサンプル実行

$ cd ../../../dictation-kit
...
$ julius -C main.jconf -C am-gmm.jconf -demo
STAT: include config: main.jconf
STAT: include config: am-gmm.jconf
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
Error: init_phmm: failed to read model/phone_m/jnas-tri-3k16-gid.binhmm
ERROR: m_fusion: failed to initialize AM
ERROR: Error in loading model
$

 dictation-kitは、サンプルやオリジナルの辞書を学習して音声を認識してくれるもののようです。

 ここまでは、順調でしたが、dictation-kitのサンプルは、エラーを吐いて機能してくれません...。

 一方で話し言葉モデルキットlsr-kitと講演音声モデルキットssr-kitの方は、実行でき、ちゃんと機能しました。

 と思ったら、いけた...。

$ cd ../dictation-kit-v4.4
$ julius -C main.jconf -C am-gmm.jconf -demo
...
<<< please speak >>>
...
pass1_best: 学校 で き た 。
sentence1: 学校 で き た 。
pass1_best: 、
sentence1: う 、 うん 。
pass1_best: <input rejected by short input>
pass1_best: <input rejected by short input>
pass1_best: <input rejected by short input>
pass1_best: と 、<input rejected by short input>
pass1_best: だ 。<input rejected by short input>
pass1_best: <input rejected by short input>
pass1_best: 、<input rejected by short input>
pass1_best: 明日<input rejected by short input>
pass1_best: <input rejected by short input>
pass1_best:
sentence1: 。
pass1_best: と 、
sentence1: うん 。

 しばらく、意味不明なエラーに悩みましたが、Juliusのgithubのリンクからではなく、公式(配布)サイト内からもdictation-kitをダウンロードできることがわかったので、試しに、これを使ってみようと思うに至り、dictation-kit-v4.4.zipをダウンロード、julius-kitsディレクトリに展開。

 そして実行してみたら、あっさり、できました。

 雑音に弱いのか、こんなことしゃべってない...誤認識が過ぎる感はあるものの、とりあえず、できたからよしとします。

lsr-kitのサンプル実行

$ cd ../lsr-kit-v4.4.2.1a
$ julius -C main.jconf
STAT: include config: main.jconf
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
Stat: binhmm-header: variance inversed
Stat: read_binhmm: has inversed variances
Stat: read_binhmm: binary format HMM definition
Stat: read_binhmm: this HMM does not need multipath handling
Stat: init_phmm: defined HMMs: 43107
Stat: init_phmm: loading binary hmmlist
Stat: load_hmmlist_bin: reading hmmlist
Stat: aptree_read: 9154195 nodes (4577097 branch + 4577098 data)
Stat: load_hmmlist_bin: reading pseudo phone set
Stat: aptree_read: 110555 nodes (55277 branch + 55278 data)
Stat: init_phmm: logical names: 4577098 in HMMList
Stat: init_phmm: base phones: 166 used in logical
Stat: init_phmm: finished reading HMM definitions
ERROR: m_fusion: for direct speech input, only HMM trained by MFCC ior filterbank is supported
ERROR: m_fusion: failed to initialize AM
ERROR: Error in loading model
$

 話し言葉モデルキットlsr-kit-v4.4.2.1aのサンプルもdictation-kitのようにやってみましたが、これもエラーを吐いて機能してくれません...。

 「エラー: m_fusion:直接音声入力において、音響モデルであるHMM/Hidden Markov Model(隠れマルコフモデル)は、特徴抽出(音響特徴量)の1つMFCC/Mel Frequency Cepstrum Coefficents(メル周波数ケプストラム係数)やフィルタバンクによって産出されたものだけが、サポートされる」...。

 つまり、どゆこと?わっとぅどぅゆみーん?

 と思ったら、コマンドラインオプションが不足していたようで後述のようにしたら、できました。

$ julius -C main.jconf -dnnconf main.dnnconf -charconv SJIS UTF-8
...
<<< please speak >>>
...
pass1_best: こんにち は
pass1_best_wordseq: こんにち+コンニチ+名詞 は+ワ+助詞
pass1_best_phonemeseq: sp_S | k_B o_I N_I n_I i_I ch_I i_E | w_B a_E | sp_S | sp_S
pass1_best_score: 187.713379
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 28731 generated, 2501 pushed, 305 nodes popped in 329
sentence1: こんにち は
wseq1: こんにち+コンニチ+名詞 は+ワ+助詞
phseq1: sp_S | k_B o_I N_I n_I i_I ch_I i_E | w_B a_E | sp_S | sp_S
cmscore1: 0.885 0.092 0.030 0.182 1.000
score1: 172.647675
...

 .exeだけあって.shはないし、これもWindows onlyかな?と思いつつも、run.batに書いてあるとおり、コマンド実行してみたら、できました。

 が、文字化けしてるので-charconv SJIS UTF-8を付け、再実行、今度は、化けずに日本語が表示されました。

ssr-kitのサンプル実行

$ cd ../ssr-kit-v4.4.2.1a
$ julius -C main.jconf -dnnconf main.dnnconf -charconv SJIS UTF-8
...
<<< please speak >>>
...
------
### read waveform input
Stat: adin_oss: device name = /dev/dsp1 (from AUDIODEV)
Stat: adin_oss: sampling rate = 16000Hz
Stat: adin_oss: going to set latency to 50 msec
Stat: adin_oss: audio I/O Latency = 32 msec (fragment size = 512 samples)
STAT: AD-in thread created
pass1_best: 会議 を 始め ます
pass1_best_wordseq: 会議+カイギ+名詞 を+オ+助詞 始め+ハジメ+動詞 ます+マス+助動詞
pass1_best_phonemeseq: sp_S | k_B a_I i_I g_I i_E | o_S | h_B a_I j_I i_I m_I e_E | m_B a_I s_I u_E
pass1_best_score: 92.044899
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 1052 generated, 899 pushed, 37 nodes popped in 162
sentence1: 会議 を 始め ます
wseq1: 会議+カイギ+名詞 を+オ+助詞 始め+ハジメ+動詞 ます+マス+助動詞
phseq1: sp_S | k_B a_I i_I g_I i_E | o_S | h_B a_I j_I i_I m_I e_E | m_B a_I s_I u_E | sp_S
cmscore1: 0.952 0.690 0.924 0.782 0.968 1.000
score1: 143.715271
...

 講演音声モデルキットssr-kit-v4.4.2.1aも、lsr-kit-v4.4.2.1aと同様、-charconv SJIS UTF-8を付け、run.bat通りのjuliusコマンドを実行したら、いけました。

 ssr-kit-v4.4.2.1aは、講演用というだけあって?誤認識するでもなく、マイク入力を待ち、明らかにlsr-kit-v4.4.2.1aよりも雑音に強い印象。

 会議じゃなかった...講演用だった...、まぁいいか。

 ここまでは、録音デバイスからの直接入力の例ですが、Juliusでは、他にもファイル入力、ネットワーク入力による音声認識を行なうこともできます。

ファイル入力のサンプル実行

$ cd ../dictation-kit-v4.4
$ julius -C main.jconf -C am-gmm.jconf -input rawfile
...
------
### read waveform input
enter filename->

 Juliusは、入力にファイルを取ることもできます。

 実行して[enter filename->]と表示されたら、成功で、そこにJuliusが許容するファイル形式のファイルを必要に応じてパス付きで指定するとテキスト変換してくれます。

 加えて、ここで指定するファイルは、Juliusが期待する(Juliusに設定してある)サンプル周波数(サンプルレート)と一致する必要があります。

 コマンドライン上では、[-smpFreq Hz]オプションでサンプル周波数を設定できるので指定するWAVやRAWファイルのサンプル周波数を明示的に指定しておくと良いでしょう。

 特にヘッダのあるWAVと異なり、ヘッダのないRAWファイルは、サンプル周波数の一致・不一致をチェックできず、そのまま処理されるので-smpFreqで指定して、同じサンプルレートのファイルを指定するようにすると勘違いする可能性も限りなく、少なくなるものと思います。

 なお、これは、日本語自動口述筆記キット/dictation-kitの例ですが、適切なディレクトリに移動し、適切なコマンドラインオプションに加え、-input rawfileを付ければ、他のキットでも同じことができます。

ネットワーク入力のサンプル実行

[サーバ側]
$ cd ../ssr-kit-v4.4.2.1a
$ julius -C main.jconf -dnnconf main.dnnconf -charconv SJIS UTF-8 -input adinnet
...
------
### read waveform input
Stat: adin_tcpip: waiting connection...
 

 Juliusは、ネットワークからの入力もサポートしており、クライアント側からの音声をサーバ側で表示することができます。

 適切なディレクトリで適切なコマンドを実行することでサーバ側は、このような感じで待機状態になります。

 なお、これは、講演音声モデルキット/ssr-kitの例ですが、適切なディレクトリに移動し、適切なコマンドラインオプションに加え、-input adinnetを付ければ、他のキットでも同じことができます。

[クライアント側]
$ adintool -in mic -out adinnet -server hostname
...
<<< please speak >>>

 続いて、クライアント側には、今回、テスト用としてJuliusが提供するadintoolを使って、このように指定しました。

 adintoolの実行パスは、どこでも構いません。

 サンプル周波数は、クライアント・サーバ間で合わせる必要があるとされ、サーバ側(Julius)コマンドラインオプション-smpFreq、クライアント側(adintool)コマンドラインオプション-freqでも設定できますが、adintoolを使う分には、自動認識されるのか、クライアント側でも明示する必要はありませんでした。

モジュールモード

 Juliusには、モジュールモードというのもあります。

 Juliusコマンドに-moduleオプションを付けるだけで、他の端末などから[$ jcontrol ホスト名]とすることでjcontrol側の端末に、ブラウザのURL入力欄に、例えば、デフォルトの10500ポートにアクセスすべく、[localhost:10500]とすればブラウザ上に音声をテキストに変換した結果が表示されたり、これら情報を使ってTCPやUDPを介してスクリプトやプログラム言語で処理することができます。

その他

 他にもプラグイン拡張などができたりもしますが、詳細は、http://julius.osdn.jp/juliusbook/ja/の『The Julius book』などを参照。

/etc/modprobe.d/alsa-base.confは必要なさげ

 Juliusのインストールについて調べていると今更だからなのか、古い情報が多く、現時点で、もしくは、そもそも、これは必要な設定・作業なのか?というものもありました。

 また、自身はノートパソコンで動作確認していますが、ラズパイ情報が多く、一部読み替えが必要な部分もありました。

 ちなみに、そんなこんな状況であること、話し言葉モデルキットや講演用モデルキットの情報はなさそうなことなどから敢えて引用は控えました。

options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1 # <=ラズパイの場合

 そんな中、システムが利用するデバイスの優先順位を変えるということでindex値0が1より優先されるから、/etc/modprobe.d/alsa-base.confに、このように書くとUSBマイクが優先されるため、当該ファイルがなければ新規作成...という情報が散見されます。

 しかし、自身の環境(ラズパイではなくパソコン)では、[snd_bcm2835]など存在しない、これは、情報源が軒並みラズパイ用だから(手持ちのラズパイで確認済み)。

 そもそもデバイス情報さえ固定(紛らわしいUSBオーディオ機器を他に接続しない)なら、前述したようにJuliusが参照する環境変数AUDIODEVにデバイスを設定すれば、このファイルで設定する必要はないでしょう。

 もちろん、常時使うなら、~/.profileとか、~/.bashrcとか適切な設定ファイルに追記しておく必要がありますが。

関連リンク

ウェブ造ホーム前へ次へ