Jam*_*mes 12 java android speech-recognition speech-to-text android-7.0-nougat
我正在使用android.speech.SpeechRecognizer API进行语音处理.
我在Android 4-5中工作得很好,
在Android 6中它现在有一堆错误,比如当麦克风打开时发生的响铃被检测为语音,所以它存在(并且当它重新启动时无限循环,因为检测到语音,我们有一个黑客解决方法,为此在播放铃声之前将音量设置为0 ...)
在Android 6中,演讲也会在5秒后死亡,没有任何错误或任何错误.我们有另一个黑客解决方法,它可以检测到没有活动5秒并重新启动它...
现在在Android 7中,语音识别似乎根本不起作用?我还没有能够调试为什么,但有没有人在Android 7中使用语音API的问题?
此外,如果有人知道为什么Android似乎在每个版本的语音API中添加新的错误而不修复它们,请回复.这是Android应该支持的内容,还是他们希望您使用Google意图?
我的代码在 Nexus5x(Nougat) 和 Nexus9(Nougat) 上运行良好
尝试显示 logcat。
SpeechRecognizer mGoogleSr;
void initGoogleSr(Context context) {
mGoogleSr = SpeechRecognizer.createSpeechRecognizer(context);
mGoogleSr.setRecognitionListener(new GoogleSrListener());
}
void startGoogleSr() {
if (mGoogleSr != null) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
mGoogleSr.startListening(intent);
}
}
void cancelRecognizing() {
if (mGoogleSr != null) {
mGoogleSr.cancel();
}
}
public class GoogleSrListener implements RecognitionListener {
String lastPartialText;
@Override
public void onReadyForSpeech(Bundle params) {
Log.v(TAG, ">>> onReadyForSpeech");
showMessage("ready");
}
@Override
public void onBeginningOfSpeech() {
Log.v(TAG, ">>> onBeginningOfSpeech");
showMessage("recognizing");
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
Log.v(TAG, ">>> onEndOfSpeech");
showMessage("waiting result");
}
@Override
public void onError(int error) {
Log.v(TAG, ">>> onError : " + error);
switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
Log.e(TAG, "ERROR_AUDIO");
break;
case SpeechRecognizer.ERROR_CLIENT:
Log.e(TAG, "ERROR_CLIENT");
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
Log.e(TAG, "ERROR_INSUFFICIENT_PERMISSIONS");
break;
case SpeechRecognizer.ERROR_NETWORK:
Log.e(TAG, "ERROR_NETWORK");
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
Log.e(TAG, "ERROR_NETWORK_TIMEOUT");
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
Log.e(TAG, "ERROR_RECOGNIZER_BUSY");
break;
case SpeechRecognizer.ERROR_SERVER:
Log.e(TAG, "ERROR_SERVER");
break;
case SpeechRecognizer.ERROR_NO_MATCH:
Log.v(TAG, "ERROR_NO_MATCH");
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
Log.v(TAG, "ERROR_SPEECH_TIMEOUT");
break;
default:
Log.v(TAG, "ERROR_UNKOWN");
}
}
@Override
public void onPartialResults(Bundle partialResults) {
Log.v(TAG, ">>> onPartialResults");
List<String> resultList = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (resultList != null) {
String text = resultList.get(0);
if (text.equals(lastPartialText)) {
return;
}
lastPartialText = text;
Log.v(TAG, "partial : " + text);
}
}
@Override
public void onResults(Bundle results) {
Log.v(TAG, ">>> onResults");
List<String> resultList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (resultList != null) {
String text = resultList.get(0);
Log.v(TAG, "result : " + text);
showMessage(text);
}
}
@Override
public void onEvent(int eventType, Bundle params) {
Log.v(TAG, ">>> onEvent type = " + eventType);
}
}
Run Code Online (Sandbox Code Playgroud)
清单中的权限(可能是多余的):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2038 次 |
最近记录: |