はじめに
以前、Raspberry Pi+Juliusで音声を認識するという記事でRaspberry Piに国産の音声認識ツール「Julius」をインストールして、自前で音声認識をする仕組みの作り方をご紹介しました。
あれから1年ほど立ちましたが、Raspbianのバージョンアップなど影響により、以前の手順では構築がうまくいかない状況になってしましました。
そこで今回は、2019年3月時点の状態で構築手順をまとめ直すことにしました。
以前の記事とほぼ同様の構成ですので、以前の記事をご覧いただいた方も、これからRaspberry Pi+Juliusで音声認識をやってみようという方も、本記事からご覧いただければと思います。
前回記事からの相違点
先に前回記事時点からの環境の相違点と手順への影響をまとめました。下記の内容に注意して手順を読み進めていただければと思います。
相違点 | 以前の手順への影響 |
---|---|
設定ファイルの書き換えでUSBオーディオの優先順位が変更されなくなった | JuliusのUSBデバイス指定の方法が変わる |
ossのサウンドドライバがRaspbianに含まれなくなった | Juliusのビルドでドライバのモジュールが見つからないエラーになる |
用意するもの
- Raspberry Pi 3/3B
- USBマイク
USBマイクは、マイク付きWebカメラでも利用できます。
ということで、今回はLogicool C300というUSB接続のWebカメラを使います。
https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-C300-%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A0/dp/B002J4UAG4
ざっくりと手順を紹介
Raspberry Piで音声認識をするにはJuliusの導入のほか、マイク関連の設定が必要にです。大まかな手順は下記の通りです。
- USBマイクをRaspberry Piで使う準備をする
- 録音のテスト
- Juliusをインストールする
- Julius音声認識パッケージを取得する
- 動作確認
USBマイクをRaspberry Piで使う準備をする
Raspberry PiにUSBマイクを認識させる
Raspberry Pi3と現在(2019/3/24時点)でのRaspbianであれば、Logicool C300はUSBに接続するだけでデバイスを認識します。正しく認識されているかは、下記コマンドで確認できます。
lsusb
Bus 001 Device 004: ID 046d:0805 Logitech, Inc. Webcam C300
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
上記の実行結果では、「Bus 001 Device 004」で「Logitech, Inc. Webcam C300」と表示されているため、WebカメラがUSBデバイスとして認識されていることがわかります。
録音のテスト
Raspberry PiとUSBマイクが正しく動作することを確認するため、USBマイクから音声を録音し、ファイルに保存してみます。
音声の録音はarecordコマンドで実現できますが、arecordコマンドで録音するにはUSBマイクに割り当てられている「カードNo.」と「デバイスNo.」を知る必要があります。それぞれの確認は、arecordコマンドの-lオプションで確認できます。
arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: U0x46d0x805 [USB Device 0x46d:0x805], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
上記の場合、「card 1」「device 0」と表示されているため、カードNo.、デバイスNo.ともに「0」で認識されているということがわかります。
カードNo.、デバイスNo.がわかったところで、arecordを使って録音した音声をファイルに保存します。録音するコマンドは下記のとおりです。
arecord -D plughw:1,0 test.wav
コマンド実行後、録音待ちの状態になります。マイクに向かって話しかけ、完了したらCtrl+Cを押下して終了します。終了時に、下記のようなメッセージが表示されますが、中断した際に表示されるメッセージですので、問題ありません。
Aborted by signal Interrupt...
arecord: pcm_read:2103: read error: Interrupted system call
録音されたファイル(test.wav)を再生してみましょう。音楽プレイヤーなどのソフトで話しかけた音声を聞くことができれば、成功です。
Juliusのインストール
Juliusは、GitHubよりソースコードを取得し、ビルドすることでバイナリファイルを作成します。
公式ドキュメントにはバイナリパッケージを取得してインストールできるという記載がありますが、Githubで公開されているバイナリパッケージはWindows用のみで、Linuxなどで使用する場合は、ソースコードからコンパイルする必要があります。いずれMac/Linux環境用のバイナリパッケージも配布してほしいですね。
Juliusのコンパイル/実行に必要なモジュールをインストールする
Juliusでサウンド、およびマイクを使用するために、ALSAサウンドドライバなどの必要なモジュールをインストールします。ここでインストールするモジュールは、後述のJuliusのコンパイルパラメータに影響がありますので忘れないようにしてください。
sudo apt-get install osspd-alsa
sudo apt-get install libasound2-dev
Juliusのソースコードを取得する
GithubのJuliusのサイトからソースコードを取得しましょう。下記のコマンドで取得できます。
mkdir julius
cd julius
wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz
(注意)
2019/3/24時点では、Juliusの最新版は4.5がリリースされています。
ですが、後で紹介する「日本語ディクテーションキット」の4.5版がリリースされていないため、日本語の音声認識をやってみたい方は、v4.4系を使用してください。
ソースコードをコンパイルする
下記のコマンドを実行し、ソースコードからバイナリパッケージをコンパイルします。コンパイルには時間がかかりますので、少し待ちましょう。
tar xvzf v4.4.2.1.tar.gz
cd julius-4.4.2.1
./configure --with-mictype=alsa
make
Julius音声認識パッケージを取得する
Juliusで音声認識をするためには、音声認識パッケージをインストールする必要があります。音声認識パッケージは公式サイトより取得します。
公式サイトでは用途に応じて複数のパッケージを提供していますが、今回は、一般的な日本語の音声認識であるディクテーションキット(dictation-kit)を使用します。
ディクテーションキットの取得は、下記コマンドで行います。
mkdir ~/julius/julius-kit
cd ~/julius/julius-kit
wget https://osdn.net/dl/julius/dictation-kit-v4.4.zip
unzip dictation-kit-v4.4.zip
その他環境設定
ALSADEV設定で使用デバイスを指定する
Juliusを実行する際にはカードNo.が必要です。Juliusが常に同じ設定を使用できるように、環境変数として設定しておくと便利です。
Raspberry Piの場合、~/.profileに下記の一文を追加します。
export ALSADEV=hw:1
変更を有効にするには、Raspberry Piを再起動、または「source ~/.profile」を実行します。
ここまでで、Juliusの環境構築は完了です。
動作確認
ディクテーションキットの解凍が完了したら、いよいよJuliusを動かします。起動のコマンドは下記のとおりです。
~/julius/julius-4.4.2.1/julius/julius -C ~/julius/julius-kit/dictation-kit-v4.4/main.jconf -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip
Juliusの起動が成功すると<<< please speak >>>
と表示されます。
試しに「こんにちは」とマイクに向かって話しかけてみましょう。
音声認識が成功すると、下記のように表示されます。
pass1_best: こんにちは 。
pass1_best_wordseq: <s> こんにちは+感動詞 </s>
pass1_best_phonemeseq: silB | k o N n i ch i w a | silE
pass1_best_score: -4168.268555
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 21946 generated, 1540 pushed, 319 nodes popped in 159
sentence1: こんにちは 。
wseq1: <s> こんにちは+感動詞 </s>
phseq1: silB | k o N n i ch i w a | silE
cmscore1: 0.351 0.416 1.000
score1: -4188.954102
おわりに
1年ぶりにやってみて、変わりっぷりに驚きました。
できれば、Julius4.5を使ってみたかったですね・・・。日本語ディクテーションキットのバージョンアップ待ってます!