【问题标题】:Why did RecognitionListener stop working in JellyBean?为什么 RecognitionListener 在 JellyBean 中停止工作?
【发布时间】:2014-01-29 15:24:13
【问题描述】:

对于使用 Android 的voice recognition 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 实现。

【问题讨论】:

    标签: android voice-recognition


    【解决方案1】:

    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 调用,但由于某种原因它完全消失了。

    【讨论】:

    • 感谢您的深入分析,确认该问题在 Jellybean 上普遍存在 :) 我想唯一能更明确的方法是让 Google 工程师解释为什么 i> 这发生了。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 我怀疑这可能,但我很想听听你的结果。
    • 好吧,我试了一下,但看起来同时运行 AudioRecord 和 SpeechRecognizer 是行不通的。只有其中一个可以访问麦克风。所以,回到需要 onBufferReceived() 来工作....来谷歌吧!
    【解决方案3】:

    我遇到了同样的问题。我之所以不只是接受“这不起作用”,是因为 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),并且当 Note-to-self-tag 出现在 onPartialResults 中时,他们会使用录音机或类似的东西。我无法确认这一点,还有其他人尝试过吗?

    【讨论】:

      【解决方案4】:

      我有一个正在实现 RecognitionListener 的服务,并且我还覆盖了 onBufferReceived(byte[]) 方法。我正在调查为什么在

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 2020-12-05
        相关资源
        最近更新 更多