DesignAssembler

備忘録に近い

Raspberry PiでJuliusを使った音声認識(外部連携編)

こんにちは。

先日の投稿の続きです。事前に見ておいたほうがいいと思います。

hyottokoaloha.hatenablog.com


この投稿の最後で述べたモジュールモードを使って遊んでみます。

自分はRubyしか使えないRubyが好きなのでRubyで組みます。

はじめに少し説明をします。

Juliusのモジュールモード

Juliusをモジュールモードで起動することにより、他のアプリケーションからJuliusを使えるようになります。

モジュールモードで起動されたJuliusはポート番号10500で接続待ちをします。ここでクライアントから接続されると音声認識待ちになり、実際に認識した時のクライアントへの出力はXMLで送られます。

前記事でも紹介しましたが、公式のリファレンス第10章がわかりやすくなっています。

第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の窓です。

f:id:hyottokoaloha:20150702171300j:plain

非常に見にくいのですが、「こんにちは」を認識してLEDが光りました。

f:id:hyottokoaloha:20150703103457j:plain

問題点

認証に時間がかかる
今回の認証、「こんにちは」と発言してからLEDがチカチカするまで15秒ほどかかりました。これはいくらなんでも時間がかかりすぎています。

辞書登録をすればこれを解消することができます。

辞書登録

Juliusには、あらかじめ単語を登録しておくことでその単語の認識速度と精度を向上させる辞書システムがあります。

第7章 言語モデル

これを使って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の世界)に少し近づくことができるような気がします。



参考

非常にためになりました。ありがとうございます。

Devel/電子工作/RaspberryPi/日本語音声認識 - cubic9.com