Cześć!
Chciałbym wykorzystać rozpoznawanie mowy w swojej aplikacji. Użytkownik po naciśnięciu przycisku ma dyktować coś do mikrofonu przez X sekund, a po zakończeniu aplikacja ma pokazać to, co wypowiedział. Problem polega na tym, że kiedy występuje jakakolwiek przerwa w mówieniu android "sam" ucina nasłuchiwanie i pokazuje wynik. Zależy mi na tym, aby aplikacja nasłuchiwała cały czas aż do "ręcznego" zastopowania. Próbowałem z EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS i innymi opcjami ale są one ignorowane. Druga sprawa (opcjonalna) - da się jakoś wyłączyć ten irytujący dźwięk "BEEP!" przy rozpoczynaniu i zakończeniu nasłuchiwania?
package com.xyz.voicerecognition;
import android.content.Intent;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.os.Bundle;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private TextView mText;
private SpeechRecognizer sr;
private static final String TAG = "MyActivity";
class MyRecognitionListener implements RecognitionListener {
public void onReadyForSpeech(Bundle params) {
Log.d(TAG, "onReadyForSpeech");
}
public void onBeginningOfSpeech() {
Log.d(TAG, "onBeginningOfSpeech");
}
public void onRmsChanged(float rmsdB) {
Log.d(TAG, "onRmsChanged");
}
public void onBufferReceived(byte[] buffer) {
Log.d(TAG, "onBufferReceived");
}
public void onEndOfSpeech() {
Log.d(TAG, "onEndofSpeech");
}
public void onError(int error) {
Log.d(TAG, "error " + error);
mText.setText("error " + error);
}
public void onResults(Bundle results) {
String str = new String();
Log.d(TAG, "onResults " + results);
ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
for (int i = 0; i < data.size(); i++) {
Log.d(TAG, "result " + data.get(i));
str += data.get(i);
}
mText.setText("results: " + String.valueOf(data.size()));
}
public void onPartialResults(Bundle partialResults) {
Log.d(TAG, "onPartialResults");
}
public void onEvent(int eventType, Bundle params) {
Log.d(TAG, "onEvent " + eventType);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText = findViewById(R.id.text);
MyRecognitionListener listener = new MyRecognitionListener();
sr = SpeechRecognizer.createSpeechRecognizer(this);
sr.setRecognitionListener(listener);
findViewById(R.id.speak).setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test");
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 10000);
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 10000);
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 10000);
sr.startListening(intent);
}
});
}
}
Będę ogromnie wdzięczny za jakąkolwiek pomoc :)