Docomo API の音声認識は使える

Google Cloud APIが何かと使いにくく、レスポンスも遅いのでDocomo APIの音声認識を試してみた。結果的に、Googleより倍速い。認識率も悪くはない。使える。
以下の文章googleだと6秒以上かかるが、Docomoだと4秒かからない。
{
,"confidence":0.700,"starttime":0,"endtime":8300,"tags":[],"rulename":""
,"text":"今日はネタをやりますお客さんからお題をもらって、この第2ついて扇子とか、なぞかけに答えてもらうというもので、"}
}

word2vecのスレッド利用

wprd2vecで、ユニット数を倍の400にしてやってみた。5,6時間かかりそうなので、スレッドを16にしてやってみたら超早い。MacProが8コア、16スレッドなのだが、それを目一杯使っている姿初めてみた。

AIモジュールの作成

AIモジュールを作成しつつある。仕組みはこうだ。
(1)パソコン上に、情報、知識、ネタに関するデータベースをMysqlで作成しておく。
(2)パソコン上に、JAVAで、こうしたAI関係の情報を処理するサーバーを動かす。
(3)ロボットに、それに対応するクライアントモジュールを、C++のライブラリとして作成する。
(4)qichatのトピックファイルで、変数イベントを発生させてサーバー上から必要な情報を獲得する。獲得したことに対するイベント、変数を同じトピックファイル上で取得し、会話的に使用する。
ほぼできた。明日、多王するトピックファイルを作成して、ロボットで試そう。

人の問いかけにWikipediaを答えさせた

今日は1日、時間が取れたので、午後ずっと、ロボットのプログラミングをやっていた。なんとか、ロボットにお題を問いかけて、そのお題をWikipediaにアクセスして調べさせて、主要な答えを返すというところまでやらせたが、まだまだ不安定で、実用性が低い。他の言葉は、ランダムにボケさせただけ。
不安定さについては、また別に書こうと思う。

Google Cloud APIのストリーミングを継続して使う

Google Cloud APIのストリーミング音声認識を、ロボットとの継続した対話に使おうとすると、60秒の制限があって、それ以上使えずに、例外が発生してアボートしてしまう。これでは使えない。
そこで、gracefull(優美)に一つの会話を終了させながら、次の会話に入っていくということがどうしても必要になる。その基本的なやり方を以下に記しておく。
(1)ロボットからの音声データのストリーミング入力は、それとして生かしておくという戦略。
(2)Google Cloudからは、送られたーデータの解析結果が中間的に、最終的にの二つのバージョンで送られて来るが、最終バージョンが送られて来たら、それを一旦出力(エコーロボットとしてロボットに喋らせる、あるいは、人間入力の言葉を解析して応答を用意したりして)
(3)これで例外を発生させずに終わるが、これだと一回の聞き取りしかできなくなってしまう。そこで、
requests = request_stream(buffered_audio_data, RATE)
のスレッドの作成から、再度はじめ直す必要がある。そこでここからを関数化して、先の終了後に、再帰的にこの関数を呼び出すようにすればいい。すると、また60秒制限の新しいスレッドが立ち上がる。無限続けるのは良くないので、いったい何度ロボットやり取りするかを事前に与えておいて、その回数の会話をしたら全てを終了させるようにすれば良い。
(4)一つ問題は、(2)で、会話が入れば、一つのスレッドはグレースフルに終わるが、無言の時間が続くと終わるタイミングを逃して例外を発生させてしまう。そこで、60秒以内の一定時間無言が続くと、一旦gracefullに終わらせる。
そこで、次のようなタイマーイベントを、先に分離した関数部分の中に置いておく、
###############
def stopAPI():
print "ループを止めます"
recognize_stream.cancel()
#ここまでが関数、以下でタイマーでこのハンドラーを呼び出す
t=threading.Timer(MAX_SILENT_LENGTH,stopAPI)
t.start()
###############
関数の中にstopAPIという関数を定義して、MAX_SILENT_LENGTHの秒数が経過すると、
recognize_stream.cancel()
というイベントを発生させる。すると、CANCELLという例外が発生して、綺麗に終わるように例外処理手続きが組み込まれているのでうまくいく。そしてこの例外処理が終わった後、さいど、先に作成した関数、request_streamから始める関数をスタートさせれば良い。
これで、指定回数の会話が終わるまで、継続的にGoogle Cloud APIでストリーミング処理を続けることができる。
これで、人工無脳の会話ボットと、ロボットNAO、そしてGoogle Cloud APIの三つをつなぐ準備が80%ほど、整った。

ロボット同士のテレパシー

人と人、人とロボットの間のテレパシー機能は、脳波などを使えば実現できるのかもしれない。実際、実現できるだろう。私も経済実験で脳波計を使ったことがあり、研究室には数十台の1極脳波計が役目を終えて眠っている。実験では、人々が他者を出し抜こうとしている時と、協調しているときの脳波のフーリエ解析をやって、α波やβ波などの違いを検出していた。1極ではとても心もとなく、使えない。もっと高品質で手軽な脳波計があれば、すでにやられているが、ロボットと人とのテレパシー会話が実現するだろう。これはやってみたいが、ハードウェアに金がかかりすぎる。 続きを読む ロボット同士のテレパシー

ALDialogボックスのエラー

変なエラーが唐突に出るようになった。たとえば、Dialogボックスで、
--------------------
topic: ~test01()
language: jpj
concept:(hello) こんにちわ
u:(~hello) ~hello
--------------------
こんな会話を指せようとしたとする。日本語環境であること示すために、setlanguageで日本語を指定して、dialog boxの言語でも日本語を設定し、もちろん、ロボットの基本言語も日本語だ。
しかし、実行させようとすると、
------------------------
[ERROR] behavior.box :__onLoad__:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_11108346568__root__testDialog_1: Error in call of ALDialog::compileAll: CompileAll::ALDialog
ALSpeechRecognition::compile
AsrHybridNuance::xCompile
NuanceVoconEngine::compile()
NuanceGrammarCompiler::compile()
Failed to compile the following file "/home/nao/.local/share/dialog/BNFhomenaolocalsharePackageManagerappslastUploadedChoregrapheBehaviorbehavior_1Japanese.bnf". Incorrect character in the following line : "". Check the documentation for more details about unauthorized characters in dialog
[ERROR] behavior.box :xApplySpecialIONatureAction:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_11108346568__root__testDialog_1: Error in call of ALDialog::activateTopic: loadTopic::ALDialog
ALSpeechRecognition::compile
AsrHybridNuance::xCompile
NuanceVoconEngine::compile()
NuanceGrammarCompiler::compile()
Failed to compile the following file "/home/nao/.local/share/dialog/BNFhomenaolocalsharePackageManagerappslastUploadedChoregrapheBehaviorbehavior_1Japanese.bnf". Incorrect character in the following line : "". Check the documentation for more details about unauthorized characters in dialog
--------------------------
という感じだ。さっぱりわからない。コレグラフを再起動してもだめだ。いったん変更して、再ロードするとこうなるようだ。わっしーを再起動しないと正常化しない。
一昨日のバージョンに戻したら、上の症状は起きなくなった。家でロボットなしでやった操作の何かがまずかったのだろう。ひとつひとつ確認していかなければならない。