はじめまして、ATLでウェアラブルデバイスについて研究している吉村(alterakey)です。

一口でウェアラブルデバイスといってもいろいろありますが、とりわけGoogle Glass、Android Wear (LG G Watch, SAMSUNG Gear Live, Motorola Moto 360 など)…といったAndroid勢が元気な印象があります。今回はこの中でもGoogle Glassに触れる機会があり、Glasswareを少し作ってみました。

Google GLASS

Google Glassはご存知の方も多いと思いますがGoogle I/O 2012でProject Glassとして発表があったグラス型ARデバイスです。これは透明なディスプレイ、ジャイロ、タッチパッド、カメラ、接近センサ、マイク、骨伝導型トランスデューサ、Wi-Fi、Bluetooth Smart、Nexus Sと同等のCPU・GPU・RAMを備えた軽量の端末で、Android 4.4で駆動されています。Androidとはいえ通常の携帯端末のようなタッチ主体のUXではなく、ボイスコマンドをベースにアプリ (Glassware) を起動し、タイムラインにイベント (Card) を挿入して行くことでユーザにフィードバックを提供していくという形の、「今この瞬間」の情報支援に重点を置いたUXを採用しています。

chatterbot

ところでchatterbotというものをご存知ですか?これらは一昔前に一部ではやったもので自然言語で話しかけると答えてくれるという比較的単純なAIのことです(AIとも呼べないものもありますが…)。話しかけると言っても当時は満足な音声合成や認識サービスがなかったので、キーボードでカタカタと質問やらなにやら打ち込むとテキストで返ってくるというインターフェースだったのですが、今回はこれにAndroidの音声認識・音声合成を使用してみようということでやってみました。

chatterbotといってもいろいろありますが、中でも有名なのは1964〜1966年にMITのJoseph Weizenbaum教授によって書かれたELIZAなのではないかと思います。これは入力された文章に比較的単純な変換を加えて出力するといっただけの簡単なロジックなのですが、当時人工知能の開発に積極的だった教授が、これに臨床心理士のような台本(DOCTOR)を当てて実験を行なってみたところ、予想に反してあまりにも多くの学生が夢中になってしまったことで教授は大きな衝撃を受け、以後人工知能開発の進展に対して批判的な立場にたつようになってしまったということで悪名(?)高いものです。

アーキテクチャ

ELIZAをAndroidへポート(移植)し、Glass上で音声認識・合成させて動作させます。

音声の認識には連続的な音声サンプリングと(Googleのサーバも認識に協力するため)ストリーミングが必要となり、それだけでもかなりの電力とネットワーク帯域を消費します。そのため、音声認識機能は必要になった時に断続的に起動するのがセオリーだと思いますが、今回はこれを連続的にドライブし、ユーザの応答を聞きながらELIZAの応答を同時に合成して行くことにします。

つまり、電池消費量やネットワーク帯域については度外視します 😉

ELIZAのポート

まずELIZAをポートすることから始めましょう。Wikipediaにもあるとおりいろいろな言語で実装されていますが、ここでは元の実装としてPerlのChatbot::Elizaを使用することにしてこれをJavaへポートします。joinを使用しているので、これはAndroidのTextUtilsを使用する想定でダミー実装を書いておきます。

完全なソースコードは若干長いのでリポジトリから落としていただければと思いますが、基本的には1:1で地道にポートします。また、参考までにTextUtilsのダミー実装についてはこんな形になるかと思います。

<

pre class=”lang:java decode:true ” >package com.gmail.altakey.eliza;

public class TextUtils {
public static String join(final String glue, final List iter) {
final StringBuilder sb = new StringBuilder();
if (iter.size() > 0) {
sb.append(iter.get(0));
if (iter.size() &> 1) {
for (int i=1; i<iter.size(); ++i) {
sb.append(glue);
sb.append(iter.get(i));
}
}
}
return sb.toString();
}
public static String join(final String glue, final String[] iter) {
return join(glue, Arrays.asList(iter));
}
}

これで、テキストベースで動作することを確認してみましょう。泥臭いビルド方法を取っていますが、これはただ単にビルドファイルすら書いていないためです。

Glassware

アーキテクチャの面で説明したとおり、今回はELIZAをできるだけ非同期的に動作させたいと思います。また、音声系の処理とAI系の処理を分離するためにMainServiceとPersonalityServiceの2つのサービスを使用し、この間をLocal Broadcastで結ぶような構成を取ります。

MainServiceはLiveCardの生成、音声系の初期化などを一通り行なったあとPersonalityServiceを起動し認識ループ(認識→メッセージ)へ入ります。一方、PersonalityServiceは起動されるとELIZAを初期化し、入ってきたメッセージを伝えて返信するだけになっています。

こちらも長いのでリポジトリを参照していただければと思いますが、音声認識・合成については重要なので以下にざっとかいつまんで説明します。

音声認識・合成

合成系はひとまず英語を使用し、ヘッドフォンを接続しなくても使用できるようにGlassの骨伝導トランスデューサに向けます。また、複数の発声が重なるような場合には直前の発声をキャンセルし、最後のものを優先するようにしています。なお、ユーザのコマンドによりELIZAが終了の挨拶をしたような場合にはそれをもってこのGlassware自体を終了させるようにします。

認識系についてもひとまず英語の自由作文モード(i.e. 検索語句抽出を目的としないモード)で初期化し、認識終了時点でELIZAに伝える形にしています。一方、認識不能な場合も文脈を切断する意味で”…”を伝えています。そのため、このGlasswareを起動して何も言わないと「言っていることが良く分からないからもう一度話す」ように促され続けることになるのですが…

最後に、サービスの起動・終了に合わせてこれらを初期化・終了しています。

まとめ

たったこれだけですが、擬似的なものとはいえ対話を本来の目的として設計されているchatterbotを音声でドライブできることは非常に興味深いと感じます。特にここで使用したELIZAに関しては単純なものの、来談者中心療法を行なっている臨床心理士のようなレスポンスを返すことから、タメなり相槌なりを適当に入れてやれば英語圏ではパーソナルセラピストとして応用できるのではないかと考えさせられました。以前はテキストチャットでMITの学生たちを夢中にさせてしまったELIZAなので、音声チャットという形でもきっとまた人々を夢中にさせてしまうだけのポテンシャルはあるのではないでしょうか。

なお、これは単に対話を行なうだけですがこれをパーソナルアシスタントとして仕立てることも十分に可能であると考えられます。Google Glass単体でもok glass, google …というような形でGoogle検索を行なうことは可能ではありますが、例えば今回のこれに何らかのDBや検索APIを組み合わせて不明な単語であるとかについてリサーチ、知識ベースとして蓄えさせたりしても大変面白いのではないかと思います。そのような形である程度ベースができてくると、こちらから話題を振ったりすることも可能になるでしょうし…

また今回のこれは英語ですが、日本語はどうでしょうか?本来、Androidは日本語の音声認識にも対応していますが、Google Glassにおいてはそのまま認識させることはできません。また、音声合成(TTS)についてはAndroidにおいてもデフォルトのTTSでは日本語がまともに扱えないのでN2TTSなどの日本語TTSエンジンを入れてやる必要があるのですが、Google Glassではこれも簡単には行きません。 それに加え、ELIZAは英文を対象に設計されたchatterbotなので日本文を認識させるにはかなりの改造が必要になってくると推定できます。このように、日本語化に関しては現状課題が多い印象です。

このように課題もいろいろありますが、今後ぜひともこのあたりはチャレンジしてみたいものです。

最後に今回のソースコードは全てリポジトリに置いてありますので、Google Glassをお持ちの方はぜひ一度お試しいただければと思います。