I have had bad luck using tts.setLanguage(Locale.US). Here's the code I use instead:
if (mSpeaker.isLanguageAvailable(Locale.UK) == TextToSpeech.LANG_AVAILABLE) {
Log.i(TAG, "Whee! We have UK English");
mSpeaker.setLanguage(Locale.UK);
} else if (mSpeaker.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE) {
Log.i(TAG, "We have US English");
mSpeaker.setLanguage(Locale.US);
} else {
Log.i(TAG, "Using Speech engine default Locale");
}
When this code runs on my Samsung S4 phone, it uses the default locale instead of Locale.UK or Locale.US.
Try removing the tts.setLanguage(Locale.US) and the tests for result.
Another possibility is that tts.speak() must be called from the UI thread (I'm just guessing that - I don't know for sure). I've noticed many Android APIs don't specify what calls must be made from the UI thread. You might try the following code instead of the call to speakOut():
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
speakOut();
}
});