持续的声音聆听触发“助手”

时间:2020-01-03 12:04:18

标签: java android

我正在开发一个Android应用程序,其中可以通过语音控制设置一些内容,但是我想使用连续的语音监听器使其触发助手,因此无需按下按钮即可开始监听,但我不知道该怎么做。这部分与按钮按下完美配合。我的代码适用于侦听器:

private void initializeSpeechRecognizer() {
    if (SpeechRecognizer.isRecognitionAvailable(this)) {
        speechRecog = SpeechRecognizer.createSpeechRecognizer(this);
        speechRecog.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onReadyForSpeech(Bundle params) {

            }

            @Override
            public void onBeginningOfSpeech() {

            }

            @Override
            public void onRmsChanged(float rmsdB) {

            }

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

            }

            @Override
            public void onEndOfSpeech() {

            }

            @Override
            public void onError(int error) {

            }

            @Override
            public void onResults(Bundle results) {
                List<String> result_arr =    
results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                try {
                    processResult(result_arr.get(0));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onPartialResults(Bundle partialResults) {

            }

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

            }
        });
    }
}

private int getSetFlow(String voiceStr) {
    int i = 0, value = -33133;
    Boolean isNumberStart = false, isNegative = false;
    int cValue;

    if (voiceStr.contains( "set 2 " ))
        i = 6;
    for (; i < voiceStr.length(); i++) {
        if (voiceStr.charAt( i ) >= '0' && voiceStr.charAt( i ) <= '9') {
            if (isNumberStart == false)
                value = 0;
            if (i > 2)
                if (voiceStr.charAt( i - 2 ) == '-')
                    isNegative = true;
            cValue = voiceStr.charAt( i );
            isNumberStart = true;
            value = value * 10 + cValue - 48;
        } else if (value != -33133)
            break;
    }
    return isNumberStart ? (isNegative ? -value : value) : -33133;
}

private int setValue;

private void processResult(String result_message) throws IOException {
    result_message = result_message.toLowerCase();


    if (result_message.contains( "start" )) {
        speak( "Measurement started" );
        if (BTinit()) {
            if (BTconnect()) {
                setUiEnabled( true );
                deviceConnected = true;
                beginListenForData();
                //textView.append("\nConnection Opened!\n");
                textView.setText( "\nConnection Opened!\n" );

                sendTimerIsRunning = true;
                tmrSendData = new Timer();
                tmrSendData.schedule( new SendTask(), 250 );

                FrameLayout framespinner = findViewById( R.id.framespinner );
                framespinner.setVisibility( View.INVISIBLE );


            }
        }
    } else if (result_message.contains( "stop" )) {
        speak( "Measurement stopped" );

        stopThread = true;
        outputStream.close();
        inputStream.close();
        socket.close();
        setUiEnabled( false );
        deviceConnected = false;
        //textView.append("Connection Closed!\n");
        textView.setText( "Connection Closed!\n" );
        sendTimerIsRunning = false;

        FrameLayout framespinner = findViewById( R.id.framespinner );
        framespinner.setVisibility( View.VISIBLE );

    } else if (result_message.contains( "clear" )) {
        speak( "Measurement data cleared" );

        textView.setText( "" );

        cntLines = 0;

        //lastX = 0;

        if (series != null) {
            series.resetData( new DataPoint[]{new DataPoint( lastX, flow )} );
        }
        if (series2 != null) {
            series2.resetData( new DataPoint[]{new DataPoint( lastX, temp )} );
        }
        if (series3 != null) {
            series3.resetData( new DataPoint[]{new DataPoint( lastX, press )} );
        }

    } else if (result_message.contains( "set" )) {
        setValue = getSetFlow(result_message);
        if(setValue != -33133) {
            if(setValue<0)
                speak( "Negative values not supported" );
            else
            speak( "Flow set to" + setValue );

        }
        seekBar1.setProgress( Integer.parseInt( String.valueOf( setValue ) ) );
        setFlow.setText( String.valueOf( seekBar1.getProgress() ) );
    }

    else if (result_message.contains( "exit" )) {
        speak( "Exited" );
        Intent a = new Intent(Intent.ACTION_MAIN);
        a.addCategory(Intent.CATEGORY_HOME);
        a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(a);
    }
}

private void initializeTextToSpeech() {
    tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (tts.getEngines().size() == 0 ){
                Toast.makeText(HomeActivity.this, 
getString(R.string.tts_no_engines),Toast.LENGTH_LONG).show();
                finish();
            } else {
                tts.setLanguage( Locale.getDefault());
            }
        }
    });
}

private void speak(String message) {
    if(Build.VERSION.SDK_INT >= 21){
        tts.speak(message,TextToSpeech.QUEUE_FLUSH,null,null);
    } else {
        tts.speak(message, TextToSpeech.QUEUE_FLUSH,null);
    }
}

0 个答案:

没有答案