Han*_*sam 5 android speech-recognition voice-recognition
我正在使用RecognizerIntent.ACTION_RECOGNIZE_SPEECH ,,,我的问题是,我的问题是,我不知道如何创建将捕获用户输入的语音的缓冲区.我在堆栈溢出上读了很多,但我只是不明白我将如何将缓冲区和识别服务回调到我的代码中.以及我将如何回放保存到缓冲区的内容.
这是我的代码:
public class Voice extends Activity implements OnClickListener {
byte[] sig = new byte[500000] ;
int sigPos = 0 ;
ListView lv;
static final int check =0;
protected static final String TAG = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.voice);
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(SpeechRecognizer.RESULTS_RECOGNITION);
if (voiceResults == null) {
Log.e(TAG, "No voice results");
} else {
Log.d(TAG, "Printing matches: ");
for (String match : voiceResults) {
Log.d(TAG, match);
}
}
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.d(TAG, "Ready for speech");
}
@Override
public void onError(int error) {
Log.d(TAG,
"Error listening for speech: " + error);
}
@Override
public void onBeginningOfSpeech() {
Log.d(TAG, "Speech starting");
}
@Override
public void onBufferReceived(byte[] buffer) {
// TODO Auto-generated method stub
TextView display=(TextView)findViewById (R.id.Text1);
display.setText("True");
System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
sigPos += buffer.length ;
}
@Override
public void onEndOfSpeech() {
// TODO Auto-generated method stub
}
@Override
public void onEvent(int eventType, Bundle params) {
// TODO Auto-generated method stub
}
@Override
public void onPartialResults(Bundle partialResults) {
// TODO Auto-generated method stub
}
@Override
public void onRmsChanged(float rmsdB) {
// TODO Auto-generated method stub
}
};
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);
startActivityForResult(intent,check);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
Android 语音识别 API(截至 API 级别 17)不提供可靠的音频捕获方法。
您可以使用“收到缓冲区”回调,但请注意
RecognitionListener说onBufferReceived:
收到了更多的声音。此功能的目的是允许向用户提供有关捕获的音频的反馈。不保证会调用此方法。
buffer:包含表示单通道音频流的大端 16 位整数序列的缓冲区。采样率取决于实现。
和RecognitionService.Callback说bufferReceived:
收到声音后,服务应调用此方法。此功能的目的是允许向用户提供有关捕获的音频的反馈。
buffer:包含表示单通道音频流的大端 16 位整数序列的缓冲区。采样率取决于实现。
因此,此回调用于有关捕获的音频的反馈,而不一定是捕获的音频本身,即可能是出于可视化目的的简化版本。另外,“不能保证会调用此方法”,即 Google 语音搜索可能在 v1 中提供它,但随后决定在 v2 中删除它。
另请注意,该方法在识别过程中可以多次调用。然而,如果缓冲区代表完整录制的音频或仅代表自上次调用以来的片段,则不会记录。(我假设是后者,但你需要用你的语音识别器来测试它。)
因此,在您的实现中,您应该将缓冲区复制到一个全局变量中,以便在识别完成后保存到例如 wav 文件中。
| 归档时间: |
|
| 查看次数: |
4409 次 |
| 最近记录: |