14

对于使用 Android语音识别 API的每个人,曾经有一个方便的RecognitionListener可以注册,它将各种事件推送到您的回调。特别是,有以下onBufferReceived(byte[])方法:

public abstract void onBufferReceived (byte[] buffer)

自:API Level 8收到更多声音。此功能的目的是允许向用户提供有关捕获的音频的反馈。不保证会调用此方法。

参数 buffer 包含表示单通道音频流的大端 16 位整数序列的缓冲区。采样率取决于实现。

尽管该方法明确声明不能保证它会被调用,但在 ICS 和之前的版本中,它会在 100% 的时间内有效地被调用:至少,通过连接以这种方式接收的所有字节,您可以重建整个音频流并播放。

然而,出于某种原因,在 Jellybean SDK 中,这神奇地停止了工作。没有弃用通知,代码仍然可以编译,但onBufferReceived现在从未调用过。从技术上讲,这并没有破坏他们的 API(因为它说“不能保证”该方法会被调用),但显然这对于​​许多依赖于这种行为的事情来说是一个重大变化。

有人知道为什么禁用此功能,是否有办法在 Jellybean 上复制其行为?

澄清:我意识到整个RecognizerIntent事情是一个具有多种实现的接口(包括一些在 Play 商店中可用的),并且他们每个人都可以选择如何处理RecognitionListener. 我特别指的是绝大多数 Jellybean 手机使用的默认 Google 实现。

4

4 回答 4

9

Google 并未将此方法称为他们的 Jelly Bean 语音应用程序 (QuickSearchBox)。它根本不在代码中。除非有来自谷歌工程师的官方评论,否则我无法给出明确的答案“为什么”他们这样做。我确实搜索了开发者论坛,但没有看到任何关于这个决定的评论。

语音识别的 ics 默认来自 Google 的 VoiceSearch.apk。您可以反编译此 apk 并查看并发现有一个 Activity 来处理动作意图 *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 方法,并且对该方法的(非保证)调用在 Jelly Bean 中被删除感到失望。好吧,如果我们无法使用 onBufferReceived() 获取音频,那么可能会同时运行 AudioRecord 和语音识别。有人试过这个吗?如果没有,我会试一试并报告。

于 2012-08-11T01:07:12.783 回答
0

我遇到了同样的问题。我之所以不只是接受“这不起作用”,是因为 Google Nows “自我笔记”会录制音频并将其发送给您。我在运行“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

这让我相信谷歌现在处理了来自谷歌的 audioFocus(regonizerIntent),并且当 Note-to-self-tag 出现在 onPartialResults 中时,他们使用录音机或类似的东西。我无法确认这一点,是否有其他人尝试过这项工作?

于 2013-02-20T13:11:20.233 回答
0

我有一个实现 RecognitionListener 的服务,并且我还覆盖了 onBufferReceived(byte[]) 方法。我正在调查为什么在 <=ICS 上调用 onResults() 语音识别要慢得多。我能找到的唯一区别是 onBufferReceived 在电话 <= ICS 上被调用。在 JellyBean 上,永远不会调用 onBufferReceived() 并且调用 onResults() 的速度要快得多,我认为这是因为每秒或毫秒调用一次 onBufferReceived 的开销。也许这就是他们取消 onBufferReceived() 的原因?

于 2014-01-29T07:24:13.457 回答