Как я могу запустить SpeechRecognizer в течение желаемого количества времени? - PullRequest
0 голосов
/ 25 февраля 2019

У меня развивается распознавание речи.Я использую SpeechRecognizer .

. Я хочу, чтобы распознавание речи начиналось при нажатии кнопки, а распознавание речи заканчивалось при повторном нажатии кнопки.

Однако, если во время разговора вы колеблетесь около 1 секунды, вызывается onEndOfSpeech().

Поэтому я снова вызываю startListening(), когда вызывается onEndOFSpeech().

Однако, если вы продолжаете говоритьво время startListening() снова произнесенные слова не будут распознаваться до тех пор, пока не будет вызван onReadyForSpeech() и не будет вызван onBeginningOfSpeech().(Около 500 миллисекунд)

  1. Если я не решаюсь говорить, есть ли способ, по которому onEndOfSpeech() не будет вызван и все еще сможет распознавать речь?

=> Я пытался "EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS", "EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS", "EXTRA_SPEECH_INPUT_MINTH * * 10 * * 10 * 10 * 10 * 10 * 10 * 10 МИЛЛИОРОВ * 10 * БИЛЛИ *, 10 * БИЛД * 10 * БИЛЛИ *, 10 * 10 * 245

Есть ли способ получить немедленное распознавание речи, позвонив startListening() снова?

=> В настоящее время я не распознаю около 500 миллисекунд.Обратите внимание, что вы можете перезапустить только после регенерации SpeechRecognizer .

Если вы сохраните предложение в виде аудиофайла, есть ли бесплатная библиотека или механизм, который преобразует его в текст?Я использую английский, корейский, китайский и японский языки.

Я прикрепил SpeechRecognizer Source.

public class SpeechToTextUtil implements RecognitionListener {

private final TranslationActivity mTranslationActivity;
private String[] languages={"ko-KR","en-US","zh-CN","ja-JP"};
private Context mContext;
private SpeechRecognizer mRecognizer;
private Intent intent;
private int mLanguagePosition;
private boolean mBeginSpeech;
private float mRestoreRmsValue = 0;
private int mNoSpeech = 0;

public interface OnSTTResultListener {
    void onSTTResult(List<String> mResult, int error);
    void onSTTPartialResults(List<String> mResult);
}
private OnSTTResultListener onSTTResultListener;
public void setOnSTTResultListener(OnSTTResultListener onSTTResultListener) {
    this.onSTTResultListener = onSTTResultListener;
}

public SpeechToTextUtil (Context context) {
    mContext = context;
    mTranslationActivity = (TranslationActivity)mContext;
}

public void startSpeechToText(int languagePosition) {
    mLanguagePosition = languagePosition;
    if (mRecognizer == null) {
        mRecognizer = SpeechRecognizer.createSpeechRecognizer(mContext);
        Log.i(Util.TAG, this.getClass().getSimpleName()+" mRecognizer create langauge = "+languages[languagePosition]);
    }
    mRecognizer.setRecognitionListener(this);

    intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, mContext.getPackageName());
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, languages[languagePosition]);
    intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS,true);

    Log.i(Util.TAG, this.getClass().getSimpleName()+" mRecognizer startListening");
    mRecognizer.startListening(intent);
}

public void stopSpeechToText() {
    if(mRecognizer != null){
        mRecognizer.stopListening();
    }
}

public void destroySpeechToText() {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" destroySpeechToText");
    if(mRecognizer != null){
        mRecognizer.stopListening();
        mRecognizer.destroy();
        mRecognizer.cancel();
        mRecognizer = null;
    }
}

public SpeechRecognizer getRecognizer() {
    return mRecognizer;
}


@Override
public void onReadyForSpeech(Bundle params) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onReadyForSpeech");
}

@Override
public void onBeginningOfSpeech() {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onBeginningOfSpeech");
    mBeginSpeech = true;
}

@Override
public void onRmsChanged(float rmsdB) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onRmsChanged rmsdB = " + rmsdB);
}

@Override
public void onBufferReceived(byte[] buffer) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onBufferReceived");
}

@Override
public void onEndOfSpeech() {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onEndOfSpeech");
    mBeginSpeech = false;
    if (mTranslationActivity.isSpeechStart()) {
        destroySpeechToText();
        startSpeechToText(mLanguagePosition);
    }
}

@Override
public void onError(int error) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onError = "+error);
    onSTTResultListener.onSTTResult(null,error);
}

@Override
public void onResults(Bundle results) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onResults");

    String key = SpeechRecognizer.RESULTS_RECOGNITION;
    List<String> mResult = results.getStringArrayList(key);

    Log.i(Util.TAG, this.getClass().getSimpleName()+" mResult = "+mResult);

    onSTTResultListener.onSTTResult(mResult,0);
}

@Override
public void onPartialResults(Bundle partialResults) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onPartialResults = "+partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION));
    onSTTResultListener.onSTTPartialResults(partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION));
}

@Override
public void onEvent(int eventType, Bundle params) {
    Log.i(Util.TAG, this.getClass().getSimpleName()+" onEvent");
}
}
...