14

Androidの音声認識APIを使用するすべての人にとって、コールバックにさまざまなイベントをプッシュする登録可能な便利なRecognitionListenerがありました。特に、次のonBufferReceived(byte[])方法がありました。

public abstract void onBufferReceived (byte[] buffer)

以来:APIレベル8より多くのサウンドが受信されました。この機能の目的は、キャプチャされたオーディオに関してユーザーにフィードバックを提供できるようにすることです。このメソッドが呼び出される保証はありません。

パラメータ buffer は、シングルチャネルオーディオストリームを表すビッグエンディアンの16ビット整数のシーケンスを含むバッファです。サンプルレートは実装に依存します。

このメソッドは、呼び出される保証がないことを明示的に示していますが、ICSおよびそれ以前では、実質的に100%の時間呼び出されます。少なくとも、この方法で受信したすべてのバイトを連結することで、オーディオストリーム全体を再生します。

ただし、何らかの理由で、Jellybean SDKでは、これが魔法のように機能しなくなりました。非推奨の通知はなく、コードはコンパイルされますが、がonBufferReceived呼び出されることはありません。技術的には、これはAPIを壊しているわけではありませんが(メソッドが呼び出される「保証はない」と書かれているため)、明らかにこれは、この動作に依存する多くのものにとって壊滅的な変更です。

この機能が無効にされた理由と、Jellybeanでその動作を複製する方法があるかどうかを誰かが知っていますか?

明確化:すべてRecognizerIntentが複数の実装(Playストアで入手可能なものを含む)とのインターフェースであり、それぞれがで何をするかを選択できることを理解していますRecognitionListener。私は特に、Jellybean電話の大部分が使用するデフォルトのGoogle実装について言及しています。

4

4 に答える 4

9

Googleは、このメソッドをJelly Bean音声アプリ(QuickSearchBox)とは呼びません。それは単にコードにはありません。Googleエンジニアからの公式コメントがない限り、彼らがこれを行った「理由」について明確な答えを出すことはできません。開発者フォーラムを検索しましたが、この決定についてのコメントはありませんでした。

音声認識のデフォルトのicsは、GoogleのVoiceSearch.apkに由来します。このapkを逆コンパイルして、アクションのインテント*android.speech.action.RECOGNIZE_SPEECH*を処理するアクティビティがあることを確認してください。このapkで「onBufferReceived」を検索し、com.google.android.voicesearch.GoogleRecognitionService$RecognitionCallbackでその参照を見つけました。

Jelly Beanを使用して、GoogleはVoiceSearch.apkの名前をQuickSearch.apkに変更し、アプリに多くの新しい追加を行いました(オフラインディクテーションなど)。あなたはまだonBufferReceived呼び出しを見つけることを期待するでしょう、しかし何らかの理由でそれは完全になくなっています。

于 2012-08-07T05:02:18.777 に答える
2

私もonBufferReceivedメソッドを使用していて、メソッドへの(保証されていない)呼び出しがJellyBeanでドロップされたことに失望しました。onBufferReceived()で音声を取得できない場合は、音声認識と同時にAudioRecordを実行する可能性があります。誰かがこれを試しましたか?そうでない場合は、それを回転させて報告します。

于 2012-08-11T01:07:12.783 に答える
0

私は同じ問題に遭遇しました。「これが機能しない」ということだけを受け入れなかったのは、GoogleNowsが音声を「メモして」録音して送信するためです。「note-to-self」操作の実行中にlogcatで見つけたのは、次のとおりです。

02-20 14:04:59.664: I/AudioService(525):  AudioFocus  requestAudioFocus() from android.media.AudioManager@42439ca8com.google.android.voicesearch.audio.ByteArrayPlayer$1@424cca50

02-20 14:04:59.754: I/AbstractCardController.SelfNoteController(8675): #attach
02-20 14:05:01.006: I/AudioService(525):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@42439ca8com.google.android.voicesearch.audio.ByteArrayPlayer$1@424cca50

02-20 14:05:05.791: I/ActivityManager(525): START u0 {act=com.google.android.gm.action.AUTO_SEND typ=text/plain cmp=com.google.android.gm/.AutoSendActivity (has extras)} from pid 8675
02-20 14:05:05.821: I/AbstractCardView.SelfNoteCard(8675): #onViewDetachedFromWindow

これにより、googleがaudioFocusをgoogle now(regonizerIntent)から破棄し、Note-to-self-tagがonPartialResultsに表示されるときに、オーディオレコーダーなどを使用していると確信できます。私はこれを確認できません、他の誰かがこれを機能させようとしましたか?

于 2013-02-20T13:11:20.233 に答える
0

RecognitionListener を実装しているサービスがあり、 onBufferReceived(byte[]) メソッドもオーバーライドしています。<=ICS で onResults() を呼び出すと音声認識が非常に遅くなる理由を調査していました。私が見つけた唯一の違いは、onBufferReceivedが電話<= ICSで呼び出されることでした。JellyBean では onBufferReceived() は呼び出されず、onResults() は非常に高速に呼び出されます。これは、1 秒またはミリ秒ごとに onBufferReceived を呼び出すオーバーヘッドが原因であると考えています。たぶんそれが彼らが onBufferReceived() を廃止した理由でしょうか?

于 2014-01-29T07:24:13.457 に答える