簡體   English   中英

沒有超時的Android語音識別?

[英]Android speech recognition without a time-out?

我正在使用android語音識別並編寫一些代碼來識別說出的單詞。 請看下面的代碼。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends Activity {

    private TextView returnedText;
    private ToggleButton toggleButton;
    private ProgressBar progressBar;
    private SpeechRecognizer speech = null;
    private Intent recognizerIntent;
    private ListView wordList;
    private String LOG_TAG = "VoiceRecognitionActivity";
    private List<String> previousInterim;
    private diff_match_patch diff;
    private String display = "test";

    private List<String>adapterList = new ArrayList<String>();
    ArrayAdapter<String>  adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        returnedText = (TextView) findViewById(R.id.textView1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);
        wordList = (ListView)findViewById(R.id.word_list);

        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, adapterList);
        adapter.setNotifyOnChange(true);
        wordList.setAdapter(adapter);
        progressBar.setVisibility(View.INVISIBLE);

       // createRecog();
        speech = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
        toggleButton.setOnCheckedChangeListener(new ButtonListener());



    }

    private class ButtonListener implements OnCheckedChangeListener, Runnable
    {
        boolean isChecked;

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            this.isChecked = isChecked;
            this.run();
        }

        @Override
        public void run() {

            if (isChecked) {
                speech.stopListening();
                speech.cancel();
                speech.destroy();
                createRecog();
                progressBar.setVisibility(View.VISIBLE);
                progressBar.setIndeterminate(true);
                speech.startListening(recognizerIntent);
                adapter.clear();

                returnedText.setText("");

            } else {
                progressBar.setIndeterminate(false);
                progressBar.setVisibility(View.INVISIBLE);
                speech.stopListening();

            }


        }
    }

    private class RecognitionListenerClass implements RecognitionListener
    {


        @Override
        public void onBeginningOfSpeech() {
            Log.i(LOG_TAG, "onBeginningOfSpeech");
            progressBar.setIndeterminate(false);
            progressBar.setMax(10);
            wordList.computeScroll();
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            Log.i(LOG_TAG, "onBufferReceived: " + buffer);
        }

        @Override
        public void onEndOfSpeech() {
            Log.i(LOG_TAG, "onEndOfSpeech");
            progressBar.setIndeterminate(true);
            toggleButton.setChecked(false);
        }

        @Override
        public void onError(int errorCode) {
            String errorMessage = getErrorText(errorCode);
            Log.d(LOG_TAG, "FAILED " + errorMessage);
            returnedText.setText(errorMessage);
            toggleButton.setChecked(false);


          //  speech = null;
            toggleButton.performClick();
        }

        @Override
        public void onEvent(int arg0, Bundle arg1) {
            Log.i(LOG_TAG, "onEvent");
        }

        @Override
        public void onPartialResults(Bundle arg0) {
            Log.i(LOG_TAG, "onPartialResults");
            final ArrayList<String> matches = arg0.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            final float[] scores = arg0.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES);
            receiveWhatWasHeard(matches, scores);

        }

        @Override
        public void onReadyForSpeech(Bundle arg0) {
            Log.i(LOG_TAG, "onReadyForSpeech");
        }

        @Override
        public void onResults(Bundle results) {

        }

        @Override
        public void onRmsChanged(float rmsdB) {
            Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
            progressBar.setProgress((int) rmsdB);
        }
    }


    private void receiveWhatWasHeard(ArrayList<String> matches, float[] scores) {

        Log.i(LOG_TAG, matches.get(0));
    returnedText.setText(matches.get(0));        
    }

    private void createRecog()
    {
        speech = SpeechRecognizer.createSpeechRecognizer(this);
        speech.setRecognitionListener(new RecognitionListenerClass());
        recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
                "en");
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                this.getPackageName());
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
        recognizerIntent.putExtra("android.speech.extra.DICTATION_MODE", true);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }



    public  String getErrorText(int errorCode) {
        String message;
        switch (errorCode) {
            case SpeechRecognizer.ERROR_AUDIO:
                message = "Audio recording error";
                break;
            case SpeechRecognizer.ERROR_CLIENT:
                message = "Client side error";
                break;
            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                message = "Insufficient permissions";
                break;
            case SpeechRecognizer.ERROR_NETWORK:
                message = "Network error";
                break;
            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                message = "Network timeout";
                break;
            case SpeechRecognizer.ERROR_NO_MATCH:
                message = "No match";
                break;
            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                message = "RecognitionService busy";
                break;
            case SpeechRecognizer.ERROR_SERVER:
                message = "error from server";
                break;
            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                message = "No speech input";
                break;
            default:
                message = "Didn't understand, please try again.";
                break;
        }

        return message;
    }

}

但是,我需要繼續這樣做,我沒有一直這樣做。 在語音結束時重新啟動識別可能是一個好主意,但它會產生很小的噪音並且需要1-3秒才能加載,這意味着一些語音會丟失。

是的,我知道谷歌已經提到他們的系統不是為了持續認可; 但是之前有幾個人做過工作。 不幸的是,這些解決方法現在似乎不起作用,因為它們是用相當舊的API編寫的。 如果可以使用舊版本,那么當然在更新的版本中更有可能。

那么,關於如何實現這種持續識別任務的任何想法? 我使用的是API 15。

在這里閱讀背景

這個演示是連續的,並使用pultz博客評論流中提到的鉻源

全雙工谷歌api 在android中運行良好。 AFAIK,它仍然是有限的,使它在生產應用程序中無用。

使用curl cli google全雙工stdout樣本

IBM watson擁有支持連續模式的全雙工和生產就緒API。 你需要深入研究文檔細節,但是一般的cli樣本就在這里

在watson api看到這里連續不斷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM