SpeechRecognizer:未选择语音识别服务
SpeechRecognizer: no selected voice recognition service
这就是我启动 RecogniseListener 意图的方式:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra("android.speech.extra.DICTATION_MODE", true);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);
sr.startListening(intent);
但是,我遇到了一个奇怪的行为。它适用于某些手机(三星 galaxy S5,在这种情况下),但我在 Lenovo K50-T5 上收到以下错误:
E/SpeechRecognizer: no selected voice recognition service
这是我的 AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lips.deafcommunication.deaflips">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppThemeNoBar">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ChatInProgressActivity" android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"
android:configChanges="keyboardHidden|orientation|screenSize"
></activity>
</application>
</manifest>
这意味着用户根本没有安装语音识别器,或者没有配置 运行。您无能为力,用户必须安装一个。
在我的例子中,如果 he/she 默认情况下未选择语音识别服务,则用户设备会出现此警告案例 这是设置照片 解决此问题,您在照片中看到默认没有选择服务,
i 通过显式添加 GoogleRecognitionService
到我的 SpeechRecognizer
来解决这个问题,最后我的代码看起来像这样
this.speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getActivity(), ComponentName.unflattenFromString("com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService"));
因此您的代码看起来像是在使用默认语音意图,在这里创建您自己的自定义识别侦听器是 link 到 How can I use speech recognition without the annoying dialog in android phones
注意:确保您已安装 Google app
该错误表明没有可用的语音识别服务。您应该在调用 SpeechRecognizer.createSpeechRecognizer.
之前测试此条件
import android.speech;
if(SpeechRecognizer.isRecognitionAvailable(this)) {
SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this);
} else {
// SOME SORT OF ERROR
}
要使 fool-proof,您可以添加以下检查,以 pre-empt startVoiceRecognition()
上日志中的不同错误
private static final String GOOGLE_RECOGNITION_SERVICE_NAME = "com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService"
public static boolean isSpeechRecognizerAvailable() {
if (sIsSpeechRecognizerAvailable == null) {
boolean isRecognitionAvailable = context != null && context.getPackageManager() != null
&& SpeechRecognizer.isRecognitionAvailable(context);
if (isRecognitionAvailable) {
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE);
ComponentName recognizerServiceComponent = ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME);
if (recognizerServiceComponent == null) {
return false;
}
serviceIntent.setComponent(recognizerServiceComponent);
boolean isServiceAvailableToBind = context.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
if (isServiceAvailableToBind) {
context.unbindService(connection);
}
sIsSpeechRecognizerAvailable = isServiceAvailableToBind;
} else {
sIsSpeechRecognizerAvailable = false;
}
}
return sIsSpeechRecognizerAvailable;
}
然后使用相同的组件名称初始化语音识别器
this.speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context, ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME));
这就是我启动 RecogniseListener 意图的方式:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra("android.speech.extra.DICTATION_MODE", true);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);
sr.startListening(intent);
但是,我遇到了一个奇怪的行为。它适用于某些手机(三星 galaxy S5,在这种情况下),但我在 Lenovo K50-T5 上收到以下错误:
E/SpeechRecognizer: no selected voice recognition service
这是我的 AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lips.deafcommunication.deaflips">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppThemeNoBar">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ChatInProgressActivity" android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"
android:configChanges="keyboardHidden|orientation|screenSize"
></activity>
</application>
</manifest>
这意味着用户根本没有安装语音识别器,或者没有配置 运行。您无能为力,用户必须安装一个。
在我的例子中,如果 he/she 默认情况下未选择语音识别服务,则用户设备会出现此警告案例 这是设置照片 解决此问题,您在照片中看到默认没有选择服务,
i 通过显式添加 GoogleRecognitionService
到我的 SpeechRecognizer
来解决这个问题,最后我的代码看起来像这样
this.speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getActivity(), ComponentName.unflattenFromString("com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService"));
因此您的代码看起来像是在使用默认语音意图,在这里创建您自己的自定义识别侦听器是 link 到 How can I use speech recognition without the annoying dialog in android phones
注意:确保您已安装 Google app
该错误表明没有可用的语音识别服务。您应该在调用 SpeechRecognizer.createSpeechRecognizer.
之前测试此条件import android.speech;
if(SpeechRecognizer.isRecognitionAvailable(this)) {
SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this);
} else {
// SOME SORT OF ERROR
}
要使 startVoiceRecognition()
private static final String GOOGLE_RECOGNITION_SERVICE_NAME = "com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService"
public static boolean isSpeechRecognizerAvailable() {
if (sIsSpeechRecognizerAvailable == null) {
boolean isRecognitionAvailable = context != null && context.getPackageManager() != null
&& SpeechRecognizer.isRecognitionAvailable(context);
if (isRecognitionAvailable) {
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE);
ComponentName recognizerServiceComponent = ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME);
if (recognizerServiceComponent == null) {
return false;
}
serviceIntent.setComponent(recognizerServiceComponent);
boolean isServiceAvailableToBind = context.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
if (isServiceAvailableToBind) {
context.unbindService(connection);
}
sIsSpeechRecognizerAvailable = isServiceAvailableToBind;
} else {
sIsSpeechRecognizerAvailable = false;
}
}
return sIsSpeechRecognizerAvailable;
}
然后使用相同的组件名称初始化语音识别器
this.speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context, ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME));