Raspberry Pi で音声認識

Raspberry Piオープンソースの日本語音声認識ソフトJuliusをコンパイル・実行してみました。

ダウンロード、ビルド

http://julius.sourceforge.jp/ からSource(tarball)をダウンロードします。
執筆時点で julius-4.2.3.tar.gz です。
またディクテーションキット、文法認識キットをダウンロードします。
それぞれ dictation-kit-v4.2.3.tar.gz, grammar-kit-v4.1.tar.gz です。

juliusのコンパイル

% tar xvf julius-4.2.3.tar.gz
% cd julius-4.2.3
% ./configure
% make
% cd julius-simple
% make

ディクテーションキット、文法認識キットを適当な場所に展開

% mkdir -p ~/lib/julius
% cd ~/lib/julius
% tar xvf <dounload dir>/dictation-kit-v4.2.3.tar.gz
% tar xvf <download dir>/grammar-kit-v4.1.tar.gz

マイク

Raspberry Piにはオーディオの入力がないので、USBマイクなどを使います。
以前買ったやつでもいいんですが、今回はとりあえずこれで進めました。

【2009年モデル】ELECOM USBスタンドマイク ブラック (PS3対応) HS-MC02UBK

【2009年モデル】ELECOM USBスタンドマイク ブラック (PS3対応) HS-MC02UBK

(注)USBハブをかませるとどうにもまともな音が録れませんでした。USBオーディオバイスRaspberry PiのUSBポートに直接挿した方がいいです。

このマイクの入力音声はモノラルの44.1kHz固定です。
juliusは16kHzの音声を使用するので44.1kHzを16kHzに変換する必要がありますが、以下の2つの方法を試しました。

1. juliusの -48 オプションで48kHz入力を->16kHzにダウンサンプルする
44.1kHz入力の場合は14.7kHzになってしまいますが、まあまあ大丈夫です。

2. pulseaudioを使ってリサンプルする
resample-method = trivial という設定をするのですが、trivialってどんなん?と思いつつもとりあえず大丈夫そうです。
以下ではこちらの方法を紹介します。

pulseaudioのインストールと設定

% sudo apt-get install pulseaudio

/etc/pulse/daemon.conf に以下の設定をします。

resample-method = trivial

起動(ALSAにアクセスにいけば自動で起動するので、マニュアルで起動する必要はないと思います)

pulseaudio -D

音声入力デバイスが1つしかない場合は必要ないかもしれませんが、一応入力デバイスを確認し、デフォルトのソースを選択します。

% pactl list short sources
0       alsa_output.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00-Device.analog-stereo.monitor   module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
1       alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00-Device.analog-mono      module-alsa-card.c      s16le 1ch 48000Hz       SUSPENDED
2       alsa_output.platform-bcm2835_AUD0.0.analog-stereo.monitor       module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED

この場合は1をソースにしたいので、

% pacmd set-default-source 1
Welcome to PulseAudio! Use "help" for usage information.
>>> >>>

とします。

これで音声が録音できるかどうか確認しましょう。alsamixerで入力音量を調整してから、arecordで録音してみます。

% arecord -c 1 -r 16000 -f S16_LE a.wav

a.wavを再生して、音声を確認してみてください。しょぼいデバイスだと電源ノイズとかが乗ってたりしがちですが、
音声認識にはあまり影響しないはずなんで(たぶん)とりあえず気にせず、サンプリングレートがきちんとあってることだけ確認して進めます。

動かしてみる

pulseaudioを使用しない場合は、juliusへの入力デバイスを選択するには環境変数ALSADEVを設定します。
(pulseaudioを使用する場合は設定しないでください)

% export ALSADEV=hw:1
グラマーキット動作例
% julius-simple -C ~/lib/julius/grammar-kit-v4.1/testmic.jconf
STAT: include config: /home/penkoba/lib/julius/grammar-kit-v4.1/testmic.jconf
STAT: include config: /home/penkoba/lib/julius/grammar-kit-v4.1/hmm_ptm.jconf
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
 :
<<< please speak >>>

(「みかんよんこをください」と発話)

sentence1: <s> 蜜柑 4 個 を ください </s>
wseq1: 7 0 1 2 3 4 8
phseq1: silB | m i k a N | y o N | k o | o | k u d a s a i | silE

cmscore1: 1.000 0.999 0.993 1.000 1.000 1.000 1.000
score1: -4083.436279
<<< please speak >>>

それなりに認識します。

ディクテーションキット動作例
% julius-simple -C ~/lib/julius/dictation-kit-v4.2.3/fast.jconf
STAT: include config: /home/penkoba/lib/julius/dictation-kit-v4.2.3/fast.jconf
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
Stat: read_binhmm: binary format HMM definition
 :
<<< please speak >>>

(「きょうわいいてんきですね」と発話)

sentence1:  今日 は いい 天気 です ね 。 
wseq1: <s> 今日:{キョー/コンニチ}:今日:536 は:ワ:は:66 いい:イイ:いい:38 天気:テンキ:天気:507 です:デス:です:121 ね:ネ:ね:67 。:。:。:8 </s>
phseq1: silB | ky o: | w a | i i | t e N k i | d e s u | n e | sp | silE

cmscore1: 0.864 0.054 0.354 0.223 0.409 0.826 0.269 0.387 1.000
score1: -4337.769531 (AM: -4236.425293  LM: -101.344154)

遅いですけど一応動きました。

まとめ

一応、日本語音声認識が動きました。
ディクテーションは(予想通り)処理能力的にちょっと無理がありますが、グラマーありの用途ならばまあまあ使えそうです。
別のUSBオーディオを使った入力も試してみたところ音声のクオリティはだいぶ良かったので、
きちんと性能を出したい場合はそれなりの音声入力環境を整える必要があります。(って当たり前のこと書いてますが...)