読者です 読者をやめる 読者になる 読者になる

Raspberry Pi 2で音声認識・音声合成してみる

電波 Raspberry Pi

https://instagram.com/p/5l34vHJ35V/

Raspberry Pi 2で音声認識

 色々あってRaspberry Pi 2で音声認識をしたくなったので、やってみることにしました。基本的にはほぼネットで調べたことそのままですが、いくつかそのままじゃダメなところ等あったので、自分の備忘録としてまとめておきます。参考にしたサイトは参考リンクにまとめました。この記事読まずにそちらだけ読んでもよいかなと思います。

事前準備

 Raspberry Piの基本的なセットアップは済んでいる前提です。セットアップに関しては、以下記事を参照ください。

 音声認識するためには、Raspberry Piに音声入力してやる必要がありますが、Raspberry PiにはマイクついてないのでUSBマイクを繋いでやる必要があります。マイクは以下がRaspberry Piで実績がありよい感じです。

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

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

 後、音声を確認するためにヘッドフォンかアクティブスピーカを用意しましょう。

LOGICOOL ステレオスピーカー Z120BW

LOGICOOL ステレオスピーカー Z120BW

 音が出れば何でもよいのですが、どれを選べばよいかわからないという優柔不断な人へのオススメは上記のアクティブスピーカ。1500円の割によい音質。電源もRaspberry PiのUSB電源から供給できるのでグッドです。

 これ以降に関しては、Raspberry Piの基本的なセットアップ完了した後、USBマイクとスピーカを接続してから起動している前提で解説します。宇宙語が続くので興味ある人だけ続きを読むをクリック下さい。

音声関係設定

 USBマイクをぶっ刺したままRaspberry Piを起動したら、以下コマンドをうちましょう。

$ lsusb

 以下のような文字がずらずらっとでてきます。マイクっぽいのがあったらOK。下の例だとBus 001 Device 005: ID 0d8c:0134 C-Media Electronics, Inc. ね。多分

Bus 001 Device 002: ID 0424:9514 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 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 005: ID 0d8c:0134 C-Media Electronics, Inc. 

 次に以下コマンドでUSBオーディオアダプタの優先度を確認します。数字が小さい方が優先度高いので、usbオーディオアダプタsnd_usb_audioの優先順位が低いことがわかります。

$ cat /proc/asound/modules 

 実行結果

0 snd_bcm2835
1 snd_usb_audio
$ sudo vi /etc/modprobe.d/alsa-base.conf 

 options snd-usb-audio index=-2options snd-usb-audio index=0に書き換え。以下みたいな感じね

# options snd-usb-audio index=-2
options snd-usb-audio index=0

 再起動しましょう

$ sudo shutdown -r now


 再びUSBオーディオアダプタの優先度を確認しましょう(下記の場合、USBオーディオアダプタが優先されています)。

$ cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835

 マイクの感度を調整する

$ amixer sset Mic 50

Micの後の数字(上の例だと50ね)はマイクに応じて適宜調整しましょう。実行すると出てくる表示の最後の [81%]というのが感度です。
自分の場合は80%くらいだとちょうど良い感じでした。

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined penum
  Capture channels: Mono
  Limits: Capture 0 - 62
  Mono: Capture 50 [81%] [16.59dB] [on]

音声録音と音声出力

 音声録音と音声出力を試してみましょう。まずは、以下のコマンドでtest.wavというファイルに録音してやります。以下のコマンドを実行した後、マイクに声を吹き込みましょう。吹き込み終わったらCtrl+Cで終了して下さい。

arecord -r 16000 -f S16_LE test.wav

 次に音声出力です。まずは以下のコマンドでデバイスの確認

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 音声出力のコマンドは、例えば先ほど録音した「test.wav」というファイルを再生する場合は以下のような形式となります。

$ aplay -Dhw:[card, device] test.wav

 例えば上の場合だと、 [1,0]がスピーカ出力のオーディオ、[1,1]がHDMIのオーディオっぽいのでスピーカから音出したい場合は以下のように実行します。

$ aplay -Dhw:1,0 test.wav

 しょぼい自分の声が聞こえてきたらOK。

音声認識ソフト(Julius)ダウンロード

 Raspberry Piだと音声認識ソフトはJuliusというフリーのソフトが良いみたいです(ほぼ一択?)。以下サイトからダウンロード。

GitHub - julius-speech/julius: Open-Source Large Vocabulary Continuous Speech Recognition Engine
 自分が落としたバージョンは「julius-4.3.1」


GitHub - julius-speech/julius: Open-Source Large Vocabulary Continuous Speech Recognition Engine
 ディクテーション実行キット。最新版は「Linux版 DNN版Juliusディクテーション実行キット v4.3.1」ですが、参考サイトの例に従い「v4.2.3」をダウンロードしました。


GitHub - julius-speech/julius: Open-Source Large Vocabulary Continuous Speech Recognition Engine
 Linux版 Julius 記述文法音声認識キット v4.1

 ダウンロードしたファイルをSFTP等を使ってRaspberry Piに転送しましょう。よくわからない人は、下記記事のファイル転送の箇所を参照ください。

 後は、以下コマンドで解凍してインストールして下さい。

$ tar xvf julius-4.3.1.tar
$ cd julius-4.2.3
$ ./configure
$ make
$ sudo make install
$ tar xvf dictation-kit-v4.2.3.tar
$ tar xvf grammar-kit-v4.1.tar

 続いて以下実行。何故かは気にしない。

$ sudo modprobe snd-pcm-oss


 音声認識のデモ実行

$ julius -C ./julius-kits/dictation-kit-v4.2.3/fast.jconf -charconv EUC-JP UTF-8

 これで音声認識のデモが動作します。適当に喋って認識されればOK(おはようとかこんにちは等の簡単な言葉で)

動作が確認できたら/etc/modulesを編集

$ sudo vi /etc/modules

以下の行を追記して、起動時にsnd-pcm-ossが起動するようにする

snd-pcm-oss

 次に決まった単語のみ認識するように、専用の辞書を作成しましょう。

$ vi recog.yomi

 中身は例えば以下とします

檸檬ちゃん  レモンチャン

 辞書を変換して移動

$ iconv -f utf8 -t eucjp recog.yomi | yomi2voca.pl > recog.dic
$ mv recog.dic ./julius-kits/dictation-kit-v4.2.3


 juliusの設定ファイルを修正

$ vi ./julius-kits/dictation-kit-v4.2.3/recog.jconf

 内容は以下。これで専用の辞書を読み込むようになります。

-w recog.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/recog.jconf

 辞書にある言葉をマイクに話して以下みたいな表示が出たらOK

<input rejected by short input>
STAT: skip CMN parameter update since last input was invalid

pass1_best: 檸檬ちゃん    
pass1_best_wordseq: 檸檬ちゃん
pass1_best_phonemeseq: silB l e m o n c h a n silE
pass1_best_score: -2330.755615
sentence1: 檸檬ちゃん
wseq1: 檸檬ちゃん
phseq1: silB l e m o n c h a n silE
cmscore1: 1.000
score1: -2330.755615


 他のアプリケーションから音声認識使いたいときは、juliusをモジュールモードで走らせる必要があります。モジュールモードにするには設定ファイルを変更します。ファイルを以下のコマンドで開き、末尾1行に-moduleを追加して閉じましょう

$ vi ./julius-kits/dictation-kit-v4.2.3/recog.jconf


 あとは以下のコマンドを実行するとモジュールモードでjuliusが起動します。

$ julius -C ./julius-kits/dictation-kit-v4.2.3/recog.jconf

Raspberry Pi 2で音声合成

 ついでに音声合成もやってしまいましょう。ゆっくりの声に定評のあるAquestalkというソフトを使用します。以下のサイトの下の方にある「同意してダウンロード」をクリック(右側のサイドバーのDownloadではないので注意)

http://www.a-quest.com/products/aquestalkpi.html

 ダウンロードしたファイルをSFTP等を使ってRaspberry Piに転送しましょう。よくわからない人は、下記記事のファイル転送の箇所を参照ください。

 後は、ダウンロードしたファイルを解凍して、ディレクトリに移動して実行するだけ。

$ tar xvf aquestalkpi-20130827.tar
$ cd aquestalkpi
$ ./AquesTalkPi "こんにちは" |  aplay -Dhw:1,0

 これでしゃべってくれるはずです。簡単ですね。
 ちなみにAquestalkは、個人利用なら問題ないですが、商業用に使う場合はライセンス購入の必要がありますので注意下さい。

まとめ

 これで一通りRaspberry Pi2の音声周りは整備できたことになります。これで色々できそうですね。具体的なアプリケーションに関しては、ちょっとしたものを作ったので、気が向いたらまた紹介します。

追記(2015/09/05)

作ってみたよ!