概要

 USBマイクと音声認識ソフトJuliusを使って音声認識を試し、認識できることを確認した。


背景と目的

 Web上には、Raspberry Piで音声認識をやらせてホームオートメーションに応用したり、簡単な受け答えをする人口知能のようなものを作っている例があり、なかなか面白い。そこで、私も音声認識を試してみたいと思う。


詳細

0.流れ

 今回の目標は、短い言葉でもいいので音声認識に成功させるということにする。そのための簡単な方法をWeb上で情報収集した結果、USBマイクとJuliusという音声認識ソフトウェアを使うのがよさそうだということがわかった。ということで、以下の手順で進めていくことにした。

  • USBマイクと動作確認
  • Juliusのインストール
  • Juliusを使って音声認識の動作確認
1.USBマイクと動作確認

 どのマイクが使えるのか、どんな準備が必要かは、こちらがまとまっていたので参考にさせてもらった。USBマイクは、

 SANWA SUPPLY MM-MCUSB16 USBマイクロホン

 をAmazonで調達。実売1600円ほど。早速、Raspberry PiのUSB端子に接続し、

lsusb

 コマンドを実行したところ、以下の通り認識OK。

Bus 001 Device 005: ID 0d8c:0134 C-Media Electronics, Inc.

 次に、alsaでキャプチャデバイスとして認識されているか確認。

arecord -l

 コマンドを実行したところ、以下の通り認識OK。

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Audio Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

 試しに、録音をしてみる。サウンドカード1、デバイス0なので、plughw:1,0。16ビットリニアPCM、サンプリング周波数16kHz、ステレオを指定。

arecord -D plughw:1,0 -f cd -r 16000 test.wav

 その結果、ファイルが作成された。FTPでファイルをPCに送り、波形編集ソフトで中身を確認したところ、ちゃんと音が録れていて、聴感上ノイズも気にならない。ハードウェアとしては問題なさそうだ。というわけで、マイクの動作確認はOK。

2.Juliusのインストール
2.1 インストールとダウンロード

 インストール方法は、こちらがまとまっていたので参考にさせてもらった。
まずは、本体、ディクテーションキット、グラマーキットをそれぞれダウンロード。ディクテーションキットは250MBとなかなかのサイズ。

sudo wget -O julius-4.3.1.tar.gz 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F60273%2Fjulius-4.3.1.tar.gz'
sudo wget -O dictation-kit-v4.3.1-linux.tgz 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fjulius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz'
sudo wget -O grammar-kit-v4.1.tar.gz 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F51159%2Fgrammar-kit-v4.1.tar.gz'

 Julius本体を解凍し、インストール。

tar zxvf julius-4.3.1.tar.gz
cd julius-4.3.1/
./configure
make
sudo make install

 ディクテーションキットと、グラマーキットをそれぞれ解凍する。

cd ../
tar zxvf dictation-kit-v4.3.1-linux.tgz
tar zxvf grammar-kit-v4.1.tar.gz

 とりあえず、インストールを完了。

2.2 デバイスの優先度の変更

 次に、USBマイクの優先度を1番目にする。実はここでうまくいかずかなり手こずった。Web上にはいろいろやり方が書いてあり、OSのバージョンごとに正しいやり方が違うみたいだ。私の場合(Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux)は、こちらの方法でうまくいった。
まずは、現在の優先度を確認。

cat /proc/asound/modules

 すると、以下の通り、USBマイクは2番目のようだ。

 0 snd_bcm2835
 1 snd_usb_audio

 これを1番目にするためには、私の環境の場合は、/etc/modprobe.dに、alsa-base.confというファイルを作成し、以下を記述。

options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

 ここで、Raspberry Piを再起動し、もう一度デバイスの優先度を確認。USBマイクが1番目になった。これでOK。

 0 snd_usb_audio
 1 snd_bcm2835
2.3 とりあえず試す

 なんでもいいので、とにかく認識させてみる。testmic.jconfというグラマーキットがあるので、それを使ってみた。果物の名前を言うと、認識してくれるらしい。

cd julius-4.3.1
julius -C ../grammar-kit-v4.1/testmic.jconf -charconv EUC-JP UTF-8

 結果は以下の通り。みかん、リンゴ、ぶどうと3種類を言ってみたら、それぞれちゃんと認識してくれた。
これで、とりあえずjuliusが動くことが確認できた!

Notice for feature extraction (01),
        *************************************************************
        * Cepstral mean normalization for real-time decoding:       *
        * NOTICE: The first input may not be recognized, since      *
        *         no initial mean is available on startup.          *
        *************************************************************

Stat: adin_oss: device name = /dev/dsp (application default)
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: <s> 蜜柑 です
sentence1: <s> 蜜柑 です </s>
pass1_best: <s> リンゴ です </s>
sentence1: <s> リンゴ です </s>
pass1_best: <s> ぶどう です </s>
sentence1: <s> ぶどう です </s>

まとめと今後の課題

 Raspberry Piに音声認識ソフトJuliusをインストールし、音声認識できることを確認した。今後は、他のプログラムと組み合わせて、音声で操作するモノをつくってみたりしたい。