rittenhk
rittenhk

Reputation: 71

Adding Android Voice Recognition to an existing App

I have a working application that I would like to add voice commands. The current application transmits data back and forth over bluetooth on a periodic (timer) basis. The user can press Buttons and NumberPickers to modify the data being sent over bluetooth. There is also data received from the bluetooth link, and displayed in textViews. This application is currently working correctly.

What I would like to do is add voice command capability, so that the user has either the choice of pressing the Buttons/NumberPickers, or can change the values with only voice commands.

I have tested some of the Speech-to-Text examples that can be found on various websites. I have succesfully tested an App that uses RecognizerIntent. Upon a button press, a dialog pops up and you can speak words or phrases, and it correctly displays the result on the screen.

So, I think that I am close, but I'm not really sure how I can combine the Speech-to-Text with my current Bluetooth App. I don't want the user to have to press a button, I just want the App to be constantly listening. Also, I don't want the pop-up Voice Dialog on the screen.

My hardware is a Samsung tablet running Android 4.1.

I am relatively new to Android programming, so any advice (no matter how basic) is appreciated. Thanks.

Upvotes: 2

Views: 1172

Answers (1)

Nana Ghartey
Nana Ghartey

Reputation: 7927

To prevent the pop-up Voice Dialog on the screen, you can use the ACTION_RECOGNIZE_SPEECH intent:

private static int SR_CODE = 123;


/**
     * Initializes the speech recognizer and starts listening to the user input
     */
    private void listen()  {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        //Specify language
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH)
        // Specify language model
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        // Specify how many results to receive
        intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
        // Start listening
        startActivityForResult(intent, SR_CODE);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SR_CODE && resultCode == RESULT_OK)  {
                if(data!=null) {
                //Retrieves the best list SR result
                ArrayList<String> nBestList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
               String bestResult = nBestList.get(0);
               Toast.makeText(getApplicationContext(), bestResult, Toast.LENGTH_LONG).show;              
            }else {         
                //Reports error in recognition error in log
                Log.e(LOGTAG, "Recognition was not successful");
            }

    }

Concerning the other issue, " I don't want the user to have to press a button, I just want the App to be constantly listening":

I'll recommend using CMUSphinx to recognize speech continuously. To achieve continuous speech recognition using google speech recognition api, you might have to resort to a loop in a background service which will take too much resources and drains the device battery.

On the other hand, Pocketsphinx works really great. It's fast enough to spot a key phrase and recognize voice commands behind the lock screen without users touching their device. And it does all this offline. You can try the demo.

If you really want to use google's api as I've demonstrated above, see this

Upvotes: 1

Related Questions