我试图在文件中保存由android的语音识别服务监听的音频数据.
实际上我RecognitionListener按照这里的解释实现:
Android上的语音到文本
将数据保存到缓冲区中,如下所示: 捕获发送到Google语音识别服务器的音频
并将缓冲区写入Wav文件,如此处所示. Android将原始字节记录到HVEp Streaming的WAVE文件中
我的问题是如何获得适当的音频设置以保存在wav文件的标题中.事实上,当我播放wav文件时,只听到奇怪的噪音,这个参数,
short nChannels=2;// audio channels
int sRate=44100; // Sample rate
short bSamples = 16;// byteSample
Run Code Online (Sandbox Code Playgroud)
或者没有这个:
short nChannels=1;// audio channels
int sRate=8000; // Sample rate
short bSamples = 16;// byteSample
Run Code Online (Sandbox Code Playgroud)
令人困惑的是从logcat查看语音识别任务的参数我发现第一个Set PLAYBACK采样率为44100 HZ:
12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Using 2 channels for PLAYBACK.
12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK sample rate to 44100 HZ
12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): …Run Code Online (Sandbox Code Playgroud) Google提供可在手机上使用的语音识别服务(Android内置,iPhone用户可以使用Google应用程序) - http://www.google.com/mobile/.我们在http://waxy.org/2008/11/deconstructing_google_mobiles_voice_search_on_the_iphone/找到了一篇文章,其中有人试图对该服务进行逆向工程.
我们希望在使用Android的RecognizerIntent时更好地了解网络上发生的情况.有没有人有经验在网上使用这项服务或知道可能解释其运作的其他文章?
编辑:我应该已经提到过这个,但我在服务中运行此代码.整个应用程序由小部件按钮打开/关闭,没有任何活动.
更新:我尝试将SDK源附加到项目中,这样我就可以更准确地了解发生故障的位置,但从外观来看,只包含公共API,这似乎使它们的用处更少.任何人都可以建议至少一种调试方法来解决这个问题吗?我有点卡住了.
我正在尝试使用Android的语音识别软件包来记录用户语音并将其翻译成文本.不幸的是,当我尝试启动监听时,我收到的ANR错误并未指出任何具体内容.
正如SpeechRecognizer API指示的那样,如果您尝试从主线程调用它,则抛出RuntimeException.这会让我想知道处理是否过于苛刻......但我知道其他应用程序使用Android API就可以实现这一目的,而且它通常非常活泼.
java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread
这是我试图从我的服务中调用的代码的一个(修剪过的)示例.这是正确的方法吗?
感谢您抽出宝贵时间提供帮助.这是一个我无法克服的障碍.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
"com.domain.app");
SpeechRecognizer recognizer = SpeechRecognizer
.createSpeechRecognizer(this.getApplicationContext());
RecognitionListener listener = new RecognitionListener() {
@Override
public void onResults(Bundle results) {
ArrayList<String> voiceResults = results
.getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
if (voiceResults == null) {
Log.e(getString(R.string.log_label), "No voice results");
} else {
Log.d(getString(R.string.log_label), "Printing matches: ");
for (String match : voiceResults) {
Log.d(getString(R.string.log_label), match); …Run Code Online (Sandbox Code Playgroud) 作为我正在研究的概念证明的一部分,我需要自动转录一些简短的MP3.我目前正在研究云解决方案或Web API服务,将MP3作为简单的HTTP请求发送并接收转录.
我在这里找到的唯一免费/开源解决方案,但演示似乎不起作用(至少不是我需要转录的文件).我已经为呼叫中心找到了一些企业解决方案,但到目前为止我无法简单地集成到一个项目中.
是否有基于网络的语音识别服务?一个能够滤除小噪音的人将是一个加号.
认识到由谷歌服务器的演讲,我用SpeechRecognizer类与RecognitionListener组合中建议斯蒂芬的回答到这个问题。此外,我尝试使用 RecognitionListener 中的 onBufferReceived() 回调来捕获正在识别的音频信号,例如:
byte[] sig = new byte[500000] ;
int sigPos = 0 ;
...
public void onBufferReceived(byte[] buffer) {
System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
sigPos += buffer.length ;
}
...
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,除非 SpeechRecognizer 无法连接到 Google 服务器、音频块未复制到上述sig数组中,并且会引发 HTTP 连接超时异常。SpeechRecognizer 最终连接到谷歌服务器,识别结果表明收到了完整的音频信号;只有sig数组缺少一些音频块。
有没有人遇到同样的问题?任何解决方案的提示?谢谢!