かなり「えせNewton」あらため「Newt On」の実装研究も進んできました。次の目標は、一般向けのデモが可能で一般ユーザーのウケがとれるレベルです。
ViaVoiceのMacOS X版がどの程度のパフォーマンスなのか、どの程度の新機軸を盛り込んでくるのか(こないのか)、現段階ではまだ未知数ですが、前回問題になったコマンド認識のインタバルは、少々長め(20 秒程度?)にするか、あるいはコマンド認識部の起動を明示的に行うようなことを考えるべきでしょう。
とりあえず、前回の続きをうけてデモ可能なレベルのものを仕上げてみることにします。
住所録「Names」の検索
普段使っているファイルメーカーProの住所録を、Newt Onから検索できるように考えてみました。基準となる検索キーワードは、
河原さんを検索。
です。これで、住所録データベースに対して「河原」という名前で検索できるようになれば大丈夫でしょう。これをMicrosoft Word(以下、Word)で文節ごとに区切ると、
--> {"河原", "さん", "を", "検索", "。"}
となります。いい感じですね♪
まずは、「検索」が入っているかどうかをチェックし、「検索アクション」であることを認識。次いで、目的語である「河原」を検出するために「さん」の位置(この場合だと2番目)をチェック。「さん」より前にあるワードはすべて検索対象の文字列とします。
あくまでこの基準用キーワードであれば、名前の途中で切れることなく、いっぱつで認識してくれますが、ちょっと長い名前……たとえば「長野谷」を与えて文節区切りをWordにやらせると……
--> {"長野", "谷", "さん", "を", "検索","。"}
となってしまいます。そこで、「さん」より前にある語はすべて連結して検索対象にしてしまいましょう。
--目的語を検出/連結(人名が複数のwordにparseされるパターンに対応)
set objText to items headPos thru (resNum1 - 1) of bpText
set objText to objText as text --連結
だいたいの方針は固まってきました。コードもすぐに書けてしまいましたが、これだけで済むわけがありません。
データベース上に複数の「河原」さんがいたら困るので、最低限「どこの」河原さんなのかを指定したいところです。
そこで、「○○の」という言葉が「○○を」の前に存在したら(当然、ない場合もあるわけで)、サブキーとして認識させることにしました。
東京都の河原さんを検索。
これで、データベースから氏名と住所で検索してくれます。実は、「○○の」という部分は、単にそのままうしろに「*」を付けて「東京都*」のようにして住所フィールドに突っ込んで検索しているだけなので、
東京都渋谷区の河原さんを検索。
とか、
東京都渋谷区初台の河原さんを検索。
のように、どんどん条件を長めに与えれば、データの絞り込み検索を行えることになります。
ある程度の呼称の「ゆらぎ」に対応
住所で検索できるわけですから、その部分をちょっといじくって、「男性の」、「女性の」というサブキーも強引に受け付けるようにしてみました。
if subKey is not equal to "" then
if subKey is equal to "男性" then set cell "性別" of request 1 to "♂"
if subKey is equal to "女性" then set cell "性別" of request 1 to "♀"
else
set cell "会社住所" of request 1 to (subKey & "*")
end if
普通に住所で検索する前に、目的語自体を調べて処理を分岐させています。
男性の河原さんを検索。
複数の河原さんの中から男性の人だけをピックアップします。これで一段落。
一息入れたあと、さらにコードを見直してみると、この目的語をピックアップする基準ワードが「さん」で固定されているので、
set resNum1 to searchItem(bpText, "さん") of me
処理自体をサブルーチン化して、「さん」の記述部分を変数に置き換え、
set resNum1 to searchItem(bpText, keishouText) of me
引数として基準キーワードを与え、柔軟に呼称(ここでは、目的語をピックアップするための目印)を変えられるよう、バージョンアップしてみました。
set kList to {{"さん", "姓"}, {"ちゃん", "名よみがな"}, {"課長", "姓"},
{"部長", "姓"}, {"社長", "姓"}, {"君", "姓"}, {"くん", "姓"}, {"様", "姓"}}
repeat with aKey in kList
set gRes to stdDBserch(bpText, item 1 of aKey, item 2 of aKey) of me
if gRes is not equal to "NG" then exit repeat
end repeat
「さん」、「ちゃん」、「課長」、「部長」、「社長」、「君」、「様」……と、一通り柔軟に対応。また、呼称の違いに応じて……
河原さんを検索。→「姓」フィールドを検索
みちおちゃんを検索。→「名よみがな」フィールドを検索
のように、検索対象フィールドを動的に変更できるようにしてみました。動的に変更しつつ、設定してあるキーワードで目的語を検出して検索を行います。条件でヒットしなかったら、次のキーワードを(総当たりで)試すことになります。
しかし、ここで問題発生!!
ヒットした件数を数えるのに、(↑)のような単純なコードを書いてみたところ、「オブジェクトが見つからない」エラーが発生。しかし普通、この程度でエラーが出るわけがありません。
そこで、ものは試しとデベロッパー向けに配布開始されたAppleScript 1.8.2β3を入れてみたところ……なにごともなかったかのように、きちんと動くようになりました。
まだ、完熟途上にあるMacOS X上のAppleScript……デモを行う場合には、こうしたこまかなバージョンの違いが大きく響いてくることを肝に銘じておかなければならないでしょう(汗)。
とりあえず、ダウンロードできるものを用意して
みました。試せる環境のある方は、お試しを(67K)
ハードルを超えたら次の問題……
これで、もしViaVoiceからの文字入力をMicrosoft Wordに行って、コマンド解釈プログラムをキックすれば、その内容に従ってデータベースの検索を行ってくれます。検索だけでなく、メールの組み立てさえも、すぐに実現できることでしょう。
しかし、ここで問題が2つあります。

1つは、ViaVoiceで入力を行うため……キーボードからの入力にくらべて(聞き取りミスの訂正などで)入力に時間がかかる可能性があるということです。
定期的にWordの文章に問い合わせを行うようなスタイルは合わないことでしょう。最悪の場合には、Wordが単独でクラッシュするかもしれません(MacOS Xになって、何か不具合が起きても該当するアプリケーションが落ちるだけなので……安定性とひきかえに、スクリプト側でつぶさにプロセスの存在チェックを行う必要が出てきて、なかなかたいへんです)。
キーボードからキックしてもよいのですが、まだMacOS 9.xのようにショートカットを強引にメニューに加えるようなプログラムが(あるにはあるものの)安定して利用できるか分からないので、ショートカットでは呼び出せません。

とりあえず考えているのは、グリフィンテクノロジーの「PowerMate」をUSBポートに取り付けて、このドライバでクリック時のアクションにAppleScriptの実行を割り付け、実行をキックさせようというものです。
もうひとつの問題は……こちらのほうが、テーマとしては大きく……データベースで複数のデータがヒットした場合に、その結果表示なり選択肢なりを、コンソールであるMicrosoft Wordにメッセージとして返す必要があるということです。
Microsoft Wordからデータを抜き出す(正確にいえばコピーしてくる)AppleScriptは割と簡単ですが、書き戻すコードは少々考えなくてはなりません。
とはいえ、本プロジェクトが始動したとき、誰がこのレベルまで到達することを想像しえたでしょうか? 技術的な検討課題を抱えながらも、第1段階のNewt Onとしてはほぼ評価に値する機能レベルに到達してきました。セッティングさえミスしなければ、デモを行っても十分によい反応が得られることでしょう。
入力された日本語のテキストから、コマンドを検出して……そのアクションを具体的にどのように行うかの装飾語句を検出。データベースの検索を行えるようになりました。
最終的な仕上がりを考えたときには、住所録データベース(Newtonに準じて「Names」と命名)にまだ検索履歴を付けていないので、この履歴処理のあたりも考えてみる必要があることでしょう。