日本語音声認識
Raspberry Piに大語彙連続音声認識エンジン Juliusをインストールして、日本語の音声認識をしてみます。
OSのインストールやWiFiドングルのセットアップなどの初期設定は[こちら>../Raspbianのインストール)をご覧ください。
必要なもの
- USBマイク(今回はPLANEX USBオーディオ変換アダプタ PL-US35APとSANWA SUPPLY フラット型PCマイク MM-MC23を組み合わせました) PL-US35APのチップはC-Media製のCM119Aで、多くのLinuxディストリビューションで動作実績があります。
今回は上記のようにUSBオーディオアダプタを使いましたが、音声認識のみなら、USBマイクを使ってもいいと思います。
あるといいもの
- セルフパワーUSBハブ(今回はiBUFFALO USB2.0ハブ セルフ&バスパワー 4ポート BSH4A01BKを使いました) あるといいものと書きましたが、Raspberry Piの電源は弱いので、安定動作のためにはほぼ必須だと思います。
- USBスピーカー(今回は前述のPLANEX USBオーディオ変換アダプタ PL-US35APとLOGICOOL ステレオスピーカー Z120BWを組み合わせました) 正しくマイクが動作しているか確認する場合は必要です。 3.5mmミニプラグスピーカーをRaspberry Piの端子に挿すのでもよいのですが、Raspberry Piのノイズを拾ってしまって、非常に音質が悪いです。
手順
USBオーディオ(またはUSBマイク)の認識と動作確認

- Raspberry Piが起動していたら、シャットダウンする。
- USBハブをRaspberry Piに接続する。 (右の写真では、スマホ用充電専用MicroUSBケーブルを使って、Raspberry Pi自体の電源もUSBハブから取っています。(黒いカールコード) 通常の通信もできるMicroUSBケーブルを使うとループ接続になってしまうので、要注意です)
- USBオーディオアダプタと3.5mmミニプラグマイクの組み合わせ(あるいはUSBマイク)を、USBハブに接続する。
- Raspberry Piを起動する。
- USBオーディオアダプタを認識しているか確認する。下記の場合だとDevice 006がUSBオーディオアダプタです。
lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 005: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 006: ID 0d8c:013a C-Media Electronics, Inc. - USBオーディオアダプタの優先度を確認する。(下記の場合、内蔵オーディオが優先されています。)
cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio - USBオーディオアダプタの優先度を上げる。
nano /etc/modprobe.d/alsa-base.conf
- index=-2をindex=0にします。
# options snd-usb-audio index=-2
options snd-usb-audio index=0 - Raspberry Piを再起動する。
sudo reboot
- USBオーディオアダプタの優先度を確認する。(下記の場合、USBオーディオアダプタが優先されてるようになりました。)
cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835 - マイクの感度を最大にする。(録音してみて適宜調整してください)
amixer sset Mic 16
- 録音と再生を確認する。録音できていたら、次に進む。
arecord -r 16000 -f S16_LE test.wav
aplay test.wav
Juliusのコンパイル
- Julius他をダウンロードする。(URLはOSDNを見て、適宜変えてください)
cd
wget --trust-server-names 'http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F59049%2Fjulius-4.2.3.tar.gz'
wget --trust-server-names 'http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F59050%2Fdictation-kit-v4.2.3.tar.gz'
wget --trust-server-names 'http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F51159%2Fgrammar-kit-v4.1.tar.gz' - Juliusを解凍し、configureしてmakeする。
tar xvzf julius-4.2.3.tar.gz
cd julius-4.2.3
./configure
make - ディクテーションキットと文法認識キットを解凍する。
mkdir /julius-kits
cd /julius-kits
tar xvzf /dictation-kit-v4.2.3.tar.gz
tar xvzf /grammar-kit-v4.1.tar.gz - USBオーディオのカード番号を確認する。(下記の場合は0番です。)
arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0 - カード番号を環境変数に指定する。
export ALSADEV=hw:0
- いざJulius実行。何か話すと認識結果がターミナルに表示されます。
/julius-4.2.3/julius/julius -C /julius-kits/dictation-kit-v4.2.3/fast.jconf -charconv EUC-JP UTF-8
- 下記のようなエラーが出た場合は…
Stat: adin_oss: device name = /dev/dsp (application default)
Error: adin_oss: failed to open /dev/dsp
failed to begin input stream - snd-pcm-ossモジュールが組み込まれていないようです。組み込みましょう。
#code(bash,nonumber){{
sudo modprobe snd-pcm-oss - 再度Juliusを実行してみます。
/julius-4.2.3/julius/julius -C /julius-kits/dictation-kit-v4.2.3/fast.jconf -charconv EUC-JP UTF-8
----------------------- System Information end -----------------------
*************************************************************
* NOTICE: The first input may not be recognized, since *
* no initial CMN parameter is available on startup. *
* for MFCC01*
*************************************************************
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: こんにちは 。
sentence1: こんにちは 。 - 無事日本語が認識されていたら、起動時にsnd-pcm-ossモジュールがロードされるように設定する。
sudo sh -c "echo snd-pcm-oss >> /etc/modules"
Juliusのインストール
- Juliusをインストールする。
cd /julius-4.2.3
make install - 以降は/julius-4.2.3/julius/juliusではなく、juliusで起動できます。
オリジナル単語辞書を作る
ここまでの手順では、認識率はぼちぼちだったと思います。
より認識率を上げるには、単語量を絞るのが簡単です。
そこでオリジナルの単語辞書を作ってみます。
- 単語辞書の元を作ります。単語と読みをタブ区切りで書きます。
このとき注意するのは、発音に忠実に書くことです。
例えば、「大トロ」の読みは「おーとろ」になります。
なお、最終行に改行が入らないようにしてください。
nano /sushi.yomi
マグロ まぐろ
漬けマグロ づけまぐろ
大トロ おーとろ
中トロ ちゅーとろ
イカ いか
タコ たこ
シャコ しゃこ
甘エビ あまえび
サーモン さーもん
えんがわ えんがわ
ハマチ はまち
コハダ こはだ
真イワシ まいわし
穴子 あなご
サンマ さんま
アジ あじ
〆サバ しめさば
イクラ いくら
ウニ うに
鉄火巻 てっかまき
かっぱ巻 かっぱまき
納豆巻 なっとまき
かんぴょう巻 かんぴょーまき - 次にこれを単語辞書形式に変換します。
cd /julius-4.2.3/gramtools/yomi2voca/
iconv -f utf8 -t eucjp /sushi.yomi | ./yomi2voca.pl > /julius-kits/dictation-kit-v4.2.3/sushi.dic - 変換した辞書を使用する設定ファイルを作成します。
nano /julius-kits/dictation-kit-v4.2.3/sushi.jconf
-w sushi.dic
-v model/lang_m/web.60k.htkdic
-h model/phone_m/hmmdefs_ptm_gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-zmeanframe
-rejectshort 800
-charconv EUC-JP UTF-8 - この設定ファイルを使ってjuliusを実行します。
julius -C /julius-kits/dictation-kit-v4.2.3/sushi.conf
トラブルシューティング
マイクが動作していないみたい…
USBオーディオアダプタを認識しているか確認しましょう。
lsusb
また、USBオーディオアダプタの優先度を確認しましょう。
cat /proc/asound/modules
「Error: adin_oss: failed to open /dev/dsp」というエラーメッセージが表示された
USBオーディオアダプタが認識されているか確認しましょう。
lsusb
認識されている場合は、snd-pcm-ossモジュールが組み込まれていないようです。組み込みましょう。
sudo modprobe snd-pcm-oss
julius-simpleを実行したら文字化けした
本ページではjulius本体を実行していますが、julius-simpleというものもあります。
しかし、Raspberry Piの環境(UTF-8)では、実行すると下記のようにsentence1が文字化けします。
sentence1: <s> ?エサ 7 クト 、ヒ、キ、ニ 、ッ、$オ、、 </s>
wseq1: 7 0 1 2 5 4 8
phseq1: silB | m i k a N | n a n a | k o | n i sh i t e | k u d a s a i | silE
cmscore1: 1.000 0.985 0.984 1.000 1.000 0.301 1.000
score1: -37910.882812
あいにくjulius-simpleではcharconvが効かないので、簡単には文字化けを解消できません。
解消する方法は、Julius • View topic - julius-simpleの結果表示が文字化けするをご覧ください。