Android SpeechRecognizer неправильно распознает речь на разных языках - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно реализовать функцию Преобразование речи в текст для моего 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 не распознает слова правильно для разных языков. Я нашел только английские слова, как правило, определяются правильно.

Пожалуйста, кто-нибудь может сказать мне, почему это происходит, и что я должен сделать, чтобы добиться поддержки нескольких языковраспознавание речи в моем приложении .

Заранее спасибо !.

...