Google Keep如何在保存录音的同时进行语音识别?

时间:2014-08-23 16:12:43

标签: android google-api speech-recognition audio-recording

Android的SpeechRecognizer显然不允许将您正在进行语音识别的输入录制到音频文件中。 也就是说,要么使用MediaRecorder(或AudioRecord)录制语音,要么使用SpeechRecognizer进行语音识别,在这种情况下,音频不会记录到文件中(至少不能访问);但你不能同时做两件事。

如何在Android中同时实现录制音频和进行语音识别的问题已被多次询问,而最流行的“解决方案”是录制一个flac文件并使用Google的非官方语音API,它允许您通过POST请求发送一个flac文件并获取带有转录的json响应。 http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/(过时的Android版) https://github.com/katchsvartanian/voiceRecognition/tree/master/VoiceRecognition http://mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/

效果很好,但有一个巨大的限制,它不能用于超过大约10-15秒的文件(确切的限制不明确,可能取决于文件大小或可能的单词数量)。这使它不适合我的需要。

此外,将音频文件切片为较小的文件不是一种可能的解决方案;甚至忘记了在正确的位置(不是在一个单词的中间)正确分割文件的困难,对上述网络服务api的许多连续请求将随机导致空响应(Google表示每次使用限制为50个请求一天,但像往常一样,他们没有透露明确限制请求突发的真实使用限制的详细信息。)

所以,所有这些似乎表明,在将输入录制到Android中的音频文件的同时获取语音转录是不可能的。

但是,谷歌Keep Android应用确实如此。 它允许你说话,将你所说的内容翻译成文本,并保存文本和录音(很不清楚它存储在哪里,但你可以重放它)。 它没有长度限制。

所以问题是:是否有人知道Google如何做到这一点的想法? 我会查看源代码,但它似乎不可用,是吗?

我在进行语音识别时嗅到了Google Keep发送和接收的数据包,并且它肯定不会使用上面提到的语音api。所有流量都是TLS,并且(从外部看)它看起来与使用SpeechRecognizer时非常相似。

也许有一种方法可以将麦克风输入流“拆分”(即复制或复用)成两个流,然后将其中一个馈送到SpeechRecognizer,另一个馈送到MediaRecorder?

2 个答案:

答案 0 :(得分:5)

Google Keep会使用某些未记录的附加内容启动RecognizerIntent,并期望生成的意图包含录制的音频的URI。如果Google语音搜索为RecognizerIntent提供服务,则一切正常,Keep会获得音频。

有关详细信息,请参阅record/save audio from voice recognition intent,以与Keep(可能)相同的方式调用识别器的代码示例。

请注意,此行为不属于Android。这只是两种闭源Google应用程序如何相互通信的当前未记录方式。

答案 1 :(得分:-1)

它使用onPartialResults(Bundle) 此事件返回在录制的语音中识别的文本 它也适用于Xamarin