Android 使用更多电池在后台收听语音API

Android 使用更多电池在后台收听语音API,android,background,listener,speech-recognition,voice-recognition,Android,Background,Listener,Speech Recognition,Voice Recognition,我正在用android开发一个应用程序,它可以在后台一直听声音。我正在使用SpeechRecognitor脱机api。请任何人告诉我最好的选择。我的代码是: public void raise() { try { handler.post(new Runnable() { @Override public void run() { offSound(); s

我正在用android开发一个应用程序,它可以在后台一直听声音。我正在使用SpeechRecognitor脱机api。请任何人告诉我最好的选择。我的代码是:

 public void raise() {
    try {
        handler.post(new Runnable() {

            @Override
            public void run() {
                offSound();
                speech = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
                listener = new MyRecognitionListener();
                speech.setRecognitionListener(listener);
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, SharedPreferenceWriter.getInstance(getApplicationContext()).getString(SPreferenceKey.SELECTED_LANGUAGE));
                intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getApplication().getPackageName());

                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 1000);
                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 1000);
                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 1000);

                intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE, true);
enter code here
                speech.startListening(intent);

                /*
                 * if (countPrintLog++ > 150) { countPrintLog = 0;
                 * LogManager
                 * .getInstance().writeToLog(LogManager.LOG_STORAGE_FILE,
                 * "Speech Recogniser is working"); }
                 */
                Log.i("", "Calling the Recognise");

            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

class MyRecognitionListener implements RecognitionListener {

    @Override
    public void onBeginningOfSpeech() {
    }

    @Override
    public void onBufferReceived(byte[] buffer) {
    }

    @Override
    public void onEndOfSpeech() {
    }

    @Override
    public void onError(int error) {
        onSound();
        Log.i("", "onError");
        isCriticalSectionRaise = false;
    }

    @Override
    public void onEvent(int eventType, Bundle params) {
    }

    @Override
    public void onPartialResults(Bundle partialResults) {
    }

    @Override
    public void onReadyForSpeech(Bundle params) {
    }
    @Override
    public void onResults(Bundle results) {



    }

    @Override
    public void onRmsChanged(float rmsdB) {

    }

} 

这会消耗大量电池资源并加热设备。我正在寻找一个更好的选择

大词汇量语音识别需要相当多的资源,您需要使用特殊的解决方案来持续收听

如果您感兴趣,可以看看Android上的CMUSphinx


上面的演示可以有效地监听关键字“oh mighty computer”,您可以配置关键字和检测阈值。在我们的实验中,听力比屏幕占用更少的资源,电池也可以轻松使用一整天。

摩托罗拉“X”手机(Droid Ultra、Moto X、Droid MAXX)有一个专用的语音识别芯片,该芯片始终处于开启状态,并且能够正常工作。然而,仅仅是凡人无法使用它,而且可能只有有限的短语识别能力。我不认为你能以任何其他方式做你想做的事情——除非你找到一种方法让SR关闭,直到其他传感器输入(即光传感器)告诉你打开它。我们需要为摩托罗拉“X”手机(Droid Ultra、Moto X、Droid MAXX)编写一些特定的代码吗对于语音识别或相同的代码将是可行的。我不相信应用程序开发人员可以访问Moto X硬件。感谢Nikolay Shmyrev提供这个漂亮的解决方案。我们可以使用这个api设置一个特定的单词吗?这样当用户标记这个特定的单词时。。。应用程序将播放音乐。是的,您可以配置任意关键字。为了获得最佳的检测精度,关键字应该有4-5个音节。你可以在这里看到简短的代码示例:非常感谢,现在它在onResult中给了我正确的答案。但如果我在KEYPHASE中设置hello并尝试说Lock或其他单词,但它总是给我结果“hello”,则需要调整阈值以避免错误检测(参见链接)。Hello太短了,你需要更长的短语,比如“Hello Conrad”。