0

I am trying to create a Text to Speech app that will remember the last sentence or part of the sentence after a comma where it was when the app is paused. Below is my code.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    pitch = (EditText) findViewById(R.id.pitch);
    words = (EditText) findViewById(R.id.wordsToSpeak);
    words.setText("This message is intended only for the use of the individual or entity to which it is addressed and may contain information that is privileged, confidential or exempt from disclosure by law.");
    speakBtn = (Button) findViewById(R.id.speak);

    // Check to be sure that TTS exists and is okay to use
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQ_TTS_STATUS_CHECK) {
        switch (resultCode) {
        case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
            // TTS is up and running
            mTts = new TextToSpeech(this, this);
            Log.v(TAG, "Pico is installed okay");
            break;
        case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
        case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
        case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
            // missing data, install it
            Log.v(TAG, "Need language stuff: " + resultCode);
            Intent installIntent = new Intent();
            installIntent
                    .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
            break;
        case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
        default:
            Log.e(TAG, "Got a failure. TTS apparently not available");
        }
    } else {
        // Got something else
    }
}

@Override
public void onInit(int status) {
    // Now that the TTS engine is ready, we enable the button
    if (status == TextToSpeech.SUCCESS) {
        speakBtn.setEnabled(true);
        mTts.setOnUtteranceCompletedListener(this);

    }
}

public void doSpeak(View view) {
    mTts.setPitch(new Float(pitch.getText().toString()));

    StringTokenizer st = new StringTokenizer(words.getText().toString(),
            ",.");

    while (st.hasMoreTokens()) {

        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
                String.valueOf(uttCount++));
        mTts.speak(st.nextToken(), TextToSpeech.QUEUE_ADD, params);
    }

    // mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
};

@Override
public void onPause() {
    super.onPause();
    // if we're losing focus, stop talking
    if (mTts != null)
        mTts.stop();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mTts.shutdown();
}

@Override
public void onUtteranceCompleted(String utteranceId) {
    Log.v(TAG, "Got completed message for uttId: " + utteranceId);
    lastUtterance = Integer.parseInt(utteranceId);

}

}

I am able to get get the android to speak and keep track of the token that it last spoke. However, I am not sure how to resume where it last left off when you press the speakBtn. Is there anyway to go back to a certain token within a tokenizer if all the tokens were not successfully read out loud?

ControlAltDelete
  • 3,576
  • 5
  • 32
  • 50

1 Answers1

0

How about:

for(int i=0; i<successfulUtterances; ++i)
  tokenizer.nextToken();
String nextUnspokenUtterance = tokenizer.nextToken();

If you're asking whether there's a direct way, there isn't. But this way will get rid of all the tokens you don't need and let you carry on.

hcarver
  • 7,126
  • 4
  • 41
  • 67