我一直试图按照这篇文章中的例子.
由于我没有尝试在服务中实现这一点,而是在标准活动中实现,因此我没有遇到上述帖子中描述的问题.
然而,当getStringArrayList(RecognizerIntent.EXTRA_RESULTS)返回null 时,我不断得到"没有语音结果" - 正如在该帖子中实现的那样.
很显然,我的思念中需要做什么成才,除了以
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
是否有可能除了startListening()之外我还需要startActivityForResult()?如果是这样,我已经尝试了这个,但它调用了完整的谷歌语音搜索活动(这是我试图避免的,就像@ vladimir.vivien在这里写的那样).由于2个识别器同时运行,这会产生更多问题......
起初我认为缺少的是实际提交给Google的服务器,但是当我从语音识别会话开始直到结束时检查LogCat输出(见下文)时,我看到它实际上创建了一个带有http:/的TCP会话/www.google.com/m/voice-search.
所以显而易见的问题是我错过了什么?
04-18 07:02:17.770: INFO/RecognitionController(623): startRecognition(#Intent;action=android.speech.action.RECOGNIZE_SPEECH;S.android.speech.extra.LANGUAGE_MODEL=free_form;S.android.speech.extra.PROMPT=LEARNSR;S.calling_package=com.example.learnsr.SrActivity;end)
04-18 07:02:17.770: INFO/RecognitionController(623): State change: STARTING -> STARTING
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Switching audio device to
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Speakerphone
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): AudioHardware PCM record is going to standby.
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Switching audio …Run Code Online (Sandbox Code Playgroud) developer.android.com中的Semaphore类概述看起来非常好 - 对于那些已经熟悉概念和术语的人来说.
我熟悉那里的一些首字母缩略词和其他术语(例如FIFO,锁等),但是对我来说是新的permits,fairness并且barging对我来说是新的.
你能推荐一个很好的在线资源来解释这些概念吗?(我可能会弄清楚许可和公平是什么,但barging在这一点上是未知的).
编辑:收到下面的两个答案后,我意识到我需要刷新信号量(重新获取()术语).我发现以下资源很有用:
我的Nexus One有它:
但是,在模拟器(API级别8,Android 2.2)上,无法找到上述任何内容.
Android 2.2不是语音搜索的一部分吗?如果是这样,为什么在我的Nexus One(Froyo)上找到它,而不是在模拟器上?
至少可以使用"语音输入和输出设置",我需要做什么?
更新1:我按照以下建议创建启用识别器的AVD的说明,但我仍然收到"识别器不存在"消息:

我还需要做什么?
尽管安装Google API,Android API 8,修订版2并使用它创建了一个特殊的AVD,我是否有可能仍然需要从Android Market安装语音搜索应用程序?
更新2:我按照迈克尔的更正来安装谷歌的语音搜索应用程序.这解决了"识别器不存在"的问题,但现在我遇到了一个新问题:

该应用程序的建议"再次说话"是假的:再次说话会一遍又一遍地呈现相同的错误消息.
speech-recognition speech-to-text voice-recognition android-emulator
仅从名称,我可以推导出stopListening()与startListening()相反.
我也可以理解destroy()与createSpeechRecognizer()相反.
但取消() ......与什么相反?
我在文档中找到的所有内容是:
取消语音识别.
cancel()与stopListening()有何不同?
我试图用KEYCODE_BACK调用我的主要活动的onKeyDown(),这样它就像我自己按下"后退"按钮一样.我使用以下代码执行此操作:
KeyEvent goBackDown = new KeyEvent(0,0,KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK,0,0);
goBackDown.dispatch(activity);
SystemClock.sleep(50); // as if human pressed the key
KeyEvent goBackUp = new KeyEvent(0,0,KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BACK,0,0);
goBackUp.dispatch(activity);
Run Code Online (Sandbox Code Playgroud)
我的活动的onKeyDown()目前只调用:
return super.onKeyDown(keyCode, event);
Run Code Online (Sandbox Code Playgroud)
然而,与真正的 Back按钮不同,当调用"假"代码时,活动拒绝变得不可见.
为什么?
我没有在我的代码中的任何地方实例化AndroidHttpClient,但我确实启动了识别器意图,在我的应用程序运行时会产生此异常:
Leak found
java.lang.IllegalStateException: AndroidHttpClient created and never closed
at android.net.http.AndroidHttpClient.<init>(AndroidHttpClient.java:152)
at android.net.http.AndroidHttpClient.newInstance(AndroidHttpClient.java:138)
at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.<init>(SpeechServiceHttpClient.java:59)
at com.google.android.voicesearch.speechservice.ServerConnectorImpl.<init>(ServerConnectorImpl.java:85)
at com.google.android.voicesearch.VoiceSearchContainerImpl.createRecognitionController(VoiceSearchContainerImpl.java:83)
at com.google.android.voicesearch.GoogleRecognitionService.onCreate(GoogleRecognitionService.java:65)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2066)
at android.app.ActivityThread.access$2500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
假设该错误不在Android的代码中,但在我的代码中,这个泄漏的资源可能只在以下之一中创建:
SpeechRecognizer.createSpeechRecognizer()new RecognitionListener()new Intent(SpeechRecognizer.RESULTS_RECOGNITION)SpeechRecognizer.startListening(recognizerIntent)但我怎么知道哪一个?
我正在寻找一种将有限词汇量语音识别集成到我的Android应用程序中的方法(因为Google语音搜索依赖于用户并不总是可以访问的Internet访问).
我找到了Nuance页面,诱使程序员下载NDEV或"Dragon Mobile SDK",但如果它需要像Google Voice Search一样上网,我为什么要对它感兴趣呢?
不幸的是,Nuance的页面信息量不大,需要您注册(并签署龙卷协议......),然后才有机会花时间下载和使用该套件,但发现它不是您要找的内容...
您是否碰巧知道NDEV 的语音识别部分或"Dragon Mobile SDK"是否需要访问Internet?
你知道任何现成的货架SDK的Android版的并不需要访问Internet(即一些有限的词汇量语音识别可以在本地的Android设备上完成的)?
我一直在版本控制我的工作区下的项目,但我从未想过我应该检查工作区配置本身.
到现在.
我知道我对永久膨胀的.log文件完全没兴趣,所以我绝对不会检查它,但是......我可以丢弃其他其他子目录或文件吗?应该.lock检查(大小0)吗?.plugins子目录怎么样?
SpeechRecognizer类包含 isRecognitionAvailable()、startListening()和stopListening() 等方法,但没有检查当前是否正在监听的方法。
我也检查了RecognitionListener类,它也没有这样的“isListening()”方法。
知道为什么吗?(例如,它没有用/没有意义,太容易由应用程序程序员实现,等等)
如果确实没有SDK API提供此功能,那么实现这种“isListening()”方法的最佳方法是什么?
是否像在 onReadyForSpeech() 中设置布尔值并在 onEndOfSpeech() 中清除它一样简单?
或者我是否需要更复杂的东西,例如计数器......甚至原子计数器?
android ×7
back-button ×1
eclipse ×1
httpclient ×1
java ×1
keyevent ×1
onkeydown ×1
onpause ×1
semaphore ×1