【问题标题】:Voice recognition on android with recorded sound clip?android上的语音识别与录制的声音剪辑?
【发布时间】:2011-01-20 03:44:16
【问题描述】:

我在 Android 上使用过语音识别功能,我很喜欢。这是我的客户最受赞誉的功能之一。但是,格式有些限制。您必须调用识别器意图,让它将录音发送到谷歌,然后等待文本返回。

我的一些想法需要在我的应用中录制音频,然后将剪辑发送到谷歌进行转录。

有什么方法可以发送音频剪辑以将语音转换为文本进行处理?

【问题讨论】:

  • 您知道这是否已包含在 API 中吗?如果没有,您是否找到了将自己的录音发送到 Google 的解决方法?
  • 我也在想同样的事情。我不敢相信 Android 有这么高的水平,在媒体方面似乎严重缺乏 API。
  • 未提供 Android 任何库来执行此操作。

标签: android speech-recognition voice voice-recognition


【解决方案1】:

我找到了一个可以很好地进行语音识别和录音的解决方案。这是我创建的一个简单 Android 项目的link,以显示解决方案的工作原理。另外,我在项目中放置了一些打印屏幕来说明应用程序。

我将尝试简要解释我使用的方法。我在该项目中结合了两个功能:Google Speech API 和 Flac 录音。

通过 HTTP 连接调用 Google Speech API。 Mike Pultz 提供了有关 API 的更多详细信息:

"(...) 新的 [Google] API 是一个全双工流 API。这意味着它实际上使用了两个 HTTP 连接——一个 POST 请求将内容作为“实时”分块流上传,以及用于访问结果的第二个 GET 请求,这对于较长的音频样本或流式音频更有意义。”

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

我通过从名为 AudioBoo 的开源应用程序中提取和改编一些代码和库,在该项目中实现了 Flac 录音。 AudioBoo 使用原生代码录制和播放 flac 格式。

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

我创建的项目具有使其工作的基本原则,并且可以针对特定情况进行改进。为了使其在不同的场景中工作,有必要获得一个 Google Speech API 密钥,该密钥是通过成为 Google Chromium-dev 组的一部分获得的。我在那个项目中留下了一把钥匙只是为了表明它正在工作,但我最终会删除它。如果有人需要有关它的更多信息,请告诉我,因为我无法在这篇文章中放置超过 2 个链接。

【讨论】:

  • @Isantsan 我需要实现类似的功能,但我发现第二部分(在 FLAC 中录制)真的很难你能帮我吗。我也研究了 AudioBoo 项目,但不知道从哪里开始。
  • 实际上api有变化,上面的代码在我尝试测试时崩溃了,这真的可能有录音和语音在android中测试
  • 如果 API 发生了变化,项目可能需要一些调整。我有一段时间没有跟上 API。但是,当发布此答案时,一切都按描述进行。
【解决方案2】:

很遗憾,目前没有。 Android 的语音识别服务目前唯一支持的接口是RecognizerIntent,它不允许您提供自己的声音数据。

如果您希望看到这些内容,请在http://b.android.com 提交功能请求。这也与现有的issue 4541 切线相关。

【讨论】:

  • Google 是否提供任何工具来评估识别器或语言模型的准确性?我们通常通过运行具有已知转录的预录样本来评估识别器的准确性。有没有一种方法可以测试 Google 识别器以了解它是否对我的应用程序有效?我还想根据我预先录制的样本测试这两种语言模型,以确定哪种语言模型的准确性更高。有什么办法可以做到吗?
  • 是否有任何方法可以将给定的声音从麦克风环回?类似于套接字/文件/流重定向的东西?
【解决方案3】:

据我所知,目前还没有办法将音频片段直接发送到 Google 进行转录。但是,Froyo(API 级别 8)引入了SpeechRecognizer 类,它提供对语音识别服务的直接访问。因此,例如,您可以开始播放音频片段并让您的 Activity 启动语音识别器在后台侦听,这将在完成后将结果返回给用户定义的侦听器回调方法。

以下示例代码应在 Activity 中定义,因为 SpeechRecognizer 的方法必须在主应用程序线程中运行。您还需要将RECORD_AUDIO 权限添加到您的AndroidManifest.xml。

boolean available = SpeechRecognizer.isRecognitionAvailable(this); if (available) { SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this); sr.setRecognitionListener(new RecognitionListener() { @Override public void onResults(Bundle results) { // process results here } // define your other overloaded listener methods here }); Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // the following appears to be a requirement, but can be a "dummy" value intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy"); // define any other intent extras you want // start playback of audio clip here // this will start the speech recognizer service in the background // without starting a separate activity sr.startListening(intent); }

您还可以通过扩展RecognitionService 来定义自己的语音识别服务,但这超出了此答案的范围:)

【讨论】:

  • 有没有人试过这个并且成功了?您是否必须在整个播放过程中等待较长的音频文件才能识别语音?
  • 虽然这是不久前发布的,但我已经确认(使用更多代码)这个想法确实有效(在 Android N 上)。调用startListening() 后,等待RecognitionListener.onReadyForSpeech() 回调并播放音频剪辑(大声!)。
  • 有没有人有接受音频剪辑和转换文本的代码参考@adelphus 提到的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多