Android開発

[ リスト | 詳細 ]

記事検索
検索

全1ページ

[1]

Androidの音声認識APIで凡ミスしてハマる

メインで作業しているほうが煮詰まってしまったので、別のプログラムを書いてストレスを発散することにしました。
で、ちょっと前にやってみよう、と思ったっきりになっていた、日本語音声認識APIを触ってみることにします。

先のGoogleのブログにも有るように、RecognizerIntentを使えば一発なのです。ググればサンプルは一杯出てきますしね。と言う事でさくさく実装してサクサクテストしてみたのです。いざ電話機を顔の前に掲げて「てすと」

で、音声解析され出力されたワードを確認してみると、pistol, facebook, crystal, difficult, this talk, text talk…ハハハ「てすと」は英語だもんナーじゃあ「あー」で。ah、ooh、…おーう。

俺そんなにカツゼツ悪いですかね?と、他の音声認識アプリを使ってみたところ、きちんと「てすと」といえば「テスト」と出力されます。「わたしきになります」は「私気になります」と出力されます。「あめんぼあかいなあいうえお」は「あめんぼあかいなあいうえお」…ばっちりじゃん俺。

-☆-

結論。
【凡ミス】EXTRA_LANGUAGE_MODEL の所をEXTRA_LANGUAGE にしていた

イメージ 1



つまりこう。
Intent intent = new Intent( RecognizerIntent.ACTION_RECOGNIZE_SPEECH );
intent.putExtra( RecognizerIntent.EXTRA_LANGUAGE,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM );
これでも全く問題なく素通りされます。しかしランゲージモデルを指定していないことになるのでずっとデフォルトのまま。多分英語。


【副産物】
アレコレ調べていたのですが、実は本家APIdemosに音声認識のソース入ってました。これをみると後ろの方で
// Specify the recognition language. This parameter has to be specified only if the
// recognition has to be done in a specific language and not the default one (i.e., the
// system locale). Most of the applications do not have to set this parameter.
 if (!mSupportedLanguageView.getSelectedItem().toString().equals("Default")) {
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
                    mSupportedLanguageView.getSelectedItem().toString());
    }

多様性に富むAndroid端末では、上記のようなコードをきちんと書いておいたほうが良いようです。もしくは、もう日本語決めうち!として、LANGUAGE_MODEL_FREE_FORM の箇所を、「Locale.JAPAN」としてしまうか、ですね。

いやー凡ミスで二日も消費するとは…。

閉じる コメント(0) ※投稿されたコメントはブログ開設者の承認後に公開されます。

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

OpenGLES 頂点カラー周りで恥ずかしいミスをした

AndroidでのOpenGLで、ちょっと死にたくなる恥ずかしいミスをしていたので、戒めとしてブログに残しておくことにする。

普通にモデルデータを使っているときは、頂点カラーなどのデータはきっちり作りこんでいるので問題ないのですが、ちょっとデバグのサポートにXYZ軸とかラインでだそうか、とするとします。で、

public void setColor( float r,float g,float b,float a ){
 mLineColor[0] = r;
 mLineColor[1] = g;
 mLineColor[2] = b;
 mLineColor[3] = a;
}

public void drawLine( GL11 gl,Vector3d pos1,Vector3d pos2 ){
 float[] vtxbuf = { pos1.x,pos1.y,pos1.z,pos2.x,pos2.y,pos2.z	};
 gl.glVertexPointer(3, GL11.GL_FLOAT, 0, GLMakeBuffer.makeFloatBuffer(vtxbuf));
 gl.glColorPointer( 4, GL11.GL_FLOAT, 0, GLMakeBuffer.makeFloatBuffer(mLineColor));
 gl.glLineWidth( mLineWidth);
 gl.glDrawArrays(GL11.GL_LINE_STRIP, 0, 2);

}
こんな感じでホイホイと書くじゃないですか。そしてラインを表示したらちゃんと出たのでよしよし、と三軸出そうとしたら色がなんかおかしくなるわけですよ。ていうかライン一本のときもおかしくなったりおかしくならなかったりですよ。アレー?


ってそりゃ頂点ひとつ分しかカラーバッファないからな!!


死ぬわ俺。

-☆-

まあ必要ないとは思いますが、正解はmLineColor[] をRGBA二つ分(ラインの場合8要素)用意して、setLiuneColor()ではきちんと全部にセットする、です。


じゃあちょっと首吊るのにヨサゲな木を探してきますわ…

でもここ見ると結構同じミスしてる人いるみたいなんだよな。
OpenGL ES Tutorial for Android – Part IV – Adding colors
ひどいところになると「GL_UNSIGNED_BYTEに変更したら解決しました!」とか。それ解決してないよ多分。

閉じる コメント(0) ※投稿されたコメントはブログ開設者の承認後に公開されます。

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

Androidでライブラリ作成

センサだのタッチパネルだのOpenGL ESだの無節操に取り組んで、AndroidとJavaに慣れつつあります。で、ある程度ソースが書きたまってくると、「これ前も書いたー」となるわけです。しばらくはコピペだの(ソースのコピペ、ダメ、絶対)、ソースのインポート何だので凌いでいましたが、ちょっとリファレンス見てたら信じられない実装だったのを勘違いして使っていたので、ここらでいっちょ自分ライブラリを作りましょうよ。

…つくり…つくります……すぐやります…


JavaとEclipseは滅びればいいのに!!!


-☆-

【Eclipseでの、Android用俺ライブラリの作り方】
 (い) 新規→「Androidプロジェクト」でプロジェクトを作成する。この際、"Create Activity"のチェックは外す。あとは適当にビルド・ターゲットやら指定してプロジェクト作成。

 (ろ)作成したプロジェクトのプロパティを開きAndroid→"Is Library"にチェックを入れる。お恥ずかしいハナシですが、これをしてなかったので延々ハマりました。

 (は)AndroidManifest.xmlを開き、Application エレメントをごっそり消します。
  これがあるとどうもライブラリではなくアプリケーションとして振舞おうと色々悪さこいてるみたいです。GUIのエディタからでは消せないので、普通のエディタでごっそり消します。

 (に)後はいつもどおり、packageを指定してソースをモリモリ書きます。


【作った俺ライブラリを使う】
 俺ライブラリを使いたいプロジェクトのプロパティを開き、Android→Library→add... をクリックすると俺ライブラリが出るので選択してOK。すると、プロジェクトのツリーに"Library Project"が出来て、その下にjarファイルがあるはずです。
 あとは使いたいソースにimport文で書くもよし、フルパスでクラスを書くもよし…。愛でてよし、食べてよし…


-☆-

ふう…。
なんかEclipse はいちいちヘンなところで詰まりますわ…。あと、Android SDK関連もアップデートが激しいのとアップデートのたびにごっそり変更するので資料がまとまってなくて結構辛いです。
うちで組んでる分には自由にインターネッツで調べられますが、これネット規制されている会社とかで作業しろっていわれたら辛いですわきっと。

こないだのセンサ周りも結構アレだったしなあ…。Android、結構アレかも。ていうかJavaもアレなので、アレとアレの組み合わせで大変なことに…。


あっ。
ライブラリ作るきっかけは、デバッグ用ログ出力という名目のLog.dがDebuggableじゃなくてもログをどんどん吐いていると言う…それだけです。

閉じる コメント(0) ※投稿されたコメントはブログ開設者の承認後に公開されます。

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

Dell Streak のセンサー(2/29追記)

細々と続けているあんじょろ開発です。
今日はちと携帯電話のセンサー周りについて。とはいっても、DELL Streak(Softbank 001DL)限定情報です。


-☆-

Androidで、その携帯電話が使用可能なセンサーの種類を取得するコードの実装については、ネットの海に一杯転がっていますが、じゃあボクのワタシの携帯電話にはどんなセンサーが装備されているのかしら?などと言って
  List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_ALL);
  String str ="対応しているセンサー一覧";
  for(Sensor s : sensors) {
    str += s.getName() + "\n";
  }
  nameLists.setText(str);
こんな感じのソースをウキウキペロペロと書いて実行したら
イメージ 1
…こんな感じになって何がなにやら…となってしょんぼりです。リファレンスだと加速度センサーとか重力センサーとかカッチョ良くでてたじゃない!しかもこの画面だと何個も同じのが出ててどういうことなの!ウワーン!


しょうがないので、「sensor bma150」とかでググって、ああ、加速度センサーなんだ…とかやっていたところ、一覧にしているサイトを発見しました。ここをみると、複数回出ていた「ak8973s」というセンサーは「地磁気」「傾き」「温度」の三役をこなしているようですね…。

ついでなので、件のサイトから引っ張ってきた、Androidで使用可能なDELL STREAKのセンサと、Android
SDK 1.5でのセンサータイプ名は次のとおり。
・加速度(Sensor.TYPE_ORIENTATION)
・地磁気(Sensor.TYPE_MAGNETIC_FIELD)
・傾き (Sensor.TYPE_ORIENTATION)
・温度 (Sensor.TYPE_TEMPERATURE)
・近傍 (Sensor.TYPE_PROXIMITY)
・明るさ(Sensor.TYPE_LIGHT)
以上6つ。ジャイロスコープと圧力センサは搭載されていないようです。残念。最新のSDKでは重力(!)や直線加速度など色々増えているみたいですが、いかんせんStreakはAndroid 2.2。ジャイロスコープは触ってみたかった気もします…。


-☆-

2/29追記
今日一日作業していてわかったのですが、ストリークの近傍センサはAndroid SDKのSensorEventのところに書かれている、"Note: Some proximity sensors only support a binary near or far measurement. In this case, the sensor should report its maximum range value in the far state and a lesser value in the near state." に該当するセンサでした。つまり、「近い」「遠い」の二値。そしてその判定の条件値は、1cm。

判定の条件値を変更できるならまだ少しは遊び甲斐があったのですが、現状のセンサだとちょっと…ですねえ。もちろん、ほかの端末ではきちんと距離を出してくれるのもあるでしょうから、それを見越して何か作る、ってのでも良いのですが、いかんせんエミュレータではセンサ周りはどうしようもないので。


安いあんじょろタブレットでも買うか!?

閉じる コメント(0) ※投稿されたコメントはブログ開設者の承認後に公開されます。

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

Android-x86とEclipseの連携

Android開発を自分用メモとしてちょっとまとめて残しておくことにしました。

-☆-

Androidアプリの開発といえば、定番はEclipseにエミュレータ、だと思うんですが、いかんせんこのエミュレータが重いし起動しない。うかつに閉じちゃったりするとホントもう起動するまでの間、窓から飛び降りたくなるのを必死に我慢しないといけません。世界のどこかにはEclipseもエミュレータも瞬時に起動するという夢のマシンがあるということなのですが、たぶん伝説。

そこでEclipseにx86-Android、という組み合わせで行くことにしました。以前はx86-Androidいれてワーイ、ってところで終わってましたしね。

-☆-

とりあえず以前のエントリに従っVirtualBoxを使って、Android x86を導入します。初めて入れたときからずいぶんたっており、すでにdev版ですがICSも動いています。が、今回は2.2を入れました(俺の携帯が2.2なので)。将来的にはヒトバシラーとしてHoneycombでも試してみましょうね。

導入したらEclipseとの連携。
Android上でalt-F1してコマンドラインを引っ張り出し、

  android-x86> netcfg

すると仮想マシンに振られたipアドレスがでるので控えておきます。控えたらalt-F7で元の画面に戻しておきましょうね。例として192.168.12.101とします。

次にホスト機(今回はwindows)でコマンドラインを立ち上げ、

  windows> adb connect 192.168.12.101 ←先ほど調べたipアドレス

これだけ。
あとはEclipseから普通に実行すれば、仮想マシン上でアプリが実行されます。

-☆-

正直、エミュレータより非常にいいです。なにしろ立ち上がるのが早い。
欠点は、ホスト機落としたり長いことeclipse放置したりすると切れるので、そのたびいちいちipアドレス調べて、adb connect … しないと行けない事ですが、まあ仮想マシンを固定アドレスにして、eclipse起動バッチにちょいちょい、とadbの手続きを追加してしのいでいます。それくらい楽。

閉じる コメント(0)

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

全1ページ

[1]


.

Count_Zero
人気度

ヘルプ

Yahoo Image

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
  今日 全体
訪問者 22 67309
ブログリンク 0 9
コメント 0 1141
トラックバック 0 13
検索 検索

ケータイで見る

モバイル版Yahoo!ブログにアクセス!

モバイル版Yahoo!ブログにアクセス!

URLをケータイに送信
(Yahoo! JAPAN IDでのログインが必要です)

開設日: 2005/12/4(日)


プライバシーポリシー -  利用規約 -  ガイドライン -  順守事項 -  ヘルプ・お問い合わせ

Copyright (C) 2012 Yahoo Japan Corporation. All Rights Reserved.