Raspberry Pi＋Juliusで音声を認識する【2019年3月】

## はじめに
以前、[Raspberry Pi＋Juliusで音声を認識する](https://qiita.com/mininobu/items/609aed76f5767f0aa99b#raspberry-pi%E3%81%ABusb%E3%83%9E%E3%82%A4%E3%82%AF%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%95%E3%81%9B%E3%82%8B)という記事でRaspberry Piに国産の音声認識ツール「[Julius](http://julius.osdn.jp/)」をインストールして、自前で音声認識をする仕組みの作り方をご紹介しました。

あれから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の導入のほか、マイク関連の設定が必要にです。大まかな手順は下記の通りです。

1. USBマイクをRaspberry Piで使う準備をする
1. 録音のテスト
1. Juliusをインストールする
1. Julius音声認識パッケージを取得する
1. 動作確認


## USBマイクをRaspberry Piで使う準備をする
### Raspberry PiにUSBマイクを認識させる
Raspberry Pi3と現在（2019/3/24時点）でのRaspbianであれば、Logicool C300はUSBに接続するだけでデバイスを認識します。正しく認識されているかは、下記コマンドで確認できます。

```shell:コマンド
lsusb
```

```shell: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オプションで確認できます。

```shell:カードNo.の確認
arecord -l
```

```shell:実行結果
**** 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を使って録音した音声をファイルに保存します。録音するコマンドは下記のとおりです。

```shell:カードNo.の確認
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のコンパイルパラメータに影響がありますので忘れないようにしてください。

```shell:サウンドドライバなどのインストール
sudo apt-get install osspd-alsa
sudo apt-get install libasound2-dev
```

### Juliusのソースコードを取得する
GithubのJuliusのサイトからソースコードを取得しましょう。下記のコマンドで取得できます。

```shell
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系を使用してください。

### ソースコードをコンパイルする
下記のコマンドを実行し、ソースコードからバイナリパッケージをコンパイルします。コンパイルには時間がかかりますので、少し待ちましょう。

```shell
tar xvzf v4.4.2.1.tar.gz
cd julius-4.4.2.1
./configure --with-mictype=alsa
make
```

## Julius音声認識パッケージを取得する
Juliusで音声認識をするためには、音声認識パッケージをインストールする必要があります。音声認識パッケージは[公式サイト](http://julius.osdn.jp/index.php?q=dictation-kit.html)より取得します。
公式サイトでは用途に応じて複数のパッケージを提供していますが、今回は、一般的な日本語の音声認識であるディクテーションキット（dictation-kit）を使用します。
ディクテーションキットの取得は、下記コマンドで行います。

```shell
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に下記の一文を追加します。

```shell:.profile
export ALSADEV=hw:1
```

変更を有効にするには、Raspberry Piを再起動、または「source ~/.profile」を実行します。

ここまでで、Juliusの環境構築は完了です。

## 動作確認
ディクテーションキットの解凍が完了したら、いよいよJuliusを動かします。起動のコマンドは下記のとおりです。

```shell
~/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 >>>``と表示されます。
試しに「こんにちは」とマイクに向かって話しかけてみましょう。
音声認識が成功すると、下記のように表示されます。

```shell
pass1_best:  こんにちは 。
pass1_best_wordseq: 
 こんにちは+感動詞 

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: 
 こんにちは+感動詞 

phseq1: silB | k o N n i ch i w a | silE
cmscore1: 0.351 0.416 1.000
score1: -4188.954102
```

## おわりに
１年ぶりにやってみて、変わりっぷりに驚きました。
できれば、Julius4.5を使ってみたかったですね・・・。日本語ディクテーションキットのバージョンアップ待ってます！