作成者別アーカイブ: pandrbox

pandrbox について

AI & Robot integrator

音声認識(VoiceDictation)、発話(TTS)をいくつか試行

土日にいくつか、音声関係の技術確認を行いました。

音声認識(Voice Dictation)

UIDictationPhrase

iOS標準の音声認識エンジンを使うときのクラスなのですが、残念ながらこれが音声認識器なわけではありません。そういう説明がされている文書がなくて随分なやみました。ちなみに、Siriを呼び出しているわけではなく、iOSのアプリ上で、Siriにも使われているであろう「音声認識エンジン」が文字列入力に使えますが、それと連携する機能です。

このクラスは、認識された結果を受け取るときにアレイとして渡されてくるオブジェクトです。

使い方はすこしややこしいです。このオブジェクトを受け取るには「UITextInput」プロトコルを実装しなくてはならず、Delegateなどでは受け取れません。そこで、MyTextField等のクラスをUITextFieldから作り、「insertDictationResult」メソッドを実装します。そうすると、MyTextFieldを指でタップし、キーボードが現れたらマイクボタンをタップし、音声認識させ、「完了」をタップした瞬間に呼ばれます。このプロトコル・メソッドの引数「dictationResult」に配列として入って来るので、それを順次取り出し、textフィールドを取り出すと、認識結果が順次取り出せます。

- (void)insertDictationResult:(NSArray *)dictationResult {
    NSMutableString *text = [NSMutableString string];
    for (UIDictationPhrase *phrase in dictationResult) {
        [text appendString:phrase.text];
    }
}

この方法では、テキストフィールドをタップ、キーボードが表示されたらマイクボタンをタップ、という操作が必要で、起動したままどんどん喋る、という使い方ができません。

UIDictationControllerという非公式なクラスがあるそうで、これを使うとアプリからタイマー起動などで自動的に音声認識をオンにすることが可能なようです。非公式なため、使ってしまうとアプリストアに載せられなくなりますが、インハウスでは可能なわけです。あとで試してみたいと思います。

Julius 4.3.1

オープンソースの音声認識エンジンです。

julius-4.3.1-win32bin.zip本体、DNN版Juliusディクテーション実行キット v4.3.1Julius 記述文法音声認識キット v4.2といったものを順次ダウンロードして試してみました。

サンプルに用意されているものの問題かもしれませんが、「なにを話しかけても音声認識できる」ということを目指しているというよりは、ある程度狭い範囲の言葉を認識できるように用意されているようです。XML等で聞き取る言葉の語彙などを定義するようになっているので、多くの言葉を含んだスーパーセットを作れば可能なのかもしれないですが、重たくなる(リソースをたくさん喰う)のか、遅くなるのか、わかりません。

このため、実際に動かしてみてもぜんぜん認識してくれないように思いました。認識率は決して高くないように感じました。チューニングが必要なのだと思いますが、そうなるとiPhoneの認識エンジンなどのほうがずっと簡単で使い易いです。

発話(TTS : Text To Speech)

AI Talk 2 Plus

ずっと前にSOURCE NEXTでバーゲンやってたので購入してほうったらかしてたのでインストールして動かしてみました。子供、大人などの女性の声、男性の声などが選べ、読み上げ速度や声の高さなどが指定でき、便利です。ただ、ウィンドウを表示してマウス等で操作するアプリなので、エンジンとしては使えません。

AVSpeechSynthesizer

iOS標準のAPIで、AVFoundationから提供されています。Siriの発話エンジンはこれです。こちらは逆にアプリではなくAPIです。以前試したのですが、文書化してなかったので簡単に手順を書いておきます。

プロジェクトのGeneral > Linked Framework and Libraries に AVFoundation.framework を追加します。

AVSpeechSynthesizer* speechSynthesizer =[[AVSpeechSynthesizer alloc] init];
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speakingText];
utterance.rate = AVSpeechUtteranceMinimumSpeechRate;      //読み上げる速さ
utterance.pitchMultiplier = 1.0f;                         //声の高さ
utterance.volume = 0.9f;                                  //声の大きさ
NSTimeInterval interval = 1;
utterance.preUtteranceDelay = interval;                   //しゃべりだす前のインターバル
utterance.postUtteranceDelay = interval;                  //しゃべり終わった後の次のメッセージをしゃべるまでのインターバル
[speechSynthesizer speakUtterance:utterance];

たまに「ぷぷっ」と吹いてしまいそうな発音をします。

OpenCV 3.0 をUbuntuにインストール

作業メモ

Ubuntu 14.04 に OpenCV 3.0.0をインストールしたが、いろいろひっかかったのでメモ。

手順書通りにインストールしてみた。

こちらをダウンロード
https://github.com/Itseez/opencv/archive/3.0.0.zip

こちらの手順
http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation

普通にインストールできたように見えたけど、opencv-300.jarが見つからない。いろいろ調べた結果、cmake中にant, JNI, java_testが見つからない、という表示がされていて、そのせいでビルドされないらしい。これと同じ現象。

http://www.answers.opencv.org/question/8772/build-opencv-for-java-on-ubuntu-1210/

で、いろいろ試したのだけど、antが見つからないのと、jvmのbinフォルダーにjavacがないことがどうも原因らしいことが判明。以下のコマンドでantとjavaを再インストール。

apt-get install ant
apt-get install java-7-openjdk-amd64

以下の環境変数は必須

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JAVA_INCLUDE_PATH=/usr/lib/jvm/java-7-openjdk-amd64/include
export JAVA_INCLUDE_PATH2=/usr/lib/jvm/java-7-openjdk-amd64/include
export JAVA_AWT_INCLUDE_PATH=/usr/lib/jvm/java-7-openjdk-amd64/include

cmake、make、sudo make installをやりなおした。

/usr/local/share/OpenCV/java/opencv-300.jar が生成された。ほっ。

Eclipseへの組み込み

この手順ね
http://docs.opencv.org/doc/tutorials/introduction/java_eclipse/java_eclipse.html

ネイティブライブラリーのパスは

/usr/local/share/OpenCV/java

だったよ。今日は疲れたので、ここまで。

BlueCove を調査

とある Bluetooth デバイスを検討しているのですが、これまでBluetoothを使うといえばiOSでばかりいじってました。もちろん、Androidでも簡単にできることはわかっているのですが、別のUSBデバイスと同時に使いたいので、できればPCかMacで接続したいわけです。C言語でプログラムすれば簡単につながることもわかっているのですが、Windows用、Linux用、Mac用とプログラムコードを準備したくありません。

調べてみたら、Java用のBlueCoveというOSSがありました。

JNIを使ってOSが持っているBluetoothのレイヤーにアクセスするようなのですが、このライブラリーはうまいことできていて、ネイティブインターフェースをDLLなどのファイルに分けず、JARの中に仕込んであるようです。なので、Windows、Mac共通のJARがあるのですが、これをダウンロードしてクラスパスに組み込むだけでアクセスできちゃいます。

最初、bluecove-2.1.0.jarを試したのですが、「ネイティブライブラリが見つからない」というエラーになりました。ネットで調べていたら、bluecove-2.1.1SNAPSHOT.jarというファイルがあり、こちらを試したら動きました。バグなのだそうです。

とりあえず今日は手元にあるBluetoothマウスのペアリングボタンを押したあとプログラムを起動し、startDiscoveryとstartSearchServiceを呼び出し、マウスのサービスを発見できるところまでやってみました。ラズパイにBluetoothのドングルつけて接続できたら、ラズパイでやりたいかな。

所望のデバイスが届いたら接続を試みようと思います。

WikiPedia シソーラス

今日はまた別のシソーラスをチェックしてみます。
SIGWP、Special Interest Group on WikiPedia Research

http://sigwp.org

こちらは、大阪大学が中心となって作ったコミュニティーのようです。

WikiPedia API というのがあるので、これを触ってみます。
Javaでの利用というのを発見したのでJavaで触ってみます。
どうやらこのAPIはSOAPで公開されており、WSDLがあるのでそれを使ってスタブを生成することで利用する、というスタイルのようです。
Javaの欄にあるコマンド例に地雷発見。この uri はWSDLを返してくれない。コマンド内の uri をページの先頭にあるものに置き換えるとうまくいく。おそらく、URL が古いのだろう。

./wsdl2java.sh -uri http://dev.sigwp.org/WikipediaOntologyAPIv4/Service.asmx?WSDL -p org.wikipedia.lab

サンプルは動かない

スタブに、ArrayOfWikipediaArticle というクラスが生成されません。

GetCandidatesFromKeywordResponse というメソッドは、getCandidatesFromKeywordResponse という小文字から始まるメソッドになっています。

GetCandidatesFromKeywordResponse response = stub.getCandidatesFromKeyword(keyword);

GetCandidatesFromKeywordResult_type0 result = response.getGetCandidatesFromKeywordResult();

ここまではできたのですが、ここからサンプルにあるように記事を一覧する、というのがどうもわかりません。OMEementなどの生データしか取得できないように思います。これを、どれかのエミッターに流してオブジェクト化すればよいのでしょうけれど、サンプルがないので皆目わかりません。
追記:
別の、よい記事を発見。
更新されてない
最終更新は2013年3月のよう。こちらもさらに残念。

シソーラスWordnetのその後

WordNet をもう少し調べてみました

WordnetのJava APIで「人間」が見つからない理由は、簡単にわかりました。
サンプルはPOS.vを引数に渡しています。これは「動詞」という意味なので「人間」が見つからないわけです。
そこで、POS.n(名詞)を引数に渡したところ発見できました。
私はシソーラスが「概念マップ」みたいに使えることを期待しているので、人間は、生物学的には類人猿で、哺乳類で、脊椎動物で、・・・みたいなことが見つけられると考えて検索をかけてみました。ところが、残念ながら、途中でデータが途切れているように見えますね。
そこで、homo(「人類」の英語)を入れてみたところ、意外と繋がって見つけることができました。つまり、日本語は抜けがかなりあるように思えます。
繰り返し読みだすたびにソースコードをいじるのが面倒なので、簡単なWebフロントエンドを作ってサーフできるようにしてみようと思います。
簡単なJSPを作ってTomcatで動かしてみます。ところが、なかなか簡単にはいきません。
Dynamic Webプロジェクトを作り、External JARとしてjawjaw, junit, sqlite などをセット、コンパイルは難なく通過。Tomcatにデプロイしたらクラスが見つからん、とコンパイルエラー。そこで、Tomcatのクラスパスにも同様にJARを追加。Tomcat上でのコンパイルも通過。
単語ダブルクリックで次の単語へ移動できるようになったので、それは便利になりました。さて、Wordnetをサーフしよう。

シソーラス WORDNETをひさしぶりに

みなさんはシソーラスって知ってますか?

シソーラスというのは、人が使う言葉(単語)をたくさん集めて、関係を調べたものです。もともとは言語学者が調べ始めたものですが、現代では計算言語学(人の言葉をコンピューターで処理する)で使われる基礎データとしてとても重要なものとなっています。シソーラスに似たものとして、文章構造を集めたコーパスというのもあります。それはまた別の機会に。
シソーラスとはどういうものかというと、言葉の類似性というか、似たものというか、そういったものを関連づけたものです。一般的な言い方と、より具体的な言い方、などとの言葉の関係を構築したデータです。 知能ロボットの開発のために必要なテクノロジーの一つです。いろいろ思い出すのと最近の状況の確認のために、久しぶりにシソーラスをいじくってみました。
身近なものとして、こちらをいじってみました。
Wordnet
私は主にJavaで書きたいので、Javaを試すことにしました。
手順はそんなに難しくないですが、ドキュメントはいまいちですね。
サイトの「概要」の下のほうにある「Javaフロントエンド」というのを選びます。Java書く人からすれば「Java API」とかしてもらえると分かりやすいです。
以下をWordnetのサイトからダウンロード
jawjaw.jar:WordnetのAPI
wnjpn.db :データベースそのもの(シソーラスが入っている)
その他、こちらも必要。これらは別サイトからダウンロード
sqlite-jdbc-3.7.2.jar :データベースの実装
 junit-4.7.jar :ユニットテスト用のライブラリ。本当に必要かどうか疑問。
さて、手順的には、Eclipseなら、Javaプロジェクトを作り、三つのJARをビルドパスに通し、wnjpn.dbをsrcフォルダーの下にmain/resourcesというフォルダーを使って置く(Java的な言い方であれば、main.resourcesというパッケージを作って、dbファイルを置く)だけ。で、サンプルコードをソースコードとして作れば、あっというまに動きました。
なんか、思ったような結果が得られなくていまいち。
サンプルは「買収」という他動詞で作られていてきちんと動くけど、「人間」と入れたらヒットしない。理由はこれから調査予定。無料でダウンロードできるものには入ってないのかな。
また、残念なことは、Wordnetの最新ニュースが、こちらであること。
Japanese Semantic Corpus: jsemcor initial release (2012-01-06)
これから想像するに、すでにこのサイトは2012年1月から更新されてないということになります。すでに3年が経過していますね。外部から採用するOSSやデータは、更新状況がとても重要です。すでに放ったらかしモードになっているものは使うべきでないので残念です。
先日、人口知能に関連する、とある会合に出たとき、そこにいた著名な研究者が「シソーラスを自動的に更新する技術が必要だ」ということを訴えていました。そう、シソーラスは現在、学者の集まりやなんらかの団体(企業など)で、多くの場合手作業で行われています。これには特定のコストが必要で、その予算がなくなれば更新されなくなってしまいます。しかし、言葉は生きているため、常にコーパスやシソーラスは更新され続けなければならない。人間は、人と関わりあい、会話することによってそれを続けています。人口知能、知能エージェント、ロボットは、人間と同じように、常に言葉(シソーラス)や言い回し(コーパス)を更新し続けなければ、人とコミュニケーションできないということです。

Mac OSX 10.10.3 Yosemite + PlayStation Eye + Audacity 2.1.0 で4チャンネル録音

HARKを試す必要もあり、自宅でおもちゃにするのもあり、PlayStation Eyeを購入して試すことに。といっても、PS3につなげてゲームがしたいわけではなく、パソコンにつなげてプログラミングするのである。
20150411PlayStationEye

さて、Windows8でも試してみた。こちらの記事に従って。
http://hirorororo.blog.so-net.ne.jp/2011-02-22

この記事と同じで、ThinkPad E440+Windows8.1+PlayStation Eye+Audacity 2.1.0ですんなり4チャンネル録音できました。

さて、Macでも試そう。

準備したのは、

  • Macbook Air 2012年秋モデル
  • OSX 10.10.3(Yosemite)
  • PlayStation Eye
  • Audacity 2.1.0

http://audacity.sourceforge.net/?lang=ja

で、結果ですが、ぜんぜん問題なくてあっというまに4チャンネル録音できました。
20150411Audacity

LightBlue Bean を iOS から呼んでみる

購入してからずいぶん時間が経ってしまい、電池も切れ(笑)、かわいそうなのもあるし、ちょいと自分の研究のためもあって今日はいじることにした。電池は入れ替えた。

つなげたらいきなりファームウェアをアップデートせよ、と来た。ファームウェアのアップデートが走るだけでも少し安心する。アップデートが出る、てことは、メンテされてるってことだもんね。

さて、今日は iOS(iPhone 6 Plus)から LightBlue Bean にアクセしてみたいと思う。当然、Objectiv-Cでプログラムを書いて、データの読み書きをする、ということだ。

PunchThrough が、Objective-C用のライブラリーを出している。

インストール方法はこちら。
英語が苦手な方向けに言うと、CocoaPods という Objectiv-C用の依存性解決ツールを使うので、それをインストールしたあと、Podfileを使って必要なライブラリーをダウンロードする、という方法。ただ、これはxcodeプロジェクトをまず作って、そのフォルダーの上で行う。
手順のうち、wget と pod setup は、CocoaPods のインストールと設定の手順なので、総合して1回やればよい。
さて、LightBlue Bean を呼び出す Objectiv-C のサンプルコードがここにある
サンプルの中の「bean-xcode-project-template」を使うので、そこで、またCocoaPods を使ってインストールする(pod install)
とりあえず iPhone を繋いて、実行してみよう・・・・あれ? ビルドエラー
library not found for <project name>
いろいろやってみたが、解消できない。もうサンプルはいいや・・・。
リファレンスを見て考えてみる
最初にアクセスすべきなのは
PTDBeanManager
このオブジェクトと通信するために
PTDBeanManagerDelegateを自分のクラスに指定しておく
そしたら、
self.beanManager = [[PTDBeanManager alloc] initWithDelegate:self];
とすると、マネージャーさんと会話できるようになる。
beanManagerDidUpdateState
が送られてくるのだが、これは、Bluetoothの状態の通知。もしオフなら「オフられてるぜ」とユーザーに文句をいう。オンなら
[self.beanManager startScanningForBeans_error:nil];
とかやると、機器をスキャンしはじめる。
見つかると
didDiscoverBean
が呼ばれるので、beanの一覧を溜め込むなりする。このとき渡されるPTDBeanオブジェクトは、LightBlue Bean のファサードなので、後生大事にとっておく。
どれか特定のBeanに対して、仲良くなりたかったら、
[self.beanManager connectToBean:bean error:nil];
とやる。接続が完了すると、didConnectToBean が来るので、接続完了。
そしたら、センサーの読み出しとかができる。
たとえば、加速度センサーが読みたかったら、
PTDBeanDelegate
を指定しておいて、
self.bean.delegate = self;
[self.bean readAccelerationAxes];
とかすると読めるのだが、残念ながら(?)同期メソッドではない。この結果としてdidUpdateAccelerationAxes
が呼ばれるので、そこで渡されるPTDAccelerationオブジェクトから、x、y、z、の加速度を読み出して使うことになる。1秒おきにデータが欲しければ、自分でNSTimerなどを使って繰り返し呼ぶ。このへんの動作は、iOSのセンサーとは少し違うので注意が必要だ。
このへんは、上記のサンプルから読み取れるので、必要に応じて読んだらよいと思う。

Bluemix で Mobile Application Security を動かしてみた

昨日に引き続き、Blumix で Mobile Application Security に挑戦

チュートリアルが見当たらないので、Getting Started でやってみる。
これのことだお
今日のサンプルは「bluelist-auth」というやつ。どうやら、GoogleアカウントでOAuthでログインし、ユーザーごとにデータを分けられる機能と思われる。同じユーザーIDで、違う機体からログインしてもデータが共有されます、と書いてあるが、私が確認したいのは「ユーザーごとにデータが分離(isolate)されるかどうか」だ。
README.md を読め、とも書いてあるのでまずはダウンロードしてこないとね。
git のこちらにサンプルがあるということで、git コマンドで取得。
git clone https://hub.jazz.net/git/mobilecloud/bluelist-auth
手順的には、クラウドで Mobile Cloud のインスタンスを起動する、pod install で必要なライブラリーを入れる(または手動でframeworkファイルを入れる)、App Secret を plist にセットする、ここまでは共通のよう。
MobileData と同様に、xcode で xcworkspace を開いてみる。(CocoaPodsを使ったため)
このサンプル(あるいはMAS)は、Bluemix の application id と application secret の他に、Google+ API とクライアントIDを必要とするようだ。
とりあえず手順に従って、Google developer サイトの Console で、プロジェクトを作ってみる。
「認証情報」のページのOAuthという項目で「新しいクライアントIDを作成」というのを押せば、clientId が取れるようだが、「バンドルID」に指定する「パッケージID」というのがなんだかわからないよう。
iOSの(xcodeの)Targetをみると Bundle Identifier というのがある。これじゃん。com.ibm.BlueList だ。ドキュメントに出てくる、パッケージIDって、いったいどこから来たんだ?
ディープリンクというのはよくわからないけど、とりあえず「無効」でいいや。
まぁとにかく実行してみろ、と書いてあるのでやってみる
401.That’s and error
Error: invalid_client
no application name
あれ、

2014-10-07 20:52:37.502 BlueList[54230:8715425] You are using Google+ iOS SDK version 1.5.1
2014-10-07 20:52:37.503 BlueList[54230:8715425] Get the new version 1.7.1 at https://developers.google.com/+/mobile/ios/getting-started

とか出てる。どうも、bluelist-auth に含まれている GooglePlus.framework の中身は、いくらか古いようだ。
なんだかあやしいので、一旦、Google+ API にあるサンプルをやってみることに。このサンプルはGoogle提供のもの。
これも同じ現象でうごかない。つまり、Google 側の設定がなにかおかしい。
no application name でググったところ、以下の記事を発見。
このQ&Aの中で「Consent screen」で「product name」をセットしろ、とある。
これは、日本語の Google Console では、「同意画面」の「サービス名」のようだ。うーむ、訳が違うじゃねーか。これで4時間も悩んだぞよ。Googleサイトの記事を「問題を報告」しておいた。
メールアドレスを選択し、「サービス名」を「Sample」とかてきとーにセットしてリトライ。無事動く。この「サービス名」は「Sampleが許可を求めています」みたいにOAuthの画面で表示されるところに使われる。わかりやすくしたかったら「よねちゃん」とかしておくと「よねちゃんが許可を求めています」とかいう表示になる。
同じ(Google Console 上の)プロジェクトのバンドルIDをBlueList-authのものに変更して(戻して)、リトライしてみる。無事、bluelist-auth アプリが稼働しはじめた。
さて、この API の動作仕様を調べて行くことにする。今日はこのくらいにしといてやる。

Bluemix で MobileData に挑戦

Bluemix で MobileData に挑戦

こちらのチュートリアルをやってみる。
同日本語版

①ダウンロードはgitから。

中程にあるgitコマンドで実行
git clone https://hub.jazz.net/git/mobilecloud/bluelist-base

②xcode でいきなりエラー

ウンロードされたフォルダーの中の BlueList.xcodeproj を開いてみる。
とりあえず実行してみるか、と思ったが、いきなりコンパイルエラー。ダウンロードしてすぐ動かないものなのか・・・。

(null): could not read data from ‘/Users/yone/Documents/xcode/bluelist-base/bluelist-base-iOS/BlueListTests/BlueListTests-Info.plist’: The file “BlueListTests-Info.plist” couldn’t be opened because there is no such file.

BlueListTests/BlueListTests-Info.plist が見つからないと言っとる。たしかにない。これは、よく xcode でローカルテストをするときのファイル群の一部のはずだが、確かに無い。

README.md にも、以下のように書いてあり、これで手順はよさげ。

You can run this sample immediately, by opening the .xcodeproj file and clicking the Play button.

(.xcodeproj ファイルを開いてPlayボタンを押せばこのサンプルをすぐ実行できるよ)

さて、どうしたものか。

次の手順の CocoaPods のセットアップをしてみる。

sudo gem install cocoapods

pod install

意外と時間がかかる。

xcworkspace ファイルを開いてPlayを押してみたが同じエラー。

あら、developerWorks がメインテナンスで停まってしまった。続きはまた明日にでも・・・。

③Bluemix のフォーラムに聞いてみた

返事があってあっさり解決。無駄なTargetが定義されていたもよう。

https://developer.ibm.com/answers/questions/27969/no-plist-on-bluelist-base-sample/

さて、続けてみる。

④Mobile Cloud インスタンスを起動

Bluemix で、Mobile Cloud のインスタンスを起動した。

⑤Overview のページでSDKをダウンロード

確認のために、CocoaPodsを使わず、手作業でインポート

IBMBluemix.framework と IBMData.framework をプロジェクトにインポート

⑥コードの修正

言われたとおりにコードを修正し、実行。無事、データがパーシストされた。