blog2010 > 2010年09月03日 > Androidエミュレータで音声認識を行う方法


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

#blognavi
 Android 1.5から音声認識のためのRecognizerIntentが使えるようになっている。しかし、Android仮想端末にgoogle Voice Searchをインストールして実行しても「Audio Problem」やら何やらのエラーが出て使えない。
 Speech Recorderでの録音は問題なく出来るのに、Voice Searchではエラーになるとは腑に落ちない。調べてみると、Android仮想端末では8kHzまでの録音しか対応していないとの情報を発見。
 Voice Searchのソースコードは手に入らないので、apkからどうにかできないか思案。apkは単なるzip書庫で、中にある「classes.dex」がソースコードから生成された中間ファイル。元がJavaなので逆アセンブル可能か調べると、Android SDKに「dexdump」ツールが付属していることが判明。これである程度dexファイルのバイナリ構造が理解できた。
 結果として、classes.dexをバイナリエディタで修正してapkを作成し直したところ、無事にAndroid仮想端末でも音声認識(音声検索)を実行することが出来た。
 修正したapkは公開できないので、以下に手順だけ記載。OSはwindowsで、JDK、Android SDK、Eclipseがインストールされている前提。

  • どうにかしてVoice Searchのapkファイルを入手(今回はVoice_Search_1.4.1.apk 377,388 バイトを利用)
  • apk から classes.dex を取り出す
  • classes.dex をバイナリエディタで開き、「80 3E(16000)」の部分を「40 1F(8000)」に書換えて保存する(2箇所)
  • 「dexdump.exe -d <edited_classes.dex>」を実行する(チェックサムエラーが出る)
  • <edited_classes.dex>の9~12バイトの位置にあるチェックサムを、dexdumpが表示した新しいチェックサムに書き換えて保存する(エンディアン注意)
  • ExpLzhなりWinRarなりで、元のapkファイルを開き、classes.dexを、編集したclasses.dexで上書き更新する
  • apk内のMETA-INFフォルダ内のファイルを3つとも削除する
  • apk署名用のkeystoreファイルを用意する(Documents and Settings\<user>\.android\debug.keystoreが使える)
  • <jdk>\bin\jarsigner.exe -verbose -keystore <debug.keystore> <edited.apk> androiddebugkey を実行し、パスワードに「android」と入力して署名する
  • Android 1.6のAVDを作成し、作ったapkをインストールする
  • 音声認識が可能に
 要はclasses.dexをバイナリ編集して、サンプリングレートとしてセットしている「16000」の部分を「8000」に書き換えたapkファイルを作っている。今回使ったVoice Searchだと、Android 1.6では動いたがAndroid 2.2では動かなかった。他のAndroidのバージョンは試していない。Voice Searchの方が違うバージョンなら2.2でも動くかも知れないが、入手できないので未確認。
 音声認識が仮想端末で動かなかった状況が、音声認識を使ったアプリを開発しづらい一因になっていただろうから、その状況を打破する一助となれば。


カテゴリ: [Program] - &trackback- 2010年09月03日 12:34:09
  • 凄いです。ただ、やってみると「予期しないエラー」でできません。 -- Androidファン (2010-10-27 22:06:04)
  • 私が動作を確認したのはAndroid1.6のみで、2.2だと予期しないエラーが出ました。1.6で試してみて下さい。 -- hokonin (2010-11-05 19:29:00)
  • classes.dexを編集するまではやったのですが、CRCをどう付けるのかが分かりません。そのままapkへ組み込んでもダメですかね? -- Wolf2 (2010-11-17 11:52:40)
  • apk署名用のkeystoreファイルを用意するまでは行きましたが、debug.keystoreがどこにも見当たりません。 -- wolf2 (2010-11-17 22:58:47)
  • debug.keystoreはkeytoolで生成してapk作成までOKでインストール出来ました。ZT-180で使いたかったのですがエラー出ますね。 -- wolf2 (2010-11-18 01:05:02)
  • Android1.6でインストールまでできました。しかし -- ステーキ (2010-11-18 16:42:33)
  • 『The application ~中略~ has stoped unexpectedly.please try again.』のメッセージで止まってしまいます。何かお心当たりは無いでしょうか? -- ステーキ (2010-11-18 16:46:46)
  • サンプルレート変更のapkは出来たはずですが予期せぬエラーは出ますね。エミュでもZT-180でも・・・エミュのバージョンは2.1?ですかね? -- wolf2 (2010-11-18 23:07:19)
  • android1.6にインストールしたら動作しました!android2.1では無理みたいです2.1用に作る方法ないですか?ちなみにdawa D7は2.1ですがエラーは出ません(マイクが未実装ですがね) -- wolf2 (2010-11-19 08:27:09)
  • VoiceSearch_2.1.apkをベースに作ってみましたがandroid2.1エミュレータではオーディオエラーが出ます。 -- wolf2 (2010-11-19 10:16:07)
  • 予断ですが、DAWA D7 の空きランドにコンデンサマイクを半田付けしてみましたが動作しませんでした。(http://blog.11h.net/brian/98 を参考に) -- wolf2 (2010-11-22 15:26:26)
  • VoiceSearch_2.1.apkはどうも1.4.0みたいです。 -- wolf2 (2010-11-23 13:28:08)
  • Voice_Search_1.4.6.apkをベースに再度作ってみたら見事android2.1エミュレータにて動作いたしました。これをZT-180へ移してみたいと思ってます(今夜) -- wolf2 (2010-11-23 13:31:33)
  • tabi -- wolf2 (2010-11-23 22:25:47)
  • たびたびスミマセン。ZT-180でエラー無く動作しました。ありがとうございました。 -- wolf2 (2010-11-23 22:26:35)
  • Android仮想端末の仕様情報はどこで参照できるのでしょうか?ご教授頂けると助かります。 -- mkod (2010-12-08 11:49:49)
  • android1.6でやったのですが,うまくいきませんでした.インストール後のアイコンは赤いマイクみたいなやつからドロイド君の箱(?)変わりますか? -- 名無しさん (2010-12-08 14:56:07)
  • android1.6の場合はVoiceSearch1.4.1をベースに作ったら動作しましたよ。 -- wolf2 (2010-12-12 22:31:14)
  • 反応できず済みません。wolf2さん、貴重な情報とフォローありがとうございます。 -- hokonin (2010-12-27 12:26:16)
  • Apk Managerで1.4.1を再構築。音声認識自体は使えているようですがページ表示でエラーです。 -- mmm (2011-02-25 16:24:22)
名前: コメント:
#blognavi
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。