Мне нужно реализовать функцию Преобразование речи в текст для моего Android приложения. Кроме того, основным моментом является то, что мое приложение поддерживает несколько языков.
Так что будетбыть словами, написанными на любых возможных языках, и речь в тексте должна успешно их распознавать, а затем я использую этот распознанный текст, чтобы подсчитать из доступных вариантов и сказать, дал ли пользователь, который записал речь, правильный ответ.
Итак, для этого я использовал класс SpeechRecognizer , предоставленный платформой Android.
Ниже приведен вспомогательный класс, который я использовал, и реализация его интерфейса выполняется в моей деятельности, котораяуправляет пользовательским интерфейсом, т. е. просмотром изображения с микрофона.
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import java.util.ArrayList;
import java.util.Locale;
public class SpeechRecogHelper {
//region InstanceVariables
private Context context;
private boolean performSpeechSetup;
private SpeechCallback speechCallback;
private SpeechRecognizer speechRecognizer;
private Intent speechRecogIntent;
private Locale locale;
//endregion
//region Constructor
public SpeechRecogHelper(Context context, SpeechCallback speechCallback, Locale locale) {
this.context = context;
this.speechCallback = speechCallback;
performSpeechSetup = true;
this.locale = locale;
}
//endregion
//region Configure
public void setUpRecognizer() {
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
speechRecogIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
/*The language models and language are also put in the intent.*/
speechRecogIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechRecogIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, locale);
//We are adding the listener to use the RecognitionListener
speechRecognizer.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
performSpeechSetup = false;
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
if (performSpeechSetup) {
if (error == SpeechRecognizer.ERROR_NO_MATCH) {
speechCallback.showSpeechError(); //Checking for ant error while recognizing.
}
}
}
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
speechCallback.showRecognizedText(matches.get(0));
//Using activity callbacks when a matched string is found.
}
@Override
public void onPartialResults(Bundle partialResults) {
ArrayList<String> matches = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
speechCallback.showRecognizedText(matches.get(0));
//Using activity callbacks when a partially matched string is found.
}
@Override
public void onEvent(int eventType, Bundle params) {
}
});
}
//endregion
//region ListeningMethods
public void startListening() {
performSpeechSetup = true;
speechRecognizer.startListening(speechRecogIntent);
}
public void stopListening() {
speechRecognizer.stopListening();
}
//endregion
//region CallbackInterface
public interface SpeechCallback {
void showRecognizedText(String s);
void showSpeechError();
}
//endregion
}
Вышеуказанный интерфейс SpeechCallback был реализован в моей деятельности следующим образом:
@Override
public void startRecognizing() {
speechRecogHelper.startListening();
vibrate.vibrate(50);//Providing haptic feedback to user on press.
showMessage(getString(R.string.listening));
}
@Override
public void showRecognizedText(String s) {
showMessage(s);
}
@Override
public void showSpeechError() {
showMessage(R.string.error_something_went_wrong);
}
Ниже приведен кодиспользуется для создания экземпляра моего класса SpeechRecognizerHelper (вверху)
public void setUpSpeechRecognizer() {
vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
Locale locale;
if (MemoryCache.hasLanguageToLearn()) {
locale = new Locale(MemoryCache.getLanguageToLearn().getCode());
} else {
locale = Locale.getDefault();
}
speechRecogHelper = new SpeechRecogHelper(this, this, locale);
speechRecogHelper.setUpRecognizer();
}
Но приведенный выше кодs не распознает слова правильно для разных языков. Я нашел только английские слова, как правило, определяются правильно.
Пожалуйста, кто-нибудь может сказать мне, почему это происходит, и что я должен сделать, чтобы добиться поддержки нескольких языковраспознавание речи в моем приложении .
Заранее спасибо !.