logging/保存来自语音识别意图的audio

在问这个问题之前,我检查了所有与此问题有关的stackoverflow其他线程没有任何成功,所以请不要回答与其他线程的链接,:)

我想保存/logging谷歌识别服务用于语音文本操作的audio(使用RecognizerIntent或SpeechRecognizer)。

我经历了很多想法:

  1. onBufferReceived来自RecognitionListener:我知道,这是行不通的,只是testing它看看会发生什么,onBufferReceived永远不会被调用(用JB 4.3testing星系连接)
  2. 使用媒体logging器:不工作。 这是破坏语音识别。 话筒只允许一个操作
  3. 试图find识别服务在保存临时audio文件之前执行语音到文本api复制它,但没有成功

我几乎绝望,但我只是注意到,谷歌保持应用程序正在做我所需要做的! 我放了一些使用logcat的保持应用程序,应用程序也调用“RecognizerIntent.ACTION_RECOGNIZE_SPEECH”(如我们,开发人员)来触发语音文本。 但是,如何保持audio? 它可以是一个隐藏的API? 是谷歌“作弊”:)?

感谢您的帮助

最好的祝福

@卡雷尔的答案几乎完成 – 所产生的audio是在intent.getData()并可以使用ContentResolver

不幸的是,返回的AMR文件是低质量的 – 我无法find获得高质量录制的方法。 我试过的除“audio / AMR”之外的任何值都在intent.getData()返回null。

如果你find一种方法来获得高品质的录音 – 请评论或添加一个答案!

 public void startSpeechRecognition() { // Fire an intent to start the speech recognition activity. Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // secret parameters that when added provide audio url in the result intent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR"); intent.putExtra("android.speech.extra.GET_AUDIO", true); startActivityForResult(intent, "<some code you choose>"); } // handle result of speech recognition @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // the resulting text is in the getExtras: Bundle bundle = data.getExtras(); ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS) // the recording url is in getData: Uri audioUri = data.getData(); ContentResolver contentResolver = getContentResolver(); InputStream filestream = contentResolver.openInputStream(audioUri); // TODO: read audio file from inputstream } 

上次我查了一下,Google Keep设置了这些额外的function:

  • android.speech.extra.GET_AUDIO_FORMAT:audio / AMR
  • android.speech.extra.GET_AUDIO:true

这些不作为Android文档的一部分logging,所以它们不构成Android API。 另外,Google Keep并不依赖识别器意图来考虑这些额外信息。 如果这些额外function被Google推广和logging,那肯定会很好。

要找出Google Keep在调用RecognizerIntent时设置了哪些额外function,请实施一个响应RecognizerIntent的应用程序,并打印出所有收到的附加内容。 您也可以安装Kõnele( http://kaljurand.github.io/K6nele/ ),这是RecognizerIntent一个实现。 当Kõnele由Google Keep启动时,长按扳手形状的设置图标。 这显示了一些关于来电者的技术细节,并且还包括来话演员。

@Iftah的回答解释了Google Keep如何将audiologging返回给RecognizerIntent的调用者。

我从这里得到了这个答案,我检查了date,看到它发布后几天,所以我想你错过了它。 Android语音识别和录音同时进行

一个家伙说:

我有一个解决scheme,运行良好,有语音识别和录音。 这里( https://github.com/katchsvartanian/voiceRecognition )是我创build的一个简单的Android项目的链接,以显示解决scheme的工作。 此外,我把一些打印屏幕内的项目来说明应用程序。

我会尝试简单地解释我使用的方法。 我在该项目中结合了两个function:Google Speech API和Flac录制。

Google Speech API通过HTTP连接进行调用。 Mike Pultz提供了关于API的更多细节:

“(…)新的[Google] API是一个全双工stream媒体API,这意味着它实际上使用两个HTTP连接 – 一个POST请求将内容上传为”实时“分块stream,第二个GET请求来访问结果,这对于更长的audio采样或者stream式audio更为合理。“

但是,这个API需要接收一个FLAC声音文件才能正常工作。 这让我们进入第二部分:Flac录音

我通过从一个名为AudioBoo的开源应用程序中提取和修改一些代码和库来实现Flac录制。 AudioBoo使用本地代码来logging和播放flac格式。

因此,您可以录制一个flac声音,将其发送到Google Speech API,获取文本,并播放刚录制的声音。

我创build的项目具有使其工作的基本原则,并可针对特定情况进行改进。 为了使它在不同的情况下工作,有必要获得谷歌语音API密钥,这是由谷歌铬开发组的一部分获得。 我在该项目中留下了一把钥匙,以显示它正在工作,但我最终将删除它。 如果有人需要更多关于它的信息,让我知道原因,我不能在这篇文章中超过2个链接。