为什么RecognitionListener在JellyBean中停止工作?

时间:2012-08-01 15:34:57

标签: android voice-recognition

对于使用Android voice recognition API的所有人来说,曾经有一个方便的RecognitionListener您可以注册,这会将各种事件推送到您的回调中。特别是,有以下onBufferReceived(byte[])方法:

  

public abstract void onBufferReceived (byte[] buffer)

     

自:API等级8 收到了更多声音。这个目的   功能是允许向用户提供有关的反馈   捕获的音频。无法保证将调用此方法。

     

参数 buffer一个包含big-endian 16位序列的缓冲区   表示单通道音频流的整数。采样率   是依赖于实现的。

虽然该方法明确指出没有保证它将被调用,但在ICS和之前它将被有效地被调用100%的时间:通常足够,至少,通过连接所有以这种方式接收的字节,你可以重建整个音频流并播放它。

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

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

澄清:我意识到整个RecognizerIntent事物是一个具有多个实现的界面(包括Play商店中提供的一些实现),并且他们每个人都可以选择如何处理{ {1}}。我特指的是绝大多数Jellybean手机使用的默认Google实施。

4 个答案:

答案 0 :(得分:8)

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

语音识别的默认设置来自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调用,但由于某种原因它完全消失了。

答案 1 :(得分:2)

我也在使用onBufferReceived方法,并且对在Jelly Bean中删除对该方法的(非保证)调用感到失望。好吧,如果我们无法使用onBufferReceived()获取音频,也许有可能在语音识别的同时运行AudioRecord。有人试过吗?如果没有,我会给它一个旋转并报告回来。

答案 2 :(得分: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

这让我相信google现在从google处理audioFocus(regonizerIntent),并且当onPartialResults中出现Note-to-self-tag时,他们使用录音机或类似的东西。我无法证实这一点,还有其他人试图让这项工作成功吗?

答案 3 :(得分:0)

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