12

我正在使用用于语音的android.speech.SpeechRecognizer API。Android语音识别API在Android 7中不起作用牛轧糖

我工作在Android的4-5大,

在Android中6,现在有一堆虫子,像麦克风开启检测到语音时出现磬,所以它的存在(和循环无限期当它重新启动是因为语音被检测到,我们有一个黑客的解决方法,这将音量设置为0之前铃声播放...)

在Android 6的演讲也死了没有任何错误或任何事情后5秒。 我们有另一个黑客解决方法为此,检测5秒钟没有活动,并重新启动它...

现在在Android 7中,语音识别似乎不工作? 我还没有能够调试到目前为止,但任何人都有问题让语音API在Android 7中工作?另外,如果有人知道为什么Android似乎在语音API的每个版本中添加新bug并且未修复它们,请回复。 这是应该在Android中支持的东西,还是他们希望您使用Google intent?

+1

是U使用的是什么设备?许多nugat设备不支持一些64位应用程序,即使他们说他们这样做。尝试用32bit构建它。我有类似的问题,并通过这种方式解决它。 –

+1

API约2年没有变化(请参阅https://android.googlesource.com/platform/frameworks/base/+log/refs/heads/master/core/java/android/speech)。你正在描述这个API的实现中的一个问题,但是你没有提及它的实现(名称,版本号等)。Android本身不包含语音识别器实现,尽管许多手机都预先安装了谷歌的实现。 – Kaarel

+1

三星G7与Android 7,语音不起作用 – James

回答

4

我的代码工作正常上Nexus5x(牛轧糖)和Nexus9(牛轧糖)

尝试和表演的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); 
    } 
} 

权限清单(也许冗余):

<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" />