在我的基于语音识别的应用程序中,我有时会收到ERROR_RECOGNIZER_BUSY.直觉上,这需要...... 重试,对吧?
问题是这个错误是非常无证的,所以很明显我有些问题可能是在该领域更有经验的人能够回答:
我们非常欢迎您经验丰富的见解.谢谢.
我的应用程序导致这些可怕的GC_FOR_ALLOC在特定位置(方法)多次发生:
12-29 22:20:30.229: D/dalvikvm(10592): GC_FOR_ALLOC freed 1105K, 14% free 10933K/12615K, paused 33ms, total 34ms
12-29 22:20:30.260: D/dalvikvm(10592): GC_FOR_ALLOC freed 337K, 13% free 11055K/12615K, paused 25ms, total 26ms
12-29 22:20:30.288: D/dalvikvm(10592): GC_FOR_ALLOC freed 278K, 14% free 10951K/12615K, paused 24ms, total 24ms
12-29 22:20:30.495: D/dalvikvm(10592): GC_CONCURRENT freed 633K, 11% free 11317K/12615K, paused 16ms+3ms, total 79ms
12-29 22:20:30.495: D/dalvikvm(10592): WAIT_FOR_CONCURRENT_GC blocked 16ms
12-29 22:20:30.499: D/dalvikvm(10592): WAIT_FOR_CONCURRENT_GC blocked 15ms
Run Code Online (Sandbox Code Playgroud)
我很清楚我在内存管理方面做错了(是的,垃圾收集很棒,但仍然没有让我免除责任,知道何时以及如何分配).
您能否推荐一种故障排除方法或技术,可以引导我找到令人讨厌的代码行和可能的解决方案?
我正在尝试运行Android 2.2模拟器附带的Speech Recorder.问题是我点击"录制"按钮的那一刻:

它中止了一条错误消息"应用程序语音记录器(进程com.android.speechrecorder)意外停止.请再试一次."

问题是再次尝试并没有帮助.
现在,我搜索了StackOverflow,我梳理了整个互联网,我找到了许多相同问题的报告,没有任何可行的解决方案.
我的结论是,由于一些奇怪的原因,Android模拟器能够使用Windows音频设备进行输出,但不能用于输入.
这是为什么?
我知道其他虚拟化软件(例如VMWare)使用主机音频设备的输出和输入部分都没有问题.
此外,如果Speech Recorder从未为任何人的模拟器工作,为什么要把它放在那里?
当然这对某人有用.有没有办法让Speech Recorder为我工作?
我使用的是32位Windows XP,我的AVD是用SD卡定义的(启动时安装).
更新:我按照@Klaus的建议尝试查看是否抛出任何异常.我这样做只需在命令行输入ddms.bat即可启动独立版本的DDMS(底部有一个logcat显示).果然,点击"录制"按钮后我收到以下异常:
03-29 14:16:58.195: ERROR/AudioRecord(303): Could not get audio input for record source 1
03-29 14:16:58.195: ERROR/srec_jni(303): initCheck error -22
03-29 14:16:58.205: DEBUG/SpeechRecorderActivity(303): run audio capture thread
03-29 14:16:58.205: WARN/dalvikvm(303): threadid=8: thread exiting with uncaught exception (group=0x4001d800)
03-29 14:16:58.215: ERROR/AndroidRuntime(303): FATAL EXCEPTION: Thread-9
03-29 14:16:58.215: ERROR/AndroidRuntime(303): java.lang.NullPointerException
03-29 14:16:58.215: ERROR/AndroidRuntime(303): at com.android.speechrecorder.SpeechRecorderActivity$4.run(SpeechRecorderActivity.java:192)
03-29 14:16:58.285: WARN/ActivityManager(59): Force finishing activity com.android.speechrecorder/.SpeechRecorderActivity
03-29 14:16:58.904: DEBUG/dalvikvm(59): GC_FOR_MALLOC …Run Code Online (Sandbox Code Playgroud) 安卓2.X并不会自动发出声音提示时,准备演讲输入.
Android 4.1的确如此.
这些版本之间会发生什么?即什么时候介绍这个很酷的功能?
我需要这个,以便Build.VERSION.SDK_INT在运行时执行检查.
你知道有哪些来源记录这个吗?
由于各种原因,我需要使用原始SpeechRecognizerAPI而不是更简单的RecognizerIntent(RECOGNIZE_SPEECH)活动.
这意味着,除其他外,我需要处理RecognitionListener.onError()自己.
为了回应一些错误,我只想重新开始听.这看起来很简单但是当我只是调用SpeechRecognizer.startListening()错误时,这有时似乎会触发两个不同的错误:
ERROR/ServerConnectorImpl(619): Previous session not destroyed
Run Code Online (Sandbox Code Playgroud)
和
"concurrent startListening received - ignoring this call"
Run Code Online (Sandbox Code Playgroud)
在尝试SpeechRecognizer.startListening()再次打电话之前,我应该做一些清理工作.
如果这是真的,则意味着在RecognitionListener错误时,不会自动停止和/或取消侦听.
某些错误也可能会停止/取消收听,而其他错误则不会.实际上只有9个SpeechRecognizer错误:
由于文档不是非常详细地说明哪个错误取消了哪个错误,哪个没有取消,你是否根据自己的经验知道哪些错误需要在再次尝试之前进行清理(以及在何种程度上)SpeechRecognizer.startListening()?
Android的NDK需要双方 的Cygwin 和 GNU制作.由于我已经安装了最新和最好的Cygwin,我认为GNU Make必须已经包含在其中,因为Cygwin非常适合开发人员.
但我找不到任何东西,无论是在我的本地安装中,还是在软件包列表中,这让我很好奇地理解为什么在所有GNU软件包中,这是Cygwin选择不包含的软件包.
或者也许这样的Cygwin版本的GNU make存在而我却找不到它?
如果是这样,我在哪里/如何下载它?
从您通过startActivityForResult()调用它之前,Google语音搜索会显着延迟,直到显示其对话框,准备好发表演讲.
这要求用户在说话之前始终查看屏幕,等待显示对话框.
所以我想通过实现RecognitionListener并在onReadyForSpeech()中发出DTMF音来生成声音信号而不是对话框,如下面的代码片段所示:
@Override
public void onReadyForSpeech(Bundle params) {
Log.d(LCTAG, "Called when the endpointer is ready for the user to start speaking.");
mToneGenerator.startTone(ToneGenerator.TONE_DTMF_1);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Log.e(LCTAG, "InterruptedException while in Thread.sleep(50).");
e.printStackTrace();
} // SystemClock.sleep(50);
mToneGenerator.stopTone();
}
Run Code Online (Sandbox Code Playgroud)
音调听起来很漂亮但是......它也被麦克风"听到",到达语音识别服务并始终产生识别错误ERROR_NO_MATCH.
有办法解决这个问题吗?
为了同步/队列访问共享资源,我将使用信号量,在等待循环的帮助下.
为了不碰到CPU挂钩,我想sleep()在那个while循环中稍微进行一下.
我搜索了http://developer.android.com参考,发现了两个这样的sleep()函数,我很困惑哪个适合哪种情况:
哪一个更适合我描述的情况,为什么?
我正在开发的基于语音识别的应用程序适用于从API 8(Android 2.2)开始的所有Android版本.
但是在Nexus S 4G(Android 4.1.1)上,RecognitionListener将暂停大约1分钟,然后通过其onError()回调发出ERROR_SERVER .
如果在1-2秒内(在onReadyForSpeech上发出哔哔声)说话,它将按预期正常运行.
在JellyBean中有什么变化可以解释这种行为?
更重要的是,是否有一种方法可以使其在旧版本的Android中表现得像?(即继续听,如果没有在默认的10秒内说出,则发出ERROR_SPEECH_TIMEOUT )