nyabot’s diary

電気猫の夢を見るお話

Juliusで独自辞書を使う on Raspberry Pi Zero

オープンソースの高性能汎用大語彙連続音声認識エンジン「Julius」(GitHub - julius-speech/julius: Open-Source Large Vocabulary Continuous Speech Recognition Engine)をRaspberry Pi Zero Wに入れて独自辞書で動作させたのでやり方をメモ。

Juliusのインストール

Juliusのバージョンは4.5。
(2022年6月現在の最新バージョンは4.6なのだけど、最初に4.6でつまづいてバージョンを落としてから何やかんややってうまく行ったのでそのまま4.5を使っている。もしかしたら4.6でも同じ方法でいけるのかもしれない。)
Raspbery Pi Zeroは標準のRaspberry Pi OSで、マイクにはUSB接続のカメラマイクを使用。

必要なライブラリのインストール

あとでJuliusをmake installする際、ライブラリがないとないままで構築されてしまうので必要なライブラリを事前に用意しておく。

$ sudo apt-get update  
$ sudo apt-get upgrade  
$ sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev

Julius本体のインストール

Raspberry Piにjuliusディレクトリを作成して諸々入れていく。

$ cd
$ mkdir julius  
$ cd ./julius/

ダウンロードして解凍

$ wget https://github.com/julius-speech/julius/archive/v4.5.tar.gz  
$ tar xvzf ./v4.5.tar.gz

コンパイル、インストールする。

$ cd ./julius-4.5/  
$ ./configure  
$ make  
$ sudo make install

ディクテーションキットの用意

juliusの本体と同じ階層にjulius-kitディレクトリを作成し、ディクテーションキットをダウンロードして解凍する。

$ cd ~/julius/  
$ mkdir julius-kit  
$ cd ./julius-kit

$ wget https://osdn.net/dl/julius/dictation-kit-4.5.zip  
$ unzip ./dictation-kit-4.5.zip

※キットはサイズが大きいので、解凍前の圧縮ファイルを適宜削除しておく。

Juliusの動作確認

$ cd ~/julius/julius-kit/dictation-kit-4.5/
$ julius -C ./main.jconf -C ./am-gmm.jconf -nostrip

うまくいっていればこちらの発話内容を認識してくれる。すごい。

Juliusの辞書作成

辞書の作成が思った以上に大変そうだったので、以下のサービスを使わせていただいた。素敵。

julius簡単辞書作成ツール
(PPDR様, juliusの辞書を作って認識速度&精度を爆上げする

生成、ダウンロードしたデータは展開してjuliusが利用できる場所に移動。
なお、今回はgitで「hacot」(←ロボットの名前)というリポジトリを作成し、頻繁に編集するファイルをまとめて管理している。ちなみにgitも今回使い方覚えた。
階層構造は以下のような感じ。この項ではjulius-dict/の中に置くファイルを作成する。

/home/pi/
    |- julius/
        |- julius-4.5/
        |- julius-kit/
            |- dictation-kit-4.5/
    |- git/
        |- hacot/
            |- script/
            |- julius-dict/
                |- sample.grammer
                |- sample.phone
                |- sample.term
                |- sample.voca
                |- sample.yomi
                |- memo.txt
                |- sample.dfa
                |- sample.dict

上記のjulius-dict/にあるファイルのうち、「sample.dfa」及び「sample.dict」の二種類は上記のサービスでは作成されない。
以下のコマンドでそれらを生成する。

$ cp -b ~/julius/julius-4.5/gramtools/dfa_minimize/dfa_minimize ~/julius/julius-4.5/gramtools/mkdfa/dfa_minimize  
$ cp -b ~/julius/julius-4.5/gramtools/mkdfa/mkfa-1.44-flex/mkfa ~/julius/julius-4.5/gramtools/mkdfa/mkfa  
$ ~/julius/julius-4.5/gramtools/mkdfa/mkdfa.pl ~/git/hacot/julius-dict/julius-dict

ちなみに、上記コマンドのうち一つ目のコピーを実行しなかった場合、次のエラーが発生した。

Warning: dfa_minimize not found in the same place as mkdfa.pl

dfa_minimizeというものがmkdfa.plと同じ場所にないとだめみたい?
また、二つ目のコピーを実行しなかった場合もファイルを生成できず、エラーとなった。
ググってみると、元々gramtoolsに入っているmkdfaが正常に動作しない、という情報あり。どうしてなのかはわからない。
(情報元:Juliusの独自辞書を使って音声を認識させる - Qiita

完成!

実際に作成した独自辞書を使ってみる。

$ julius -C ~/julius/julius-kit/dictation-kit-4.5/am-gmm.jconf -nostrip -gram ~/git/hacot/julius-dict/julius-dict

問題なく認識されれば成功。
なお、環境によってはマイクデバイスの優先度選択なども必要になる模様。

以上!

経緯とか

自作ロボットの音声認識については、今回のJuliusの他にもGoogle Assistant SDKなどの外部のサービスを利用する手もあります。

以前実際に使用した印象では、Google Assistantは認識も極めて正確で高速でした。独自辞書を使わない場合のJuliusの動作と比較すると、あらためてその優秀さがわかります。
しかし、外部サービスはどうしても廃止や大幅な仕様変更等の懸念があります。Googleは大好きですが彼らはすぐサービスを終了しがちなイメージがあるので信頼はできません。

いつか自分で作ったロボットに愛着が湧いたころにサービスが提供されなくなり、聴覚や脳の一部にあたる機能が失われるとしたら、それはあまりにも悲しい。
あと単純にネットワークを利用せずに内部で処理する方がロマンがあります。ある気がします。
そんなことを考えて、今回オフラインで動作するJuliusに挑戦しました。

とにかく、無事に動作してくれてとてもうれしい。Juliusを作った人たちは天才なのではないかと思う。

作成中のロボットについて

現在2体のロボットを作成しています。
片方は技術習得と見せびらかしを目的に作ったキューブ型の小さなロボットで、Raspberry Pi Zeroで制御します。

nyabot.hatenablog.com

今回、これにJuliusを入れました。
Raspberry Pi Zeroは3や4と比べてサイズや省電力性に優れる一方、非力なので、独自辞書を作成しない場合は音声認識に数秒以上の時間がかかります。 独自辞書を用いることで、即時の認識が可能になり誤認識も減るため、音声コマンドによる操作が実用的になりました。

もう一体のロボットにはRaspberry Pi3Bを使っています。そちらは人間との対話機能を持たせたいので、語彙の少ない独自辞書では物足りなく、何か工夫できないか思案中です。

つづく。