Is it possible to use android's speech recognition without showing the dialog?

前端 未结 3 906
悲&欢浪女
悲&欢浪女 2020-12-30 13:01

I want to use the speech to text api in android, but I don\'t want to be slowed down by those dialogs. Is it possible to use the functionality without them?

相关标签:
3条回答
  • 2020-12-30 13:32

    No.

    The Intent for the speech recognition displays the dialog and there are no options to disable showing it.

    You should also know that the speech recognition feature requires an internet connection so that the sound can be uploaded to Google for recognition.

    0 讨论(0)
  • 2020-12-30 13:35

    Yes it is possible:

    You can use the SpeechRecognizer class from the API. Make sure it is used in the main thread - as required according to the API - and that your class implements the RecognitionListener.

    private SpeechRecognizer speech;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        speech = SpeechRecognizer.createSpeechRecognizer(this);
        speech.setRecognitionListener(this);
    
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
            this.getPackageName());
    
        speech.startListening(intent);
    }
    
    @Override
    public void onBeginningOfSpeech()
    {
    }
    
    @Override
    public void onBufferReceived(byte[] arg0)
    {
    }
    
    @Override
    public void onEndOfSpeech()
    {
    }
    
    @Override
    public void onError(int e)
    {
    }
    
    @Override
    public void onEvent(int arg0, Bundle arg1)
    {
    }
    
    @Override
    public void onPartialResults(Bundle arg0)
    {
    }
    
    @Override
    public void onReadyForSpeech(Bundle arg0)
    {
    }
    
    @Override
    public void onResults(Bundle data)
    {
        ArrayList<String> matches = data.getStringArrayList(
            SpeechRecognizer.RESULTS_RECOGNITION);
    
        // Do something useful with the matches =)
        // ...
    }
    
    @Override
    public void onRmsChanged(float arg0)
    {
    }
    
    0 讨论(0)
  • 2020-12-30 13:39

    try this code

    import java.util.ArrayList;
    
    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.util.Log;
    import android.view.View;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.ToggleButton;
    
    public class VoiceRecognitionActivity extends Activity implements RecognitionListener {
    
        private TextView returnedText;
        private ToggleButton toggleButton;
        private ProgressBar progressBar;
        private SpeechRecognizer speech = null;
        private Intent recognizerIntent;
        private String LOG_TAG = "VoiceRecognitionActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_voice_recognition);
            returnedText = (TextView) findViewById(R.id.textView1);
            progressBar = (ProgressBar) findViewById(R.id.progressBar1);
            toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);
    
            progressBar.setVisibility(View.INVISIBLE);
            speech = SpeechRecognizer.createSpeechRecognizer(this);
            speech.setRecognitionListener(this);
            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);
    
            toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    if (isChecked) {
                        progressBar.setVisibility(View.VISIBLE);
                        progressBar.setIndeterminate(true);
                        speech.startListening(recognizerIntent);
                    } else {
                        progressBar.setIndeterminate(false);
                        progressBar.setVisibility(View.INVISIBLE);
                        speech.stopListening();
                    }
                }
            });
    
        }
    
        @Override
        public void onResume() {
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if (speech != null) {
                speech.destroy();
                Log.i(LOG_TAG, "destroy");
            }
    
        }
    
        @Override
        public void onBeginningOfSpeech() {
            Log.i(LOG_TAG, "onBeginningOfSpeech");
            progressBar.setIndeterminate(false);
            progressBar.setMax(10);
        }
    
        @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);
        }
    
        @Override
        public void onEvent(int arg0, Bundle arg1) {
            Log.i(LOG_TAG, "onEvent");
        }
    
        @Override
        public void onPartialResults(Bundle arg0) {
            Log.i(LOG_TAG, "onPartialResults");
        }
    
        @Override
        public void onReadyForSpeech(Bundle arg0) {
            Log.i(LOG_TAG, "onReadyForSpeech");
        }
    
        @Override
        public void onResults(Bundle results) {
            Log.i(LOG_TAG, "onResults");
            ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            String text = "";
            for (String result : matches)
                text += result + "\n";
    
            returnedText.setText(text);
        }
    
        @Override
        public void onRmsChanged(float rmsdB) {
            Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
            progressBar.setProgress((int) rmsdB);
        }
    
        public static 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;
        }
    
    }
    

    activity_voice_recognition.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:src="@drawable/ic_launcher" />
    
        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/toggleButton1"
            android:layout_marginTop="28dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp" />
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/progressBar1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="47dp" />
    
        <ToggleButton
            android:id="@+id/toggleButton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="26dp"
            android:text="ToggleButton" />
    
    </RelativeLayout>
    

    AndroidManifest.xml

    <manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.rakesh.voicerecognitionexample"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
    
     <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
     <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <activity
                android:name=".VoiceRecognitionActivity"
                android:label="@string/title_activity_voice_recognition" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    0 讨论(0)
提交回复
热议问题