RAPIRO(ラピロ)の音声制御 Ver. 2.0 その1

th_rapiro_head_busy

ラピロの音声制御はちょうど1年ぐらい前にやったことがあるのですが、あのときは完全にデモ用というか、ラピロの頭の後ろからUSBマイクのコードがビローンと伸びている状態でしたし、できることも、ほぼラピロのデフォルト動作だけでした。

あれから色々カスタマイズした結果、家電を制御できるようにもなったし、マイクもいい感じにラピロの中に埋め込むことができたので、もうちょっと実用的な音声制御にチャレンジしたいと思います。具体的には、ラピロに「おやすみ!」と呼びかけたら、部屋の照明を消してくれる、というものを作ってみたいと思います。ウチの場合、照明のリモコンが意外とあっちゃこっちゃどっかいってしまうもので。

基本的に、以下の記事を参考に進めていきます。

過去の自分の記事も参考にしていますが、あのときとは進め方が変わっているところがちらほら出てきます。

 

すでにUSBオーディオの設定はできているものとして、一応、以下のコマンドでマイクとスピーカーのテストをします。

$ arecord -r 16000 -f S16_LE test.wav

Ctrl + Cで録音終了。

$ aplay test.wav

で、録音した音声が再生されればOK。USBオーディオの設定については、こちらの方の記事を参考にしていただればよいかと思います。

ちなみに、上記の記事と同じく、USBオーディオにはこれまでPLANEX USBオーディオ変換アダプタ PL-US35APを使っていたのですが、自分のラピロの頭の中がだいぶビジィな感じになってきてしまっていたので、もう少し小型の以下に交換しました。

ラピロの頭の後ろのUSB口に突き刺すと大変不恰好になってしまいますが、自分みたいにラピロの頭の中に組み込む場合は、こちらの方が小型で良い感じです。

th_rapiro_head_busy

。。。ま、それでもこんな感じなんですけれども。

PLANEXのものから差し替えるだけで、そのまま動いてくれました。他にもRaspberry Piで動作確認済みのUSBオーディオデバイスについては、こちらにまとめられています。

ちょっと横道に逸れてしまいましたが、続きです。音声認識エンジンのJuliusを準備します。バイナリ版も試してみたのですが、バイナリファイルが結局実行できなかったので、ソースからビルドしていきます。

$ wget --trust-server-names "http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F60273%2Fjulius-4.3.1.tar.gz"
$ tar xzvf julius-4.3.1.tar.gz

これで”julius-4.3.1″ディレクトリができるので、以下を実行してビルド&インストールします。

$ cd julius-4.3.1/
$ ./configure
$ make
$ sudo make install

続いて、ディクテーションキットのダウンロードです。

$ wget --trust-server-names "http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz"
$ tar xzvf dictation-kit-v4.3.1-linux.tgz

これで”dictation-kit-v4.3.1-linux”ディレクトリができます。

今回の用途では、ラピロにはとりあえず決まった言葉だけ理解してもらえるようになってくれれば良いので、認識率を上げるために、自前で単語辞書を作成します。

$ cd ..
$ vim rapiro.yomi

rapiro.yomiファイルの中は、”単語” + Tab + “単語の読み”です。とりあえずこんな感じで作ってみました。

ラピロ  らぴろ
ラピロさん  らぴろさん
何もない  なにもない
何もない  なんもない
ありがとう  ありがとう
おやすみ  おやすみ
おやすみなさい  おやすみなさい
おはよう  おはよう
電気消して  でんきけして
電気点けて  でんきつけて

なお、最終行に改行を入れてはいけないそうです。これを、Juliusの単語辞書形式に変換します。

$ cd ~/julius-4.3.1/gramtools/yomi2voca/
$ iconv -f utf8 -t eucjp ~/rapiro.yomi | ./yomi2voca.pl > ~/dictation-kit-v4.3.1-linux/rapiro.dic
$ cd ~/dictation-kit-v4.3.1-linux
$ vim -c ":e ++enc=euc-jp" rapiro.dic
ラピロ  r a p i r o
ラピロさん  r a p i r o s a N
何もない  n a n i m o n a i
何もない  n a N m o n a i
ありがとう  a r i g a t o u
おやすみ  o y a s u m i
おやすみなさい  o y a s u m i n a s a i
おはよう  o h a y o u
電気消して  d e N k i k e sh i t e
電気点けて  d e N k i ts u k e t e

ちゃんと変換されています。「文字コードはEUC-JPじゃないとダメ」という記述を見かけたので、とりあえずそれに従っています。

あとは、設定ファイル”rapiro.conf”を作成します。

-w rapiro.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-rejectshort 800

-charconv euc-jp utf8
-lv 2000

とりえあずこんな感じで。

準備としてはあと一つ、USBオーディオのカード番号の確認&指定が残っています。

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: U0x41e0x30d3 [USB Device 0x41e:0x30d3], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

これで番号が0であることがわかったので、環境変数ALSADEVに設定します。ラピロを起動するたびにexportするのも面倒なので、”~/.profile”に以下を追記して、ログインしたときに勝手にexportするようにします。

export ALSADEV=hw:0

今回はすぐに環境変数を反映させたいので、

$ source ~/.profile

も実行します。

$ echo $ALSADEV
hw:0

と表示されれば、環境変数の設定は完了です。

 

以上で準備OK。では、実行してみます。

$ cd ~/dictation-kit-v4.3.1-linux/
$ julius -C rapiro.conf
...
Error: adin_oss: failed to open /dev/dsp<br />failed to begin input stream

何かエラーが出るので、以下のモジュールを組み込みます。

$ sudo modprobe snd-pcm-oss

これで、再度実行してみます。

$ julius -C rapiro.conf

...

------
### read waveform input
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
pass1_best: ラピロ  
pass1_best_wordseq: ラピロ
pass1_best_phonemeseq: silB r a p i r o silE
pass1_best_score: -2225.139404
sentence1: ラピロ
wseq1: ラピロ
phseq1: silB r a p i r o silE
cmscore1: 0.998
score1: -2225.139404

<<< please speak >>>

こんな感じで、<<< please speak >>>の表示が出ているときに言葉を喋ると、ちゃんと認識してくれます。

ちなみに先ほどのモジュールの組み込みについて、Raspberry Piを再起動するとまた同じエラーが出てしまうので、起動時に自動でモジュールを組み込むようにする場合は、”/etc/modules”の末尾に”snd-pcm-oss”と記述しておけばOKです。

 

これでとりえあずJuliusを使えるようになったので、残る作業は

  • Juliusを音声認識サーバとして実行
  • Juliusから音声認識結果を受け取って、ラピロ制御用のWebサーバにリクエストを投げるプログラムを作成

です。後者のラピロ制御用のWebサーバの作り方は、こちらに書いています。初めはたかだか16行程度のプログラムでしたが、今は機能拡張を繰り返した結果、785行まで膨れ上がっております。。。

ちょっと長くなってしまったので、一旦ここまでにします。次回で実際に音声入力からのラピロ制御&家電制御を行います。