32ビットOSサポートが怪しくなったJuliusを導入・検証するためだけに64ビットマシンながら32ビットOS(FreeBSD/Debian Stretch)を使い続けていた自身も、これとマルチブートする格好で64ビットOSのDebian Stretch amd64をインストールするに至りました。
というわけで早速、LinuxにJulius(JuliusLib rev.4.4.2.1)を導入していきます。
http://julius.osdn.jp/によるとJuliusとは、数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持つ音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンとのこと。
インストールしたばかりでDebianがまっさらだったため、Juliusをインストールする前に、これらのインストールとsudoersファイルの編集・設定が必要でした。
Juliusをインストールするにあたり、まず、任意のtmp/appディレクトリを作って移動。
手作業でダウンロード・展開しても良いですが、ここでは、git cloneしてJuliusを取得、./configure、make。
ここでsudo make installとしてインストールしてもよいのですが、公式ドキュメントには、必ずしもインストール(make install)しなくても使えると書いてあった気がします。
が、make installしておいたほうが、後が楽かと。
make installした場合、-versionオプションでバージョンの他、現在の構成・設定状況の概要を確認できます。
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でも、ちゃんと機能しました。
なお、いずれも、今日時点で最新のバージョンです。
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が使われると理解して良さげ。
というわけでUSBマイクを認識してもらうため、ここでパソコンを再起動する必要があります。
今日、気づいたタイミングとしては、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マイクが認識されるかをチェックし、必要な設定を行っていきます。
ここでは、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する手間がなく、よいでしょう。
ここまでの設定でfruitに限らず、grammar-kitのサンプルを使うことができました。
感動を覚えるほど、ちゃんと認識してくれますが、感度が良すぎるのか、よほど静かな場所でしゃべらないと雑音も拾ってしまう模様。
なお、Test.shも用意されていますが、Juliusをインストールしないで使う場合を想定してか、bin/linux/juliusを使っており、julius含め、そこにあるファイルは、ことごとく実行権限がないため、shなどを前置するか、実行権限を付与するか、そうでなければ、make installの結果、特に設定しなければデフォルトでインストールされる/usr/local/bin/juliusを使う必要があります。
また、segmentation-kitのサンプルも実行可能です。
segmentation-kitは、wavディレクトリに同名の.wavファイルと.txtファイルを配置、前者は音声データ、後者は、音声をひらがな表記したものとしUTF-8で保存したもので、segment_julius.plを実行するとwavディレクトリ内にそれらファイルと同名の.labファイルが保存され、中身には、分割した語句が書かれるとのこと。
ただし、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は、サンプルやオリジナルの辞書を学習して音声を認識してくれるもののようです。
ここまでは、順調でしたが、dictation-kitのサンプルは、エラーを吐いて機能してくれません...。
一方で話し言葉モデルキットlsr-kitと講演音声モデルキットssr-kitの方は、実行でき、ちゃんと機能しました。
と思ったら、いけた...。
しばらく、意味不明なエラーに悩みましたが、Juliusのgithubのリンクからではなく、公式(配布)サイト内からもdictation-kitをダウンロードできることがわかったので、試しに、これを使ってみようと思うに至り、dictation-kit-v4.4.zipをダウンロード、julius-kitsディレクトリに展開。
そして実行してみたら、あっさり、できました。
雑音に弱いのか、こんなことしゃべってない...誤認識が過ぎる感はあるものの、とりあえず、できたからよしとします。
話し言葉モデルキットlsr-kit-v4.4.2.1aのサンプルもdictation-kitのようにやってみましたが、これもエラーを吐いて機能してくれません...。
「エラー: m_fusion:直接音声入力において、音響モデルであるHMM/Hidden Markov Model(隠れマルコフモデル)は、特徴抽出(音響特徴量)の1つMFCC/Mel Frequency Cepstrum Coefficents(メル周波数ケプストラム係数)やフィルタバンクによって産出されたものだけが、サポートされる」...。
つまり、どゆこと?わっとぅどぅゆみーん?
と思ったら、コマンドラインオプションが不足していたようで後述のようにしたら、できました。
.exeだけあって.shはないし、これもWindows onlyかな?と思いつつも、run.batに書いてあるとおり、コマンド実行してみたら、できました。
が、文字化けしてるので-charconv SJIS UTF-8を付け、再実行、今度は、化けずに日本語が表示されました。
講演音声モデルキット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では、他にもファイル入力、ネットワーク入力による音声認識を行なうこともできます。
Juliusは、入力にファイルを取ることもできます。
実行して[enter filename->]と表示されたら、成功で、そこにJuliusが許容するファイル形式のファイルを必要に応じてパス付きで指定するとテキスト変換してくれます。
加えて、ここで指定するファイルは、Juliusが期待する(Juliusに設定してある)サンプル周波数(サンプルレート)と一致する必要があります。
コマンドライン上では、[-smpFreq Hz]オプションでサンプル周波数を設定できるので指定するWAVやRAWファイルのサンプル周波数を明示的に指定しておくと良いでしょう。
特にヘッダのあるWAVと異なり、ヘッダのないRAWファイルは、サンプル周波数の一致・不一致をチェックできず、そのまま処理されるので-smpFreqで指定して、同じサンプルレートのファイルを指定するようにすると勘違いする可能性も限りなく、少なくなるものと思います。
なお、これは、日本語自動口述筆記キット/dictation-kitの例ですが、適切なディレクトリに移動し、適切なコマンドラインオプションに加え、-input rawfileを付ければ、他のキットでも同じことができます。
Juliusは、ネットワークからの入力もサポートしており、クライアント側からの音声をサーバ側で表示することができます。
適切なディレクトリで適切なコマンドを実行することでサーバ側は、このような感じで待機状態になります。
なお、これは、講演音声モデルキット/ssr-kitの例ですが、適切なディレクトリに移動し、適切なコマンドラインオプションに加え、-input adinnetを付ければ、他のキットでも同じことができます。
続いて、クライアント側には、今回、テスト用として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』などを参照。
Juliusのインストールについて調べていると今更だからなのか、古い情報が多く、現時点で、もしくは、そもそも、これは必要な設定・作業なのか?というものもありました。
また、自身はノートパソコンで動作確認していますが、ラズパイ情報が多く、一部読み替えが必要な部分もありました。
ちなみに、そんなこんな状況であること、話し言葉モデルキットや講演用モデルキットの情報はなさそうなことなどから敢えて引用は控えました。
そんな中、システムが利用するデバイスの優先順位を変えるということでindex値0が1より優先されるから、/etc/modprobe.d/alsa-base.confに、このように書くとUSBマイクが優先されるため、当該ファイルがなければ新規作成...という情報が散見されます。
しかし、自身の環境(ラズパイではなくパソコン)では、[snd_bcm2835]など存在しない、これは、情報源が軒並みラズパイ用だから(手持ちのラズパイで確認済み)。
そもそもデバイス情報さえ固定(紛らわしいUSBオーディオ機器を他に接続しない)なら、前述したようにJuliusが参照する環境変数AUDIODEVにデバイスを設定すれば、このファイルで設定する必要はないでしょう。
もちろん、常時使うなら、~/.profileとか、~/.bashrcとか適切な設定ファイルに追記しておく必要がありますが。
2019/01/03にJulius 4.5がリリースされていました。
2020/09/02にJulius 4.6がリリースされていました。
というか、最新リリースは、https://github.com/julius-speech/julius/releases/。