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

日本語音声認識はてなブックマーク

Raspberry Pi大語彙連続音声認識エンジン Juliusをインストールして、日本語の音声認識をしてみます。

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

必要なもの

今回は上記のようにUSBオーディオアダプタを使いましたが、音声認識のみなら、USBマイクを使ってもいいと思います。

あるといいもの

手順

USBオーディオ(またはUSBマイク)の認識と動作確認

raspberry_pi.jpg
  1. Raspberry Piが起動していたら、シャットダウンする。
  2. USBハブをRaspberry Piに接続する。
    (右の写真では、スマホ用充電専用MicroUSBケーブルを使って、Raspberry Pi自体の電源もUSBハブから取っています。(黒いカールコード)
    通常の通信もできるMicroUSBケーブルを使うとループ接続になってしまうので、要注意です)
  3. USBオーディオアダプタと3.5mmミニプラグマイクの組み合わせ(あるいはUSBマイク)を、USBハブに接続する。
  4. Raspberry Piを起動する。
  5. 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.
  6. USBオーディオアダプタの優先度を確認する。(下記の場合、内蔵オーディオが優先されています。)
    cat /proc/asound/modules
    0 snd_bcm2835
    1 snd_usb_audio
  7. USBオーディオアダプタの優先度を上げる。
    nano /etc/modprobe.d/alsa-base.conf

    index=-2をindex=0にします。

    # options snd-usb-audio index=-2
    options snd-usb-audio index=0
  8. Raspberry Piを再起動する。
    sudo reboot
  9. USBオーディオアダプタの優先度を確認する。(下記の場合、USBオーディオアダプタが優先されてるようになりました。)
    cat /proc/asound/modules
    0 snd_usb_audio
    1 snd_bcm2835
  10. マイクの感度を最大にする。(録音してみて適宜調整してください)
    amixer sset Mic 16
  11. 録音と再生を確認する。録音できていたら、次に進む。
    arecord -r 16000 -f S16_LE test.wav
    aplay test.wav

Juliusのコンパイル

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

Juliusのインストール

  1. Juliusをインストールする。
    cd ~/julius-4.2.3
    make install
  2. 以降は~/julius-4.2.3/julius/juliusではなく、juliusで起動できます。

オリジナル単語辞書を作る

ここまでの手順では、認識率はぼちぼちだったと思います。

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

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


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

参考

Amazon

差分 一覧