【问题标题】:SpeechRecognizer does nothing...what am I missingSpeechRecognizer 什么都不做......我错过了什么
【发布时间】:2017-10-31 01:53:28
【问题描述】:

请看下面的代码。 onBeginningOfSpeech() 被调用(甚至在我开始说话之前,顺便说一句),但随后 - 没有。我错过了什么?

我承认代码主要由不同的示例组成,我并不完全理解。但我希望它至少能做一些事情,这样我就可以继续试验。任何帮助表示赞赏。

public class SpeechRecogActivity extends Activity {
private SpeechRecognizer recog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("TTS_SpeechRecog", "Starting...");
        recog = SpeechRecognizer.createSpeechRecognizer(this);
        recog.setRecognitionListener(new RecogListener());
        Intent intent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext());
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "cmn-Hans-CN");
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "cmn-Hans-CN");
        intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE, "cmn-Hans-CN");
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy");
        intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
        recog.startListening(intent);
    }

    private static class RecogListener implements RecognitionListener {
        @Override
        public void onBeginningOfSpeech() {
            Log.e("TTS_SpeechRecog", "onBeginningOfSpeech...");
        }

        @Override
        public void onRmsChanged(float rmsdB) {
            Log.e("TTS_SpeechRecog", "onRmsChanged...");
        }

        @Override
        public void onEndOfSpeech() {
            Log.e("TTS_SpeechRecog", "onEndOfSpeech...");
        }

        @Override
        public void onReadyForSpeech(Bundle params) {
            Log.e("TTS_SpeechRecog", "onReadyForSpeech...");
        }

        @Override
        public void onResults(Bundle data) {
            Log.e("TTS_SpeechRecog", "onResults...");
            ArrayList strlist = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            for (int i = 0; i < strlist.size();i++ ) {
                Log.d("Speech", "result=" + strlist.get(i));
            }
        }

        @Override
        public void onPartialResults(Bundle partialResults) {
            Log.e("TTS_SpeechRecog", "onPartialResults...");
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            Log.e("TTS_SpeechRecog", "onEvent...");
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            Log.e("TTS_SpeechRecog", "onBufferReceived...");
        }

        @Override
        public void onError(int error) {
            Log.e("TTS_SpeechRecog", "onBeginningOfSpeech...");
        }
    }
}

【问题讨论】:

    标签: java android speech-recognition


    【解决方案1】:

    也许您忘记添加权限。

    android.permission.RECORD_AUDIO

    在 API 23 之前你可以添加:

    &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;

    API 23 之后使用运行时权限。

    【讨论】:

    • 添加“”确实成功了!
    • 但是,非常奇怪的是,带有“RecognizerIntent.ACTION_RECOGNIZE_SPEECH”的“startActivityForResult()”在没有这样的权限的情况下确实可以工作!知道为什么吗?
    【解决方案2】:

    您必须在单击任何按钮或小部件后启动 SpeechRecognizer。

    我建议你使用下面的 github 存储库。

    https://github.com/gotev/android-speech

    还要确保您在清单中添加了权限,例如:

      <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

    【讨论】:

    • 嗯......实际上,这正是正在发生的事情 - 用户点击一个按钮(在不同的 Activity 中),然后这个 Activity 被调用......这还不够吗?
    • 是的,它会在您单击按钮时调用。这是默认行为。
    • 正如我刚才所说...一个按钮正在被点击。但它不起作用。
    • 您的意思是它无法识别您的声音吗?还要确保您的互联网已开启
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2021-04-19
    • 2017-03-13
    相关资源
    最近更新 更多