2015年4月11日土曜日

オープンソース版SiriのSirius試してみた

最近はブログのネタに事欠かなくて非常に幸せです。こんばんは。

さてある日twitterを眺めていたらこんなツイートが↓
ファッ?!ってなりますよね?
なりますよね!!!

非常に気になって記事を見てみたのですが、
「Siriusとは、音声認識、画像マッチング、自然言語処理および質疑応答システムなどのIPA(インテリジェントパーソナルアシスタント)の中心的機能を果たすものである」
と書かれています。
どうやらSiriと同等の機能を提供することを目標に開発されているようです。

もともとこのへんの分野が非常に好きな私としては試さずにはいられません。
しかも(なぜか)都合よく、VM2つ3つ起動できるスペックのマシンを発注していたので、早速試してみました。

インストールとか

プロダクトのページは http://sirius.clarity-lab.org/ で、ソースコードはgithubの https://github.com/jhauswald/sirius で公開されています。

インストール自体は書かれている手順通りにやれば基本的には問題ないのですが、いかんせん依存ライブラリが多い(http://sirius.clarity-lab.org/index.html%3Fp=9.html#install のPrerequisites参照)です。
で、たまたま最近Dockerに興味があったので、これ幸いと環境構築に使うことにします。
なお、当然ながら同じこと考えていた人がおり、プルリク投げられていた のでDockerfile作成の参考にしています。(せっかくなのでこちらはUbuntu14.04)

今回使った環境は以下の通りです。
  • ホスト
    • OS
      • Windows7 64bits
    • メモリ
      • 16GB
    • CPU
      • 8コア
  • ゲストOS
    • OS
      • Ubuntu 14.04
    • メモリ割り当て
      • 2GB
    • CPU
      • 1コア

Windows上にVMでUbuntuを起動して、その上でDockerを動かす構成にしています。

VMをWindows上のVirtualBoxで動かすので、Vagrantの力も借ります。
Vagrantfileの書き方やDockerとの連携については、以下のページを参考にしています。ありがとうございます。


本題ではないのでVagrantfileとDockerfileの中身については説明を省きますが、gistに置いて*1ますので気になる方はどうぞ。*2, *3

ということでVagrantfileとDockerfileの準備ができたので、早速VMを起動しコンテナを作成します。
$ cd ${VAGRANT_DIR}
$ vagrant up

たったこれだけ。簡単ですね。
ちなみに手元の環境だと、依存ライブラリのインストールからSirius本体のビルドなどが終わるまで数時間かかっています。(おそらくゲストOSに割り当てているリソースが少ない上に、無線で繋いでいたのでなおさら悪い)

動かしてみる

準備が整ったので早速動かしてみます。
動かし方は公式のドキュメントに記載のとおりです。

Automatic Speech Recognition (ASR) [音声認識]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-asr-server.sh pocketsphinx &
注意:start-<service>-server.shはフォアグラウンドで動きます。

テストクエリ送信

$ ./sirius-asr-test.sh ../inputs/questions/what.is.the.speed.of.light.wav

結果

Your audio file is:
../inputs/questions/what.is.the.speed.of.light.wav
Sending request to server localhost:8081/ ...
transcript []: what is the speed of light
 what is the speed of light
***********************************************
正しく認識してくれているようです。

Image Matching (IMM) [画像認識]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-imm-server.sh &

テストクエリ送信

$ ./sirius-imm-test.sh ../image-matching/matching/landmarks/query/query.jpg

結果

(1) Your image file is:
../image-matching/matching/landmarks/query/query.jpg
img: tower-pisa.jpg data: tower pisa
Image data: tower pisa
画像はピサの斜塔なので正解です。

Question-Answering System (QA) [質問応答]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-qa-server.sh &

テストクエリ送信

$ ./sirius-qa-test.sh "what is the speed of light"
注意:質問文はなんでもよい様子

結果

(1) Your query text is:
what is the speed of light
(2) Sending request to server...
Query str: query=what%20is%20the%20speed%20of%20light

+++++ Analyzing question (2015-04-11 08:53:20) +++++
Normalization: what be the speed of light

Answer types:
NErate->NEspeed

Interpretations:
Property: SPEED
Target: light

Predicates:
-

+++++ Generating queries (2015-04-11 08:53:22) +++++
Query strings:
speed light
("speed of light" OR "light speed")
"light" speed light
"the speed of light is"
"is the speed of light"

+++++ Searching (2015-04-11 08:53:22) +++++

+++++ Selecting Answers (2015-04-11 08:53:34) +++++
Filter "AnswerTypeFilter" started, 64 Results (2015-04-11 08:53:34)
Filter "AnswerTypeFilter" finished, 81 Results (2015-04-11 08:53:35)
Filter "AnswerPatternFilter" started, 81 Results (2015-04-11 08:53:35)
Filter "AnswerPatternFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "PredicateExtractionFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "PredicateExtractionFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "FactoidsFromPredicatesFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "FactoidsFromPredicatesFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "TruncationFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "TruncationFilter" finished, 408 Results (2015-04-11 08:53:46)
Filter "StopwordFilter" started, 408 Results (2015-04-11 08:53:46)
Filter "StopwordFilter" finished, 371 Results (2015-04-11 08:53:46)
Filter "QuestionKeywordsFilter" started, 371 Results (2015-04-11 08:53:46)
Filter "QuestionKeywordsFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "ScoreNormalizationFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "ScoreNormalizationFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "ScoreCombinationFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "ScoreCombinationFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "FactoidSubsetFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "FactoidSubsetFilter" finished, 338 Results (2015-04-11 08:53:46)
Filter "DuplicateFilter" started, 338 Results (2015-04-11 08:53:46)
Filter "DuplicateFilter" finished, 172 Results (2015-04-11 08:53:46)
Filter "ScoreSorterFilter" started, 172 Results (2015-04-11 08:53:46)
Filter "ScoreSorterFilter" finished, 172 Results (2015-04-11 08:53:46)
299,792,458 meters per second
***********************************************
光速は約30万km/sなので、正しく応答してくれていそうです。

余談

出身地で動かしてみたくなったので、以下のクエリを投げ込んでみました。
$ ./sirius-qa-test.sh "where is saga?"

結果

(1) Your query text is:
where is saga?
(2) Sending request to server...
Query str: query=where%20is%20saga%3F

+++++ Analyzing question (2015-04-11 08:54:24) +++++
Normalization: where be saga

Answer types:
NElocation

Interpretations:
Property: PLACE
Target: saga

Predicates:
-

+++++ Generating queries (2015-04-11 08:54:24) +++++
Query strings:
saga
saga
"saga" saga
"saga is in"
"saga is at"

+++++ Searching (2015-04-11 08:54:24) +++++

+++++ Selecting Answers (2015-04-11 08:54:27) +++++
Filter "AnswerTypeFilter" started, 24 Results (2015-04-11 08:54:27)
Filter "AnswerTypeFilter" finished, 345 Results (2015-04-11 08:54:30)
Filter "AnswerPatternFilter" started, 345 Results (2015-04-11 08:54:30)
Filter "AnswerPatternFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "PredicateExtractionFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "PredicateExtractionFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "FactoidsFromPredicatesFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "FactoidsFromPredicatesFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "TruncationFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "TruncationFilter" finished, 4301 Results (2015-04-11 08:54:46)
Filter "StopwordFilter" started, 4301 Results (2015-04-11 08:54:46)
Filter "StopwordFilter" finished, 3440 Results (2015-04-11 08:54:48)
Filter "QuestionKeywordsFilter" started, 3440 Results (2015-04-11 08:54:48)
Filter "QuestionKeywordsFilter" finished, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreNormalizationFilter" started, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreNormalizationFilter" finished, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreCombinationFilter" started, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreCombinationFilter" finished, 3096 Results (2015-04-11 08:54:48)
Filter "FactoidSubsetFilter" started, 3096 Results (2015-04-11 08:54:48)
Filter "FactoidSubsetFilter" finished, 3077 Results (2015-04-11 08:54:48)
Filter "DuplicateFilter" started, 3077 Results (2015-04-11 08:54:48)
Filter "DuplicateFilter" finished, 876 Results (2015-04-11 08:54:57)
Filter "ScoreSorterFilter" started, 876 Results (2015-04-11 08:54:57)
Filter "ScoreSorterFilter" finished, 876 Results (2015-04-11 08:54:57)
Icelandic
***********************************************
Icelandic……?
佐賀はアイスランドだった……?

Combining Services [システム連携]

(この例はASR→QAという連携のようです)

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-asr-server.sh pocketsphinx &
$ ./start-qa-server.sh &

テストクエリ送信

./sirius-asr-qa-test.sh ../inputs/real/what.is.the.capital.of.italy.wav

結果

Your voice search (text) is:
../inputs/real/what.is.the.capital.of.italy.wav
Sending request to ASR server...
transcript []: what is the capital affiliate
Sending request to QA server...
Query str: query=what%20is%20the%20capital%20affiliate

+++++ Analyzing question (2015-04-11 09:02:06) +++++
Normalization: what be the capital affiliate

Answer types:
NElocation

Interpretations:
Property: NAME
Target: capital affiliate
Property: DEFINITION
Target: capital affiliate

Predicates:
-

+++++ Generating queries (2015-04-11 09:02:06) +++++
Query strings:
capital affiliate
"the capital" affiliate
"capital affiliate" capital affiliate
"capital affiliate" capital affiliate
"the capital affiliate is"
"is the capital affiliate"

+++++ Searching (2015-04-11 09:02:06) +++++

+++++ Selecting Answers (2015-04-11 09:02:11) +++++
Filter "AnswerTypeFilter" started, 37 Results (2015-04-11 09:02:11)
Filter "AnswerTypeFilter" finished, 505 Results (2015-04-11 09:02:15)
Filter "AnswerPatternFilter" started, 505 Results (2015-04-11 09:02:15)
Filter "AnswerPatternFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "PredicateExtractionFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "PredicateExtractionFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "FactoidsFromPredicatesFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "FactoidsFromPredicatesFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "TruncationFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "TruncationFilter" finished, 787 Results (2015-04-11 09:02:16)
Filter "StopwordFilter" started, 787 Results (2015-04-11 09:02:16)
Filter "StopwordFilter" finished, 757 Results (2015-04-11 09:02:16)
Filter "QuestionKeywordsFilter" started, 757 Results (2015-04-11 09:02:16)
Filter "QuestionKeywordsFilter" finished, 724 Results (2015-04-11 09:02:16)
Filter "ScoreNormalizationFilter" started, 724 Results (2015-04-11 09:02:16)
Filter "ScoreNormalizationFilter" finished, 724 Results (2015-04-11 09:02:16)
Filter "ScoreCombinationFilter" started, 724 Results (2015-04-11 09:02:16)
Filter "ScoreCombinationFilter" finished, 722 Results (2015-04-11 09:02:16)
Filter "FactoidSubsetFilter" started, 722 Results (2015-04-11 09:02:16)
Filter "FactoidSubsetFilter" finished, 722 Results (2015-04-11 09:02:16)
Filter "DuplicateFilter" started, 722 Results (2015-04-11 09:02:16)
Filter "DuplicateFilter" finished, 435 Results (2015-04-11 09:02:17)
Filter "ScoreSorterFilter" started, 435 Results (2015-04-11 09:02:17)
Filter "ScoreSorterFilter" finished, 435 Results (2015-04-11 09:02:17)
New York City
***********************************************
イタリアの首都(=ローマ)はなにか?が元の音声なので、ニューヨークと答えてるのはNGですね。
ただ音声認識の結果が "what is the capital affiliate" なので、"affiliate" からアメリカを連想できているのはいい感じかもしれません。

ということで、同梱されているデータだけではまだ精度的に厳しい部分もありそうですが、いわゆる音声認識での対話システムみたいなものが簡単に実現できそうな感じです。(Combining Serviceあたりが想像しやすいでしょうか)
日本語に対応しているかは未確認ですが、ぜひ対応して欲しいですね!(自分でやれ)

*1:気が向いたら本家にプルリク投げるか…?
*2:余談その1:Ubuntuは12と14で微妙に差異があったのでいろいろハマりました。
*3:余談その2:直近(2015/04/08, JST)のコミットで入った、各サーバプロセス起動時にCPUを見てスレッド数を変更する対応の影響で、プロセッサ数が4未満だとQAがうまく動かなくなるようです。(該当するissueはこれ→https://github.com/jhauswald/sirius/issues/59