Java在其虚拟机中使用了什么字节顺序?我记得在哪里读取它取决于它运行的物理机器,然后我读到的其他地方,我相信它始终是大端.哪个是对的?
在提出这个问题之前,我检查了所有与此问题相关的stackoverflow其他线程没有任何成功,所以请不要回答其他线程的链接,:)
我想保存/记录谷歌识别服务用于语音操作的音频(使用RecognizerIntent或SpeechRecognizer).
我经历了很多想法:
我几乎绝望,但我只是注意到Google Keep应用程序正在做我需要做的事情!我使用logcat稍微调试了keep应用程序,app也调用了"RecognizerIntent.ACTION_RECOGNIZE_SPEECH"(就像我们开发人员一样)来触发语音到文本.但是,如何继续保存音频?它可以成为隐藏的api吗?是谷歌"作弊":)?
谢谢您的帮助
最好的祝福
在Java程序中,什么是读取音频文件(最好的办法WAV文件)的数字阵列(float[],short[],...),并写出从数字数组的WAV文件?
我希望创建一个具有语音到文本的应用程序.
我使用RecognizerIntent了解这种能力:http://android-developers.blogspot.com/search/label/Speech%20Input
但是 - 我不希望弹出一个新的Intent,我想在我当前的应用程序中对某些点进行分析,我不希望它弹出一些声明它正在尝试录制你的声音.
有没有人知道如何最好地做到这一点.我或许正在考虑尝试Sphinx 4 - 但我不知道这是否可以在Android上运行 - 有没有人有任何建议或经验?!
我想知道我是否可以在这里更改代码,可能不会打扰显示UI或按钮,只是进行处理:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/的API /应用程序/ VoiceRecognition.html
干杯,
Android的SpeechRecognizer显然不允许将您正在进行语音识别的输入记录到音频文件中.也就是说,要么使用MediaRecorder(或AudioRecord)录制语音,要么使用SpeechRecognizer进行语音识别,在这种情况下,音频不会记录到文件中(至少不能录制到一个文件); 但你不能同时做到这两件事.
多次询问如何在Android中同时录制音频和进行语音识别的问题,最流行的"解决方案"是录制一个flac文件并使用Google的非官方语音API,允许你发送一个flac通过POST请求提交文件并获取带有转录的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秒的文件(确切的限制不明确,可能取决于文件大小或可能的单词数量).这使它不适合我的需要.
此外,将音频文件切片为较小的文件不是一种可能的解决方案; 甚至忘记了在正确的位置(不是在一个单词的中间)正确分割文件的困难,对上述web服务api的许多连续请求将随机导致空响应(Google表示每次使用限制为50个请求那天,但像往常一样,他们没有透露明确限制请求突发的实际使用限制的细节.
因此,所有这些似乎表明,在将输入录制到Android中的音频文件的同时获取语音转录是不可能的.
但是,谷歌Keep Android应用就是这么做的.它允许你说话,将你所说的内容翻译成文本,并保存文本和录音(很不清楚它存储在哪里,但你可以重放它).它没有长度限制.
所以问题是:是否有人知道Google如何做到这一点?我会查看源代码,但它似乎不可用,是吗?
我在进行语音识别时嗅探了Google Keep发送和接收的数据包,它肯定不会使用上面提到的语音api.所有流量都是TLS,并且(从外部看)它看起来与使用SpeechRecognizer时非常相似.
那么也许存在将麦克风输入流"分割"(即复制或复用)到两个流中的方式,并将其中一个馈送到SpeechRecognizer,另一个馈送到MediaRecorder?
我正在开发一个功能,当按下按钮时,它将启动语音识别,同时记录用户说的内容.代码如下:
button_start.setOnTouchListener( new View.OnTouchListener()
{
@Override
public boolean onTouch(View arg0, MotionEvent event)
{
if (pressed == false)
{
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,"voice.recognition.test");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-HK");
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);
sr.startListening(intent);
Log.i("111111","11111111");
pressed = true;
}
recordAudio();
}
if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL))
{
stopRecording();
}
return false;
}
});
}
public void recordAudio()
{
isRecording = true;
try
{
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile(audioFilePath);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.prepare();
}
catch (Exception e)
{
e.printStackTrace();
}
mediaRecorder.start();
}
public void stopRecording()
{
if (isRecording) …Run Code Online (Sandbox Code Playgroud) I was able to run an example project which uses Android speech to text using this code:
private void startVoiceRecognitionActivity()
{
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Voice recognition Demo...");
startActivityForResult(intent, REQUEST_CODE);
}
Run Code Online (Sandbox Code Playgroud)
This works fine, but I was wondering, is it possible to use speech to text with an audio sample (byte array?) instead of recorded voice?
kind regards
认识到由谷歌服务器的演讲,我用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数组缺少一些音频块。
有没有人遇到同样的问题?任何解决方案的提示?谢谢!