Top/Devel/電子工作/RaspberryPi/日本語音声認識

日本語音声認識 の変更点はてなブックマーク


[[Raspberry Pi>../]]に[[大語彙連続音声認識エンジン Julius>http://julius.osdn.jp/]]をインストールして、日本語の音声認識をしてみます。

OSのインストールやWiFiドングルのセットアップなどの初期設定は[[こちら>../Raspbianのインストール]]をご覧ください。

#amazon(B00T356SFO,left)
#amazon(B01CFHHYF4,left)
#clear

*必要なもの
#amazon(B007WSKGIE)
#amazon(B001A1PR4M)
-USBマイク(今回は[[PLANEX USBオーディオ変換アダプタ PL-US35AP>http://www.amazon.co.jp/exec/obidos/ASIN/B001A1PR4M/cubic9com-22]]と[[SANWA SUPPLY フラット型PCマイク MM-MC23>http://www.amazon.co.jp/exec/obidos/ASIN/B007WSKGIE/cubic9com-22]]を組み合わせました)~
PL-US35APのチップはC-Media製のCM119Aで、多くのLinuxディストリビューションで動作実績があります。

今回は上記のようにUSBオーディオアダプタを使いましたが、音声認識のみなら、[[USBマイク>http://www.amazon.co.jp/exec/obidos/ASIN/B0027WPY82/cubic9com-22]]を使ってもいいと思います。
#clear

*あるといいもの
#amazon(B0053N3NVW)
#amazon(B001QS17WA)
-セルフパワーUSBハブ(今回は[[iBUFFALO USB2.0ハブ セルフ&バスパワー 4ポート BSH4A01BK>http://www.amazon.co.jp/exec/obidos/ASIN/B001QS17WA/cubic9com-22]]を使いました)~
あるといいものと書きましたが、Raspberry Piの電源は弱いので、安定動作のためにはほぼ必須だと思います。
-USBスピーカー(今回は前述の[[PLANEX USBオーディオ変換アダプタ PL-US35AP>http://www.amazon.co.jp/exec/obidos/ASIN/B001A1PR4M/cubic9com-22]]と[[LOGICOOL ステレオスピーカー Z120BW>http://www.amazon.co.jp/exec/obidos/ASIN/B0053N3NVW/cubic9com-22]]を組み合わせました)~
正しくマイクが動作しているか確認する場合は必要です。~
3.5mmミニプラグスピーカーをRaspberry Piの端子に挿すのでもよいのですが、Raspberry Piのノイズを拾ってしまって、非常に音質が悪いです。

#clear



*手順
**USBオーディオ(またはUSBマイク)の認識と動作確認
#ref(../raspberry_pi.jpg,right,around,20%)
+Raspberry Piが起動していたら、シャットダウンする。
+USBハブをRaspberry Piに接続する。~
(右の写真では、スマホ用充電専用MicroUSBケーブルを使って、Raspberry Pi自体の電源もUSBハブから取っています。(黒いカールコード)~
通常の通信もできるMicroUSBケーブルを使うとループ接続になってしまうので、要注意です)
+USBオーディオアダプタと3.5mmミニプラグマイクの組み合わせ(あるいはUSBマイク)を、USBハブに接続する。
+Raspberry Piを起動する。
+USBオーディオアダプタを認識しているか確認する。下記の場合だとDevice 006がUSBオーディオアダプタです。
#code(bash,nonumber){{
lsusb
}}
>
#code(bash,nonumber){{
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オーディオアダプタの優先度を確認する。(下記の場合、内蔵オーディオが優先されています。)
#code(bash,nonumber){{
cat /proc/asound/modules
}}
>
#code(bash,nonumber){{
0 snd_bcm2835
1 snd_usb_audio
}}
<
+USBオーディオアダプタの優先度を上げる。
#code(bash,nonumber){{
nano /etc/modprobe.d/alsa-base.conf
}}
>index=-2をindex=0にします。
#code(bash,nonumber){{
# options snd-usb-audio index=-2
options snd-usb-audio index=0
}}
<
+Raspberry Piを再起動する。
#code(bash,nonumber){{
sudo reboot
}}
+USBオーディオアダプタの優先度を確認する。(下記の場合、USBオーディオアダプタが優先されてるようになりました。)
#code(bash,nonumber){{
cat /proc/asound/modules
}}
>
#code(bash,nonumber){{
0 snd_usb_audio
1 snd_bcm2835
}}
<
+マイクの感度を最大にする。(録音してみて適宜調整してください)
#code(bash,nonumber){{
amixer sset Mic 16
}}
+録音と再生を確認する。録音できていたら、次に進む。
#code(bash,nonumber){{
arecord -r 16000 -f S16_LE test.wav
aplay test.wav
}}

**Juliusのコンパイル
+Julius他をダウンロードする。(URLはOSDNを見て、適宜変えてください)
#code(bash,nonumber){{
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する。
#code(bash,nonumber){{
tar xvzf julius-4.2.3.tar.gz
cd julius-4.2.3
./configure
make
}}
+ディクテーションキットと文法認識キットを解凍する。
#code(bash,nonumber){{
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番です。)
#code(bash,nonumber){{
arecord -l
}}
>
#code(bash,nonumber){{
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
}}
<
+カード番号を環境変数に指定する。
#code(bash,nonumber){{
export ALSADEV=hw:0
}}
+いざJulius実行。何か話すと認識結果がターミナルに表示されます。
#code(bash,nonumber){{
~/julius-4.2.3/julius/julius -C ~/julius-kits/dictation-kit-v4.2.3/fast.jconf -charconv EUC-JP UTF-8
}}
+下記のようなエラーが出た場合は…
#code(bash,nonumber){{
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を実行してみます。
#code(bash,nonumber){{
~/julius-4.2.3/julius/julius -C ~/julius-kits/dictation-kit-v4.2.3/fast.jconf -charconv EUC-JP UTF-8
}}
>
#code(bash,nonumber){{
----------------------- 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
}}
<
+無事起動しました。何か話してみましょう。(下記は「こんにちは」と話した結果)
>
#code(bash,nonumber){{
pass1_best:  こんにちは 。
sentence1:  こんにちは 。
}}
<
+無事日本語が認識されていたら、起動時にsnd-pcm-ossモジュールがロードされるように設定する。
#code(bash,nonumber){{
sudo sh -c "echo snd-pcm-oss >> /etc/modules"
}}

**Juliusのインストール
+Juliusをインストールする。
#code(bash,nonumber){{
cd ~/julius-4.2.3
make install
}}
+以降は~/julius-4.2.3/julius/juliusではなく、juliusで起動できます。

*オリジナル単語辞書を作る
ここまでの手順では、認識率はぼちぼちだったと思います。

より認識率を上げるには、単語量を絞るのが簡単です。

そこでオリジナルの単語辞書を作ってみます。

~

+単語辞書の元を作ります。単語と読みをタブ区切りで書きます。~
このとき注意するのは、発音に忠実に書くことです。~
例えば、「大トロ」の読みは「おーとろ」になります。~
なお、最終行に改行が入らないようにしてください。
#code(bash,nonumber){{
nano ~/sushi.yomi
}}
>
#code(bash,nonumber){{
マグロ	まぐろ
漬けマグロ	づけまぐろ
大トロ	おーとろ
中トロ	ちゅーとろ
イカ	いか
タコ	たこ
シャコ	しゃこ
甘エビ	あまえび
サーモン	さーもん
えんがわ	えんがわ
ハマチ	はまち
コハダ	こはだ
真イワシ	まいわし
穴子	あなご
サンマ	さんま
アジ	あじ
〆サバ	しめさば
イクラ	いくら
ウニ	うに
鉄火巻	てっかまき
かっぱ巻	かっぱまき
納豆巻	なっとまき
かんぴょう巻	かんぴょーまき
}}
<
+次にこれを単語辞書形式に変換します。
#code(bash,nonumber){{
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
}}
+変換した辞書を使用する設定ファイルを作成します。
#code(bash,nonumber){{
nano ~/julius-kits/dictation-kit-v4.2.3/sushi.jconf
}}
>
#code(bash,nonumber){{
-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を実行します。
#code(bash,nonumber){{
julius -C ~/julius-kits/dictation-kit-v4.2.3/sushi.conf
}}

*トラブルシューティング
**マイクが動作していないみたい…
USBオーディオアダプタを認識しているか確認しましょう。
#code(bash,nonumber){{
lsusb
}}

また、USBオーディオアダプタの優先度を確認しましょう。
#code(bash,nonumber){{
cat /proc/asound/modules
}}

**「Error: adin_oss: failed to open /dev/dsp」というエラーメッセージが表示された
USBオーディオアダプタが認識されているか確認しましょう。
#code(bash,nonumber){{
lsusb
}}

認識されている場合は、snd-pcm-ossモジュールが組み込まれていないようです。組み込みましょう。
#code(bash,nonumber){{
sudo modprobe snd-pcm-oss
}}

**julius-simpleを実行したら文字化けした
本ページではjulius本体を実行していますが、julius-simpleというものもあります。

しかし、Raspberry Piの環境(UTF-8)では、実行すると下記のようにsentence1が文字化けします。

#code(bash,nonumber){{
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 &#8226; View topic - julius-simpleの結果表示が文字化けする>http://julius.osdn.jp/forum/viewtopic.php?f=14&t=24]]をご覧ください。

*参考
-[[橋本商会 &#187; Raspberry PiにRaspberry PiのUSB HUBから給電する>http://shokai.org/blog/archives/7865]]
-[[KURO-RSとJuliusで家電をコントロールしてみた : アシアルブログ>http://blog.asial.co.jp/879]]

*Amazon
#amazon(B00T356SFO,left)
#amazon(B00SXYGOQ4,left)
#amazon(B01CFHHYF4,left)
#amazon(480071172X,left)
#amazon(B007WSKGIE,left)
#amazon(B001A1PR4M,left)
#amazon(B0053N3NVW,left)
#amazon(B001QS17WA,left)
差分 一覧