リアルつぶやきをTwitterに投稿する

たまにはErlang以外のワンポイント技術ネタでも。
誰もいないときに「みんな死ねばいいのに」とか思わず口に出してしまうことってありますよね? そんなリアルつぶやきが虚空に消えるのは勿体ないと思って作ったのが今回の音声認識twitter投稿システムです。基本的なアーキテクチャは、

  1. マイクに向かって喋る
  2. マイクを見ていた音声認識エンジンが音声認識
  3. プラグイン経由で、認識結果(文字列)をtwitter投稿スクリプトに食わせる
  4. 投稿完了

という感じ。一応動いてますが大したことしてません。Android携帯で動画も撮ってみたのですがイマイチだったり。

デモ

音声認識エンジン

使っている音声認識エンジンは、Juliusです。プラグイン機構を使って、認識結果のセンテンスが得られたときにsystem(3)を使ってTwitter書き込みスクリプトを呼び出しているだけです。面倒なのは文字コードの調整などですが、日本語音声認識の面倒臭さに天と地ほどの差がありますからね。しかもJuliusが優れているのは、Linux, Windows, MacOS, (FreeBSD?)などで問題なく動いており、かなりの動作実績を持っている点です。macportsとかapt packageとかそろそろあってもいいんじゃないのと思います。

認識結果をTwitterへ投稿

Twitterへ投稿するスクリプトは、macportsを適当に漁ったらpy25-twitterというパッケージがあったのでそちらを利用しました*1python-twitterという、googleの中の人が作ったスクリプトみたいです。細かい仕様は完全無視して、とりあえず投稿だけするスクリプトを作りました。あと、JuliusはデフォルトでEUC-JPで出してくれる*2ので、そいつをunicodeに書き換えるのがこのスクリプトの仕事。

import twitter
import sys

if __name__ == '__main__':
    api = twitter.Api("kuenishi", "*******")
    if len(sys.argv) > 1:
        post  = unicode(''.join(sys.argv[1:]), 'euc-jp')
        status = api.PostUpdate(post)
        print "posted '%s' on %s by %s" % (status.text, status.created_at, status.user.name)

プラグインもいろいろ書いてあるけど、本当に大したことしてないので略。Juliusは研究用ソフトウェアなので、あんましユーザフレンドリーではないところがあったりする。dictation-kitというのを入れておくと認識エンジンの辞書なんかが全部入りになっているので楽です。
正直いって音声認識の精度はあまり高くありません(認識例1認識例2正解)。速度重視のセッティングな上に、マクブクのファンか何かの雑音が入っているようで、よほど丁寧に発音しないと正しく認識されません。また、辞書にない単語も認識されません。あと、雑音に弱いです(これは音声認識の難題)。頑張って音響モデルや言語モデルをチューニングするか、TLを使ってオンライン学習(Juliusでできたかどうか不明ですが)するとか、もしくはもっと賢いアルゴリズムを使うとかすれば、もちょっとマシになったりするかもですが。

Related Works

*1:py-twitterを使うとpython24のビルドが始まったりするので気をつけて

*2:辞書がEUCで書かれてるからだと思う