Raspberry PiでJuliusを使った音声認識(外部連携編)
こんにちは。
先日の投稿の続きです。事前に見ておいたほうがいいと思います。
この投稿の最後で述べたモジュールモードを使って遊んでみます。
自分はRubyしか使えないRubyが好きなのでRubyで組みます。
はじめに少し説明をします。
Juliusのモジュールモード
Juliusをモジュールモードで起動することにより、他のアプリケーションからJuliusを使えるようになります。
モジュールモードで起動されたJuliusはポート番号10500で接続待ちをします。ここでクライアントから接続されると音声認識待ちになり、実際に認識した時のクライアントへの出力はXMLで送られます。
前記事でも紹介しましたが、公式のリファレンス第10章がわかりやすくなっています。
Rubyのコード
Socketで接続受けて返ってきたxmlをパースするだけです。パースして受け取った値をキーにして何か実行します。
ちなみに、perlで書かれたクライアントのコードが
/julius-4.3.1/jclient-perl
内にあります。
# encoding: utf-8 require 'socket' require 'nokogiri' host = "localhost" port = 10500 sock = TCPSocket.open(host,port) source = "" while true ret = IO::select([sock]) ret[0].each do |s| source += sock.recv(65535) if source[-2..source.size] == ".¥n" source.gsub!(/¥.¥n/,"") xml = Nokogiri(source) words = (xml/"RECOGOUT"/"SHYPO"/"WHYPO").inject("") {|ws,w| ws + w["WORD"]} if words == "こんにちは。" puts "blink led" io = open("sys/class/gpio/export","w") io.write(17) io.close dir = open("/sys/class/gpio/gpio17/direction","w") dir.write("out") dir.close out = 1 20.times do val = open("/sys/class/gpio/gpio17/value","w") val.write(out) val.close out = out == 1? 0:1 sleep 0.5 end unexport = open("/sys/class/gpio/unexport","w") unexport.write(17) unexport.close end end source = "" end end end
実行する
Raspberry Piで実行します。左がRubyで右がJuliusの窓です。
非常に見にくいのですが、「こんにちは」を認識してLEDが光りました。
問題点
認証に時間がかかる
今回の認証、「こんにちは」と発言してからLEDがチカチカするまで15秒ほどかかりました。これはいくらなんでも時間がかかりすぎています。
辞書登録をすればこれを解消することができます。
辞書登録
Juliusには、あらかじめ単語を登録しておくことでその単語の認識速度と精度を向上させる辞書システムがあります。これを使ってJuliusの認証速度を上げてみます。
/dictation-kit-v4.3.1-linux内にwords.yomiを作成してください。ここに単語を登録していきます。
# /dictation-kit-v4.3.1-linux/words.yomi
こんにちは こんにちわ
こんばんは こんばんわ
ここで、空白はスペースではなくてタブであることに気をつけて下さい。
次に、この.yomiファイルを.dicファイルに変換します。
$ cd julius-4.3.1/gramtools/yomi2voca
でフォルダ移動してください。
そして
$ iconv -f utf8 -t eucjp ~/dictation-kit-v4.3.1-linux/words.yomi | ./yomi2voca.pl > ~/dictation-kit-v4.3.1-linux/words.dic
次に/dictation-kit-v4.3.1-linux内のmain.jconfを編集します。
以下の行をmain.jconf内に追加してください。
-w words.dic
これで辞書登録は完了です。
まとめ
今、スマートフォン(のOS)には当たり前のように音声認識の機能が組み込まれています。
ですが、実際日常的にこれらの機能を使う人はさほど多くないです。この理由はもちろん「手を使ったほうが早いから」です。
では、音声認識が最も活用される場合は何でしょう。それは「手が使えない場合」です。
具体的に、手が使えない場合にはどんな事が考えられるでしょうか。
・車、自転車の運転中
・両手に荷物を持っている時
・サッカーの試合中
車載音声認識は既に存在して、ベンツのこんなものがありました。
http://www.mercedes-benz.jp/myservice/home/info/manual/pdf/voice/voice_MBJCSD34500-081303000A.pdf
車の中は閉ざされた空間ということもあって、声を発しやすいので発達しているのでしょうね。
閉ざされた空間でないと声を発するのに臆してしまう問題があります。車以外だと自宅が閉ざされた空間になりますよね。自宅内での音声認識についても考えてみます。
最近、スマートハウスが取り沙汰されています。www.smart-homes.jp
モバイル端末で家の中を制御しようというシステムです。つまり、「家の自動化」です。アメリカのスマートホーム事情の記事がありました。www.gizmodo.jp
まあ、日本ではこんなことないでしょうけど・・・
実際、機能の1つ1つ(例えば、スマートフォンから部屋のエアコンのスイッチを入れる)は比較的楽に実装できます。今や似非スマートホームなら個人で再現可能です。
このスマートホームをスマートフォンじゃなくて音声認識により行うことが出来ればまた趣が変わってくると思います。
Juliusのような個人で利用できる(と言ってもITのスキルが必須)システムが普及すれば音声認識の敷居はぐっと下がります。
音声認識の普及でVR(SFの世界)に少し近づくことができるような気がします。
参考
非常にためになりました。ありがとうございます。