581 lines
25 KiB
Java
581 lines
25 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 2010 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package android.speech;
|
||
|
|
||
|
import android.Manifest;
|
||
|
import android.annotation.CallbackExecutor;
|
||
|
import android.annotation.IntDef;
|
||
|
import android.annotation.MainThread;
|
||
|
import android.annotation.NonNull;
|
||
|
import android.annotation.Nullable;
|
||
|
import android.annotation.RequiresPermission;
|
||
|
import android.annotation.TestApi;
|
||
|
import android.content.ComponentName;
|
||
|
import android.content.Context;
|
||
|
import android.content.Intent;
|
||
|
import android.content.pm.ResolveInfo;
|
||
|
import android.os.Bundle;
|
||
|
|
||
|
import com.android.internal.R;
|
||
|
|
||
|
import java.lang.annotation.Documented;
|
||
|
import java.lang.annotation.Retention;
|
||
|
import java.lang.annotation.RetentionPolicy;
|
||
|
import java.util.List;
|
||
|
import java.util.concurrent.Executor;
|
||
|
|
||
|
/**
|
||
|
* This class provides access to the speech recognition service. This service allows access to the
|
||
|
* speech recognizer. Do not instantiate this class directly, instead, call
|
||
|
* {@link SpeechRecognizer#createSpeechRecognizer(Context)}, or
|
||
|
* {@link SpeechRecognizer#createOnDeviceSpeechRecognizer(Context)}. This class's methods must be
|
||
|
* invoked only from the main application thread.
|
||
|
*
|
||
|
* <p><strong>Important:</strong> the caller MUST invoke {@link #destroy()} on a
|
||
|
* SpeechRecognizer object when it is no longer needed.
|
||
|
*
|
||
|
* <p>The implementation of this API is likely to stream audio to remote servers to perform speech
|
||
|
* recognition. As such this API is not intended to be used for continuous recognition, which would
|
||
|
* consume a significant amount of battery and bandwidth.
|
||
|
*
|
||
|
* <p>Please note that the application must have {@link android.Manifest.permission#RECORD_AUDIO}
|
||
|
* permission to use this class.
|
||
|
*/
|
||
|
public class SpeechRecognizer {
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve an {@code ArrayList<String>} from the {@link Bundle} passed to the
|
||
|
* {@link RecognitionListener#onResults(Bundle)} and
|
||
|
* {@link RecognitionListener#onPartialResults(Bundle)} methods. These strings are the possible
|
||
|
* recognition results, where the first element is the most likely candidate.
|
||
|
*/
|
||
|
public static final String RESULTS_RECOGNITION = "results_recognition";
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve a float array from the {@link Bundle} passed to the
|
||
|
* {@link RecognitionListener#onResults(Bundle)} and
|
||
|
* {@link RecognitionListener#onPartialResults(Bundle)} methods. The array should be
|
||
|
* the same size as the ArrayList provided in {@link #RESULTS_RECOGNITION}, and should contain
|
||
|
* values ranging from 0.0 to 1.0, or -1 to represent an unavailable confidence score.
|
||
|
* <p>
|
||
|
* Confidence values close to 1.0 indicate high confidence (the speech recognizer is confident
|
||
|
* that the recognition result is correct), while values close to 0.0 indicate low confidence.
|
||
|
* <p>
|
||
|
* This value is optional and might not be provided.
|
||
|
*/
|
||
|
public static final String CONFIDENCE_SCORES = "confidence_scores";
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve an ArrayList<{@link AlternativeSpans}> from the {@link Bundle}
|
||
|
* passed to the {@link RecognitionListener#onResults(Bundle)} and
|
||
|
* {@link RecognitionListener#onPartialResults(Bundle)} methods. The list should be the same
|
||
|
* size as the ArrayList provided in {@link #RESULTS_RECOGNITION}.
|
||
|
*
|
||
|
* <p> A single {@link SpeechRecognizer} result is represented as a {@link String}. For a
|
||
|
* specific span (substring) of the originally recognized result string the recognizer provides
|
||
|
* a list of alternative hypotheses in the form of an {@link AlternativeSpan} object.
|
||
|
* Alternatives for different spans of a result string are listed in an {@link AlternativeSpans}
|
||
|
* object. Each item from the ArrayList retrieved by this key corresponds to a single result
|
||
|
* string provided in {@link #RESULTS_RECOGNITION}.
|
||
|
*
|
||
|
* <p> This value is optional and might not be provided.
|
||
|
*/
|
||
|
public static final String RESULTS_ALTERNATIVES = "results_alternatives";
|
||
|
|
||
|
/**
|
||
|
* Key used to receive an ArrayList<{@link RecognitionPart}> object from the
|
||
|
* {@link Bundle} passed to the {@link RecognitionListener#onResults(Bundle)} and
|
||
|
* {@link RecognitionListener#onSegmentResults(Bundle)} methods.
|
||
|
*
|
||
|
* <p> A single {@link SpeechRecognizer} result is represented as a {@link String}. Each word of
|
||
|
* the resulting String, as well as any potential adjacent punctuation, is represented by a
|
||
|
* {@link RecognitionPart} item from the ArrayList retrieved by this key.
|
||
|
*/
|
||
|
public static final String RECOGNITION_PARTS = "recognition_parts";
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve a {@link String} representation of the IETF language tag (as defined by
|
||
|
* BCP 47, e.g., "en-US", "de-DE") of the detected language of the most recent audio chunk.
|
||
|
*
|
||
|
* <p> This info is returned to the client in the {@link Bundle} passed to
|
||
|
* {@link RecognitionListener#onLanguageDetection(Bundle)} only if
|
||
|
* {@link RecognizerIntent#EXTRA_ENABLE_LANGUAGE_DETECTION} is set. Additionally, if
|
||
|
* {@link RecognizerIntent#EXTRA_LANGUAGE_DETECTION_ALLOWED_LANGUAGES} are listed,
|
||
|
* the detected language is constrained to be one from the list.
|
||
|
*/
|
||
|
public static final String DETECTED_LANGUAGE = "detected_language";
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve the level of confidence of the detected language
|
||
|
* of the most recent audio chunk,
|
||
|
* represented by an {@code int} value prefixed by {@code LANGUAGE_DETECTION_CONFIDENCE_LEVEL_}.
|
||
|
*
|
||
|
* <p> This info is returned to the client in the {@link Bundle} passed to
|
||
|
* {@link RecognitionListener#onLanguageDetection(Bundle)} only if
|
||
|
* {@link RecognizerIntent#EXTRA_ENABLE_LANGUAGE_DETECTION} is set.
|
||
|
*/
|
||
|
public static final String LANGUAGE_DETECTION_CONFIDENCE_LEVEL =
|
||
|
"language_detection_confidence_level";
|
||
|
|
||
|
/**
|
||
|
* The level of language detection confidence.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@Documented
|
||
|
@Retention(RetentionPolicy.SOURCE)
|
||
|
@IntDef(prefix = {"LANGUAGE_DETECTION_CONFIDENCE_LEVEL_"}, value = {
|
||
|
LANGUAGE_DETECTION_CONFIDENCE_LEVEL_UNKNOWN,
|
||
|
LANGUAGE_DETECTION_CONFIDENCE_LEVEL_NOT_CONFIDENT,
|
||
|
LANGUAGE_DETECTION_CONFIDENCE_LEVEL_CONFIDENT,
|
||
|
LANGUAGE_DETECTION_CONFIDENCE_LEVEL_HIGHLY_CONFIDENT
|
||
|
})
|
||
|
public @interface LanguageDetectionConfidenceLevel {}
|
||
|
|
||
|
public static final int LANGUAGE_DETECTION_CONFIDENCE_LEVEL_UNKNOWN = 0;
|
||
|
public static final int LANGUAGE_DETECTION_CONFIDENCE_LEVEL_NOT_CONFIDENT = 1;
|
||
|
public static final int LANGUAGE_DETECTION_CONFIDENCE_LEVEL_CONFIDENT = 2;
|
||
|
public static final int LANGUAGE_DETECTION_CONFIDENCE_LEVEL_HIGHLY_CONFIDENT = 3;
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve an ArrayList<{@link String}> containing representations of the
|
||
|
* IETF language tags (as defined by BCP 47, e.g., "en-US", "en-UK") denoting the alternative
|
||
|
* locales for the same language retrieved by the key {@link #DETECTED_LANGUAGE}.
|
||
|
*
|
||
|
* This info is returned to the client in the {@link Bundle} passed to
|
||
|
* {@link RecognitionListener#onLanguageDetection(Bundle)} only if
|
||
|
* {@link RecognizerIntent#EXTRA_ENABLE_LANGUAGE_DETECTION} is set.
|
||
|
*/
|
||
|
public static final String TOP_LOCALE_ALTERNATIVES = "top_locale_alternatives";
|
||
|
|
||
|
/**
|
||
|
* Key used to retrieve the result of the language switch of the most recent audio chunk,
|
||
|
* represented by an {@code int} value prefixed by {@code LANGUAGE_SWITCH_}.
|
||
|
*
|
||
|
* <p> This info is returned to the client in the {@link Bundle} passed to the
|
||
|
* {@link RecognitionListener#onLanguageDetection(Bundle)} only if
|
||
|
* {@link RecognizerIntent#EXTRA_ENABLE_LANGUAGE_SWITCH} is set.
|
||
|
*/
|
||
|
public static final String LANGUAGE_SWITCH_RESULT = "language_switch_result";
|
||
|
|
||
|
/**
|
||
|
* The result of the language switch.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@Documented
|
||
|
@Retention(RetentionPolicy.SOURCE)
|
||
|
@IntDef(prefix = {"LANGUAGE_SWITCH_RESULT_"}, value = {
|
||
|
LANGUAGE_SWITCH_RESULT_NOT_ATTEMPTED,
|
||
|
LANGUAGE_SWITCH_RESULT_SUCCEEDED,
|
||
|
LANGUAGE_SWITCH_RESULT_FAILED,
|
||
|
LANGUAGE_SWITCH_RESULT_SKIPPED_NO_MODEL
|
||
|
})
|
||
|
public @interface LanguageSwitchResult {}
|
||
|
|
||
|
/** Switch not attempted. */
|
||
|
public static final int LANGUAGE_SWITCH_RESULT_NOT_ATTEMPTED = 0;
|
||
|
|
||
|
/** Switch attempted and succeeded. */
|
||
|
public static final int LANGUAGE_SWITCH_RESULT_SUCCEEDED = 1;
|
||
|
|
||
|
/** Switch attempted and failed. */
|
||
|
public static final int LANGUAGE_SWITCH_RESULT_FAILED = 2;
|
||
|
|
||
|
/**
|
||
|
* Switch skipped because the language model is missing
|
||
|
* or the language is not allowlisted for auto switch.
|
||
|
*/
|
||
|
public static final int LANGUAGE_SWITCH_RESULT_SKIPPED_NO_MODEL = 3;
|
||
|
|
||
|
/**
|
||
|
* The reason speech recognition failed.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@Documented
|
||
|
@Retention(RetentionPolicy.SOURCE)
|
||
|
@IntDef(prefix = {"ERROR_"}, value = {
|
||
|
ERROR_NETWORK_TIMEOUT,
|
||
|
ERROR_NETWORK,
|
||
|
ERROR_AUDIO,
|
||
|
ERROR_SERVER,
|
||
|
ERROR_CLIENT,
|
||
|
ERROR_SPEECH_TIMEOUT,
|
||
|
ERROR_NO_MATCH,
|
||
|
ERROR_RECOGNIZER_BUSY,
|
||
|
ERROR_INSUFFICIENT_PERMISSIONS,
|
||
|
ERROR_TOO_MANY_REQUESTS,
|
||
|
ERROR_SERVER_DISCONNECTED,
|
||
|
ERROR_LANGUAGE_NOT_SUPPORTED,
|
||
|
ERROR_LANGUAGE_UNAVAILABLE,
|
||
|
ERROR_CANNOT_CHECK_SUPPORT,
|
||
|
ERROR_CANNOT_LISTEN_TO_DOWNLOAD_EVENTS,
|
||
|
})
|
||
|
public @interface RecognitionError {}
|
||
|
|
||
|
/** Network operation timed out. */
|
||
|
public static final int ERROR_NETWORK_TIMEOUT = 1;
|
||
|
|
||
|
/** Other network related errors. */
|
||
|
public static final int ERROR_NETWORK = 2;
|
||
|
|
||
|
/** Audio recording error. */
|
||
|
public static final int ERROR_AUDIO = 3;
|
||
|
|
||
|
/** Server sends error status. */
|
||
|
public static final int ERROR_SERVER = 4;
|
||
|
|
||
|
/** Other client side errors. */
|
||
|
public static final int ERROR_CLIENT = 5;
|
||
|
|
||
|
/** No speech input */
|
||
|
public static final int ERROR_SPEECH_TIMEOUT = 6;
|
||
|
|
||
|
/** No recognition result matched. */
|
||
|
public static final int ERROR_NO_MATCH = 7;
|
||
|
|
||
|
/** RecognitionService busy. */
|
||
|
public static final int ERROR_RECOGNIZER_BUSY = 8;
|
||
|
|
||
|
/** Insufficient permissions */
|
||
|
public static final int ERROR_INSUFFICIENT_PERMISSIONS = 9;
|
||
|
|
||
|
/** Too many requests from the same client. */
|
||
|
public static final int ERROR_TOO_MANY_REQUESTS = 10;
|
||
|
|
||
|
/** Server has been disconnected, e.g. because the app has crashed. */
|
||
|
public static final int ERROR_SERVER_DISCONNECTED = 11;
|
||
|
|
||
|
/** Requested language is not available to be used with the current recognizer. */
|
||
|
public static final int ERROR_LANGUAGE_NOT_SUPPORTED = 12;
|
||
|
|
||
|
/** Requested language is supported, but not available currently (e.g. not downloaded yet). */
|
||
|
public static final int ERROR_LANGUAGE_UNAVAILABLE = 13;
|
||
|
|
||
|
/** The service does not allow to check for support. */
|
||
|
public static final int ERROR_CANNOT_CHECK_SUPPORT = 14;
|
||
|
|
||
|
/** The service does not support listening to model downloads events. */
|
||
|
public static final int ERROR_CANNOT_LISTEN_TO_DOWNLOAD_EVENTS = 15;
|
||
|
|
||
|
/** action codes */
|
||
|
private static final int MSG_START = 1;
|
||
|
private static final int MSG_STOP = 2;
|
||
|
private static final int MSG_CANCEL = 3;
|
||
|
private static final int MSG_CHANGE_LISTENER = 4;
|
||
|
private static final int MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT = 5;
|
||
|
private static final int MSG_CHECK_RECOGNITION_SUPPORT = 6;
|
||
|
private static final int MSG_TRIGGER_MODEL_DOWNLOAD = 7;
|
||
|
|
||
|
SpeechRecognizer() { }
|
||
|
|
||
|
/**
|
||
|
* Checks whether a speech recognition service is available on the system. If this method
|
||
|
* returns {@code false}, {@link SpeechRecognizer#createSpeechRecognizer(Context)} will
|
||
|
* fail.
|
||
|
*
|
||
|
* @param context with which {@code SpeechRecognizer} will be created
|
||
|
* @return {@code true} if recognition is available, {@code false} otherwise
|
||
|
*/
|
||
|
public static boolean isRecognitionAvailable(@NonNull Context context) {
|
||
|
// TODO(b/176578753): make sure this works well with system speech recognizers.
|
||
|
final List<ResolveInfo> list = context.getPackageManager().queryIntentServices(
|
||
|
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
|
||
|
return list != null && list.size() != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether an on-device speech recognition service is available on the system. If this
|
||
|
* method returns {@code false},
|
||
|
* {@link SpeechRecognizer#createOnDeviceSpeechRecognizer(Context)} will
|
||
|
* fail.
|
||
|
*
|
||
|
* @param context with which on-device {@code SpeechRecognizer} will be created
|
||
|
* @return {@code true} if on-device recognition is available, {@code false} otherwise
|
||
|
*/
|
||
|
public static boolean isOnDeviceRecognitionAvailable(@NonNull Context context) {
|
||
|
ComponentName componentName =
|
||
|
ComponentName.unflattenFromString(
|
||
|
context.getString(R.string.config_defaultOnDeviceSpeechRecognitionService));
|
||
|
return componentName != null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Factory method to create a new {@code SpeechRecognizer}. Please note that
|
||
|
* {@link #setRecognitionListener(RecognitionListener)} should be called before dispatching any
|
||
|
* command to the created {@code SpeechRecognizer}, otherwise no notifications will be
|
||
|
* received.
|
||
|
*
|
||
|
* <p><strong>Important:</strong> the caller MUST invoke {@link #destroy()} on a
|
||
|
* SpeechRecognizer object when it is no longer needed.
|
||
|
*
|
||
|
* <p>For apps targeting Android 11 (API level 30) interaction with a speech recognition
|
||
|
* service requires <queries> element to be added to the manifest file:
|
||
|
* <pre>{@code
|
||
|
* <queries>
|
||
|
* <intent>
|
||
|
* <action
|
||
|
* android:name="android.speech.RecognitionService" />
|
||
|
* </intent>
|
||
|
* </queries>
|
||
|
* }</pre>
|
||
|
*
|
||
|
* @param context in which to create {@code SpeechRecognizer}
|
||
|
* @return a new {@code SpeechRecognizer}
|
||
|
*/
|
||
|
@MainThread
|
||
|
public static SpeechRecognizer createSpeechRecognizer(Context context) {
|
||
|
return createSpeechRecognizer(context, null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Factory method to create a new {@code SpeechRecognizer}. Please note that
|
||
|
* {@link #setRecognitionListener(RecognitionListener)} should be called before dispatching any
|
||
|
* command to the created {@code SpeechRecognizer}, otherwise no notifications will be
|
||
|
* received.
|
||
|
* Use this version of the method to specify a specific service to direct this
|
||
|
* {@link SpeechRecognizer} to.
|
||
|
*
|
||
|
* <p><strong>Important:</strong> the caller MUST invoke {@link #destroy()} on a
|
||
|
* SpeechRecognizer object when it is no longer needed.
|
||
|
*
|
||
|
* <p><strong>Important</strong>: before calling this method, please check via
|
||
|
* {@link android.content.pm.PackageManager#queryIntentServices(Intent, int)} that {@code
|
||
|
* serviceComponent} actually exists and provides
|
||
|
* {@link RecognitionService#SERVICE_INTERFACE}. Normally you would not use this; call
|
||
|
* {@link #createSpeechRecognizer(Context)} to use the system default recognition
|
||
|
* service instead or {@link #createOnDeviceSpeechRecognizer(Context)} to use on-device
|
||
|
* recognition.</p>
|
||
|
*
|
||
|
* <p>For apps targeting Android 11 (API level 30) interaction with a speech recognition
|
||
|
* service requires <queries> element to be added to the manifest file:
|
||
|
* <pre>{@code
|
||
|
* <queries>
|
||
|
* <intent>
|
||
|
* <action
|
||
|
* android:name="android.speech.RecognitionService" />
|
||
|
* </intent>
|
||
|
* </queries>
|
||
|
* }</pre>
|
||
|
*
|
||
|
* @param context in which to create {@code SpeechRecognizer}
|
||
|
* @param serviceComponent the {@link ComponentName} of a specific service to direct this
|
||
|
* {@code SpeechRecognizer} to
|
||
|
* @return a new {@code SpeechRecognizer}
|
||
|
*/
|
||
|
@MainThread
|
||
|
public static SpeechRecognizer createSpeechRecognizer(Context context,
|
||
|
ComponentName serviceComponent) {
|
||
|
if (context == null) {
|
||
|
throw new IllegalArgumentException("Context cannot be null");
|
||
|
}
|
||
|
SpeechRecognizerImpl.checkIsCalledFromMainThread();
|
||
|
return wrapWithProxy(new SpeechRecognizerImpl(context, serviceComponent));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Factory method to create a new {@code SpeechRecognizer}.
|
||
|
*
|
||
|
* <p>Please note that {@link #setRecognitionListener(RecognitionListener)} should be called
|
||
|
* before dispatching any command to the created {@code SpeechRecognizer}, otherwise no
|
||
|
* notifications will be received.
|
||
|
*
|
||
|
* <p><strong>Important:</strong> the caller MUST invoke {@link #destroy()} on a
|
||
|
* SpeechRecognizer object when it is no longer needed.
|
||
|
*
|
||
|
* @param context in which to create {@code SpeechRecognizer}
|
||
|
* @return a new on-device {@code SpeechRecognizer}.
|
||
|
* @throws UnsupportedOperationException iff {@link #isOnDeviceRecognitionAvailable(Context)}
|
||
|
* is false
|
||
|
*/
|
||
|
@NonNull
|
||
|
@MainThread
|
||
|
public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull Context context) {
|
||
|
if (!isOnDeviceRecognitionAvailable(context)) {
|
||
|
throw new UnsupportedOperationException("On-device recognition is not available");
|
||
|
}
|
||
|
return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
|
||
|
}
|
||
|
|
||
|
private static SpeechRecognizer wrapWithProxy(SpeechRecognizer delegate) {
|
||
|
return new SpeechRecognizerProxy(delegate);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Helper method to create on-device SpeechRecognizer in tests even when the device does not
|
||
|
* support on-device speech recognition.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@TestApi
|
||
|
@NonNull
|
||
|
@MainThread
|
||
|
public static SpeechRecognizer createOnDeviceTestingSpeechRecognizer(
|
||
|
@NonNull Context context) {
|
||
|
return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the listener that will receive all the callbacks. The previous unfinished commands will
|
||
|
* be executed with the old listener, while any following command will be executed with the new
|
||
|
* listener.
|
||
|
*
|
||
|
* @param listener listener that will receive all the callbacks from the created
|
||
|
* {@link SpeechRecognizer}, this must not be null.
|
||
|
*/
|
||
|
@MainThread
|
||
|
public void setRecognitionListener(RecognitionListener listener) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Starts listening for speech. Please note that
|
||
|
* {@link #setRecognitionListener(RecognitionListener)} should be called beforehand, otherwise
|
||
|
* no notifications will be received.
|
||
|
*
|
||
|
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
|
||
|
* may also contain optional extras, see {@link RecognizerIntent}. If
|
||
|
* these values are not set explicitly, default values will be used by
|
||
|
* the recognizer.
|
||
|
*/
|
||
|
@MainThread
|
||
|
public void startListening(Intent recognizerIntent) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stops listening for speech. Speech captured so far will be recognized as if the user had
|
||
|
* stopped speaking at this point.
|
||
|
*
|
||
|
* <p>Note that in the default case, this does not need to be called, as the speech endpointer
|
||
|
* will automatically stop the recognizer listening when it determines speech has completed.
|
||
|
* However, you can manipulate endpointer parameters directly using the intent extras defined in
|
||
|
* {@link RecognizerIntent}, in which case you may sometimes want to manually call this method
|
||
|
* to stop listening sooner.
|
||
|
*
|
||
|
* <p>Upon invocation clients must wait until {@link RecognitionListener#onResults} or
|
||
|
* {@link RecognitionListener#onError} are invoked before calling
|
||
|
* {@link SpeechRecognizer#startListening} again. Otherwise such an attempt would be rejected by
|
||
|
* recognition service.
|
||
|
*
|
||
|
* <p>Please note that
|
||
|
* {@link #setRecognitionListener(RecognitionListener)} should be called beforehand, otherwise
|
||
|
* no notifications will be received.
|
||
|
*/
|
||
|
@MainThread
|
||
|
public void stopListening() {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Cancels the speech recognition. Please note that
|
||
|
* {@link #setRecognitionListener(RecognitionListener)} should be called beforehand, otherwise
|
||
|
* no notifications will be received.
|
||
|
*/
|
||
|
@MainThread
|
||
|
public void cancel() {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether {@code recognizerIntent} is supported by
|
||
|
* {@link SpeechRecognizer#startListening(Intent)}.
|
||
|
*
|
||
|
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
|
||
|
* may also contain optional extras. See {@link RecognizerIntent} for
|
||
|
* the list of supported extras, any unlisted extra might be ignored.
|
||
|
* @param supportListener the listener on which to receive the support query results.
|
||
|
*/
|
||
|
public void checkRecognitionSupport(
|
||
|
@NonNull Intent recognizerIntent,
|
||
|
@NonNull @CallbackExecutor Executor executor,
|
||
|
@NonNull RecognitionSupportCallback supportListener) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Attempts to download the support for the given {@code recognizerIntent}. This might trigger
|
||
|
* user interaction to approve the download. Callers can verify the status of the request via
|
||
|
* {@link #checkRecognitionSupport(Intent, Executor, RecognitionSupportCallback)}.
|
||
|
*
|
||
|
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
|
||
|
* may also contain optional extras, see {@link RecognizerIntent}.
|
||
|
*/
|
||
|
public void triggerModelDownload(@NonNull Intent recognizerIntent) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Attempts to download the support for the given {@code recognizerIntent}. This might trigger
|
||
|
* user interaction to approve the download. Callers can verify the status of the request via
|
||
|
* {@link #checkRecognitionSupport(Intent, Executor, RecognitionSupportCallback)}.
|
||
|
*
|
||
|
* <p> The updates about the model download request are received via the given
|
||
|
* {@link ModelDownloadListener}:
|
||
|
*
|
||
|
* <li> If the model is already available, {@link ModelDownloadListener#onSuccess()} will be
|
||
|
* called directly. The model can be safely used afterwards.
|
||
|
*
|
||
|
* <li> If the {@link RecognitionService} has started the download,
|
||
|
* {@link ModelDownloadListener#onProgress(int)} will be called an unspecified (zero or more)
|
||
|
* number of times until the download is complete.
|
||
|
* When the download finishes, {@link ModelDownloadListener#onSuccess()} will be called.
|
||
|
* The model can be safely used afterwards.
|
||
|
*
|
||
|
* <li> If the {@link RecognitionService} has only scheduled the download, but won't satisfy it
|
||
|
* immediately, {@link ModelDownloadListener#onScheduled()} will be called.
|
||
|
* There will be no further updates on this listener.
|
||
|
*
|
||
|
* <li> If the request fails at any time due to a network or scheduling error,
|
||
|
* {@link ModelDownloadListener#onError(int)} will be called.
|
||
|
*
|
||
|
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
|
||
|
* may also contain optional extras, see {@link RecognizerIntent}.
|
||
|
* @param executor for dispatching listener callbacks
|
||
|
* @param listener on which to receive updates about the model download request.
|
||
|
*/
|
||
|
public void triggerModelDownload(
|
||
|
@NonNull Intent recognizerIntent,
|
||
|
@NonNull @CallbackExecutor Executor executor,
|
||
|
@NonNull ModelDownloadListener listener) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a temporary component to power on-device speech recognizer.
|
||
|
*
|
||
|
* <p>This is only expected to be called in tests, system would reject calls from client apps.
|
||
|
*
|
||
|
* @param componentName name of the component to set temporary replace speech recognizer. {@code
|
||
|
* null} value resets the recognizer to default.
|
||
|
* @hide
|
||
|
*/
|
||
|
@TestApi
|
||
|
@RequiresPermission(Manifest.permission.MANAGE_SPEECH_RECOGNITION)
|
||
|
public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Destroys the {@code SpeechRecognizer} object.
|
||
|
*/
|
||
|
public void destroy() {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
}
|