日本語音声認識
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オーディオアダプタです。
lsusbBus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 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 HUBBus 001 Device 006: ID 0d8c:013a C-Media Electronics, Inc.
- USBオーディオアダプタの優先度を確認する。(下記の場合、内蔵オーディオが優先されています。)
cat /proc/asound/modules0 snd_bcm28351 snd_usb_audio
- USBオーディオアダプタの優先度を上げる。
nano /etc/modprobe.d/alsa-base.conf
- index=-2をindex=0にします。
# options snd-usb-audio index=-2options snd-usb-audio index=0
- Raspberry Piを再起動する。
sudo reboot
- USBオーディオアダプタの優先度を確認する。(下記の場合、USBオーディオアダプタが優先されてるようになりました。)
cat /proc/asound/modules0 snd_usb_audio1 snd_bcm2835
- マイクの感度を最大にする。(録音してみて適宜調整してください)
amixer sset Mic 16
- 録音と再生を確認する。録音できていたら、次に進む。
arecord -r 16000 -f S16_LE test.wavaplay test.wav
Juliusのコンパイル
- Julius他をダウンロードする。(URLはOSDNを見て、適宜変えてください)
cdwget --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.gzcd julius-4.2.3./configuremake
- ディクテーションキットと文法認識キットを解凍する。
mkdir /julius-kitscd /julius-kitstar xvzf /dictation-kit-v4.2.3.tar.gztar 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/dspfailed 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 = 16000HzStat: adin_oss: going to set latency to 50 msecStat: 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.3make 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の結果表示が文字化けするをご覧ください。