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/06/05
- メディア: Personal Computers
- 購入: 4人 クリック: 29回
- この商品を含むブログ (3件) を見る
このマイクの入力音声はモノラルの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)
遅いですけど一応動きました。